From 8b50340102b1f26ca78cfa53c6ca6fc20c5d6aa4 Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Tue, 27 Aug 2024 12:58:04 +0000 Subject: [PATCH] build based on 655bee5 --- dev/.documenter-siteinfo.json | 2 +- dev/API/regularization/index.html | 6 +- dev/API/solvers/index.html | 20 ++--- .../examples/compressed_sensing/25bc3631.png | Bin 0 -> 33673 bytes .../examples/compressed_sensing/3073c051.png | Bin 62522 -> 0 bytes .../examples/compressed_sensing/6384fc55.png | Bin 0 -> 63894 bytes .../examples/compressed_sensing/a03acae3.png | Bin 33565 -> 0 bytes .../examples/compressed_sensing/index.html | 70 ++++++++--------- .../examples/computed_tomography/index.html | 2 +- .../examples/getting_started/index.html | 2 +- .../explanations/regularization/index.html | 2 +- dev/generated/howto/callbacks/1dcf3132.png | Bin 179641 -> 0 bytes dev/generated/howto/callbacks/4a366e8a.png | Bin 0 -> 180800 bytes dev/generated/howto/callbacks/index.html | 40 +++++----- .../howto/efficient_kaczmarz/index.html | 66 ++++++++-------- .../howto/gpu_acceleration/1ddde821.png | Bin 0 -> 15577 bytes .../howto/gpu_acceleration/c54799e4.png | Bin 15866 -> 0 bytes .../howto/gpu_acceleration/index.html | 74 +++++++++--------- .../howto/multi_threading/index.html | 4 +- .../howto/normal_operator/index.html | 64 +++++++-------- dev/generated/howto/plug-and-play/index.html | 32 ++++---- dev/generated/howto/weighting/index.html | 2 +- dev/index.html | 2 +- dev/search_index.js | 2 +- dev/solvers/index.html | 6 +- 25 files changed, 198 insertions(+), 198 deletions(-) create mode 100644 dev/generated/examples/compressed_sensing/25bc3631.png delete mode 100644 dev/generated/examples/compressed_sensing/3073c051.png create mode 100644 dev/generated/examples/compressed_sensing/6384fc55.png delete mode 100644 dev/generated/examples/compressed_sensing/a03acae3.png delete mode 100644 dev/generated/howto/callbacks/1dcf3132.png create mode 100644 dev/generated/howto/callbacks/4a366e8a.png create mode 100644 dev/generated/howto/gpu_acceleration/1ddde821.png delete mode 100644 dev/generated/howto/gpu_acceleration/c54799e4.png diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json index ef7e6c1..d820a68 100644 --- a/dev/.documenter-siteinfo.json +++ b/dev/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.10.4","generation_timestamp":"2024-08-23T09:35:44","documenter_version":"1.6.0"}} \ No newline at end of file +{"documenter":{"julia_version":"1.10.4","generation_timestamp":"2024-08-27T12:58:00","documenter_version":"1.6.0"}} \ No newline at end of file diff --git a/dev/API/regularization/index.html b/dev/API/regularization/index.html index da02b3d..f4844b3 100644 --- a/dev/API/regularization/index.html +++ b/dev/API/regularization/index.html @@ -1,5 +1,5 @@ -Regularization Terms · RegularizedLeastSquares.jl

API for Regularizers

This page contains documentation of the public API of the RegularizedLeastSquares. In the Julia REPL one can access this documentation by entering the help mode with ?

RegularizedLeastSquares.L21RegularizationType
L21Regularization

Regularization term implementing the proximal map for group-soft-thresholding.

Arguments

  • λ - regularization paramter

Keywords

  • slices=1 - number of elements per group
source
RegularizedLeastSquares.LLRRegularizationType
LLRRegularization

Regularization term implementing the proximal map for locally low rank (LLR) regularization using singular-value-thresholding.

Arguments

  • λ - regularization paramter

Keywords

  • shape::Tuple{Int} - dimensions of the image
  • blockSize::Tuple{Int}=(2,2) - size of patches to perform singular value thresholding on
  • randshift::Bool=true - randomly shifts the patches to ensure translation invariance
  • fullyOverlapping::Bool=false - choose between fully overlapping block or non-overlapping blocks
source
RegularizedLeastSquares.NuclearRegularizationType
NuclearRegularization

Regularization term implementing the proximal map for singular value soft-thresholding.

Arguments:

  • λ - regularization paramter

Keywords

  • svtShape::NTuple - size of the underlying matrix
source
RegularizedLeastSquares.TVRegularizationType
TVRegularization

Regularization term implementing the proximal map for TV regularization. Calculated with the Condat algorithm if the TV is calculated only along one real-valued dimension and with the Fast Gradient Projection algorithm otherwise.

Reference for the Condat algorithm: https://lcondat.github.io/publis/Condat-fast_TV-SPL-2013.pdf

Reference for the FGP algorithm: A. Beck and T. Teboulle, "Fast Gradient-Based Algorithms for Constrained Total Variation Image Denoising and Deblurring Problems", IEEE Trans. Image Process. 18(11), 2009

Arguments

  • λ::T - regularization parameter

Keywords

  • shape::NTuple - size of the underlying image
  • dims - Dimension to perform the TV along. If Integer, the Condat algorithm is called, and the FDG algorithm otherwise.
  • iterationsTV=20 - number of FGP iterations
source

Projection Regularization

Nested Regularization

RegularizedLeastSquares.innerregMethod
innerreg(reg::AbstractNestedRegularization)

return the inner regularization term of reg. Nested regularization terms also implement the iteration interface.

source

Scaled Regularization

Misc. Nested Regularization

RegularizedLeastSquares.MaskedRegularizationType
MaskedRegularization

Nested regularization term that only applies prox! and norm to elements of x for which the mask is true.

Examples

julia> positive = PositiveRegularization();
+Regularization Terms · RegularizedLeastSquares.jl

API for Regularizers

This page contains documentation of the public API of the RegularizedLeastSquares. In the Julia REPL one can access this documentation by entering the help mode with ?

RegularizedLeastSquares.L21RegularizationType
L21Regularization

Regularization term implementing the proximal map for group-soft-thresholding.

Arguments

  • λ - regularization paramter

Keywords

  • slices=1 - number of elements per group
source
RegularizedLeastSquares.LLRRegularizationType
LLRRegularization

Regularization term implementing the proximal map for locally low rank (LLR) regularization using singular-value-thresholding.

Arguments

  • λ - regularization paramter

Keywords

  • shape::Tuple{Int} - dimensions of the image
  • blockSize::Tuple{Int}=(2,2) - size of patches to perform singular value thresholding on
  • randshift::Bool=true - randomly shifts the patches to ensure translation invariance
  • fullyOverlapping::Bool=false - choose between fully overlapping block or non-overlapping blocks
source
RegularizedLeastSquares.NuclearRegularizationType
NuclearRegularization

Regularization term implementing the proximal map for singular value soft-thresholding.

Arguments:

  • λ - regularization paramter

Keywords

  • svtShape::NTuple - size of the underlying matrix
source
RegularizedLeastSquares.TVRegularizationType
TVRegularization

Regularization term implementing the proximal map for TV regularization. Calculated with the Condat algorithm if the TV is calculated only along one real-valued dimension and with the Fast Gradient Projection algorithm otherwise.

Reference for the Condat algorithm: https://lcondat.github.io/publis/Condat-fast_TV-SPL-2013.pdf

Reference for the FGP algorithm: A. Beck and T. Teboulle, "Fast Gradient-Based Algorithms for Constrained Total Variation Image Denoising and Deblurring Problems", IEEE Trans. Image Process. 18(11), 2009

Arguments

  • λ::T - regularization parameter

Keywords

  • shape::NTuple - size of the underlying image
  • dims - Dimension to perform the TV along. If Integer, the Condat algorithm is called, and the FDG algorithm otherwise.
  • iterationsTV=20 - number of FGP iterations
source

Projection Regularization

Nested Regularization

RegularizedLeastSquares.innerregMethod
innerreg(reg::AbstractNestedRegularization)

return the inner regularization term of reg. Nested regularization terms also implement the iteration interface.

source

Scaled Regularization

Misc. Nested Regularization

RegularizedLeastSquares.MaskedRegularizationType
MaskedRegularization

Nested regularization term that only applies prox! and norm to elements of x for which the mask is true.

Examples

julia> positive = PositiveRegularization();
 
 julia> masked = MaskedRegularization(reg, [true, false, true, false]);
 
@@ -8,11 +8,11 @@
   0.0
  -1.0
   0.0
- -1.0
source
RegularizedLeastSquares.TransformedRegularizationType
TransformedRegularization(reg, trafo)

Nested regularization term that applies prox! or norm on z = trafo * x and returns (inplace) x = adjoint(trafo) * z.

Example

julia> core = L1Regularization(0.8)
 L1Regularization{Float64}(0.8)
 
 julia> wop = WaveletOp(Float32, shape = (32,32));
 
 julia> reg = TransformedRegularization(core, wop);
 
-julia> prox!(reg, randn(32*32)); # Apply soft-thresholding in Wavelet domain
source
RegularizedLeastSquares.PlugAndPlayRegularizationType
    PlugAndPlayRegularization

Regularization term implementing a given plug-and-play proximal mapping. The actual regularization term is indirectly defined by the learned proximal mapping and as such there is no norm implemented.

Arguments

  • λ - regularization paramter

Keywords

  • model - model applied to the image
  • shape - dimensions of the image
  • input_transform - transform of image before model
source

Miscellaneous Functions

RegularizedLeastSquares.prox!Method
prox!(reg::AbstractParameterizedRegularization, x)

perform the proximal mapping defined by reg on x. Uses the regularization parameter defined for reg.

source
RegularizedLeastSquares.prox!Method
prox!(regType::Type{<:AbstractParameterizedRegularization}, x, λ; kwargs...)

construct a regularization term of type regType with given λ and kwargs and apply its prox! on x

source
LinearAlgebra.normMethod
norm(reg::AbstractParameterizedRegularization, x)

returns the value of the reg regularization term on x. Uses the regularization parameter defined for reg.

source
LinearAlgebra.normMethod
norm(regType::Type{<:AbstractParameterizedRegularization}, x, λ; kwargs...)

construct a regularization term of type regType with given λ and kwargs and apply its norm on x

source
+julia> prox!(reg, randn(32*32)); # Apply soft-thresholding in Wavelet domain
source
RegularizedLeastSquares.PlugAndPlayRegularizationType
    PlugAndPlayRegularization

Regularization term implementing a given plug-and-play proximal mapping. The actual regularization term is indirectly defined by the learned proximal mapping and as such there is no norm implemented.

Arguments

  • λ - regularization paramter

Keywords

  • model - model applied to the image
  • shape - dimensions of the image
  • input_transform - transform of image before model
source

Miscellaneous Functions

RegularizedLeastSquares.prox!Method
prox!(reg::AbstractParameterizedRegularization, x)

perform the proximal mapping defined by reg on x. Uses the regularization parameter defined for reg.

source
RegularizedLeastSquares.prox!Method
prox!(regType::Type{<:AbstractParameterizedRegularization}, x, λ; kwargs...)

construct a regularization term of type regType with given λ and kwargs and apply its prox! on x

source
LinearAlgebra.normMethod
norm(reg::AbstractParameterizedRegularization, x)

returns the value of the reg regularization term on x. Uses the regularization parameter defined for reg.

source
LinearAlgebra.normMethod
norm(regType::Type{<:AbstractParameterizedRegularization}, x, λ; kwargs...)

construct a regularization term of type regType with given λ and kwargs and apply its norm on x

source
diff --git a/dev/API/solvers/index.html b/dev/API/solvers/index.html index 521ad14..cb8615c 100644 --- a/dev/API/solvers/index.html +++ b/dev/API/solvers/index.html @@ -9,12 +9,12 @@ julia> b = A * x; -julia> S = ADMM(A); +julia> S = ADMM(A, reg = L1Regularization(0.0001)); julia> x_approx = solve!(S, b) 2-element Vector{Float64}: - 0.5932234523399984 - 0.26975343453400163

Here, we use L1Regularization, which is default for ADMM. All regularization options can be found in API for Regularizers.

The following example solves the same problem, but stores the solution x of each interation in tr:

julia> tr = Dict[]
+ 0.5932171509222105
+ 0.26971370566079866

Here, we use L1Regularization. All regularization options can be found in API for Regularizers.

The following example solves the same problem, but stores the solution x of each interation in tr:

julia> tr = Dict[]
 Dict[]
 
 julia> store_trace!(tr, solver, iteration) = push!(tr, Dict("iteration" => iteration, "x" => solver.x, "beta" => solver.β))
@@ -40,10 +40,10 @@
        end
 plot_trace (generic function with 1 method)
 
-julia> x_approx = solve!(S, b; callbacks = [conv, plot_trace]);

The keyword callbacks allows you to pass a (vector of) callable objects that takes the arguments solver and iteration and prints, stores, or plots intermediate result.

See also StoreSolutionCallback, StoreConvergenceCallback, CompareSolutionCallback for a number of provided callback options.

source
RegularizedLeastSquares.init!Method
init!(solver::AbstractLinearSolver, b; kwargs...)

Prepare the solver for iteration based on the given data vector b and kwargs.

source
RegularizedLeastSquares.init!Method
init!(solver::AbstractLinearSolver, state::AbstractSolverState, b::AbstractMatrix; scheduler = SequentialState, kwargs...)

Initialize the solver with each column of b and pass the corresponding states to the scheduler.

source

ADMM

RegularizedLeastSquares.ADMMType
ADMM(A; AHA = A'*A, precon = Identity(), reg = L1Regularization(zero(real(eltype(AHA)))), regTrafo = opEye(eltype(AHA), size(AHA,1)), normalizeReg = NoNormalization(), rho = 1e-1, vary_rho = :none, iterations = 10, iterationsCG = 10, absTol = eps(real(eltype(AHA))), relTol = eps(real(eltype(AHA))), tolInner = 1e-5, verbose = false)
-ADMM( ; AHA = ,     precon = Identity(), reg = L1Regularization(zero(real(eltype(AHA)))), regTrafo = opEye(eltype(AHA), size(AHA,1)), normalizeReg = NoNormalization(), rho = 1e-1, vary_rho = :none, iterations = 10, iterationsCG = 10, absTol = eps(real(eltype(AHA))), relTol = eps(real(eltype(AHA))), tolInner = 1e-5, verbose = false)

Creates an ADMM object for the forward operator A or normal operator AHA.

Required Arguments

  • A - forward operator

OR

  • AHA - normal operator (as a keyword argument)

Optional Keyword Arguments

  • AHA - normal operator is optional if A is supplied
  • precon - preconditionner for the internal CG algorithm
  • reg::AbstractParameterizedRegularization - regularization term; can also be a vector of regularization terms
  • regTrafo - transformation to a space in which reg is applied; if reg is a vector, regTrafo has to be a vector of the same length. Use opEye(eltype(AHA), size(AHA,1)) if no transformation is desired.
  • normalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()
  • rho::Real - penalty of the augmented Lagrangian
  • vary_rho::Symbol - vary rho to balance primal and dual feasibility; options :none, :balance, :PnP
  • iterations::Int - maximum number of (outer) ADMM iterations
  • iterationsCG::Int - maximum number of (inner) CG iterations
  • absTol::Real - absolute tolerance for stopping criterion
  • relTol::Real - relative tolerance for stopping criterion
  • tolInner::Real - relative tolerance for CG stopping criterion
  • verbose::Bool - print residual in each iteration

ADMM differs from ISTA-type algorithms in the sense that the proximal operation is applied separately from the transformation to the space in which the penalty is applied. This is reflected by the interface which has reg and regTrafo as separate arguments. E.g., for a TV penalty, you should NOT set reg=TVRegularization, but instead use reg=L1Regularization(λ), regTrafo=RegularizedLeastSquares.GradientOp(Float64; shape=(Nx,Ny,Nz)).

See also createLinearSolver, solve!.

source

CGNR

RegularizedLeastSquares.CGNRType
CGNR(A; AHA = A' * A, reg = L2Regularization(zero(real(eltype(AHA)))), normalizeReg = NoNormalization(), iterations = 10, relTol = eps(real(eltype(AHA))))
-CGNR( ; AHA = ,       reg = L2Regularization(zero(real(eltype(AHA)))), normalizeReg = NoNormalization(), iterations = 10, relTol = eps(real(eltype(AHA))))

creates an CGNR object for the forward operator A or normal operator AHA.

Required Arguments

  • A - forward operator

OR

  • AHA - normal operator (as a keyword argument)

Optional Keyword Arguments

  • AHA - normal operator is optional if A is supplied
  • reg::AbstractParameterizedRegularization - regularization term; can also be a vector of regularization terms
  • normalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()
  • iterations::Int - maximum number of iterations
  • relTol::Real - tolerance for stopping criterion

See also createLinearSolver, solve!.

source

Kaczmarz

RegularizedLeastSquares.KaczmarzType
Kaczmarz(A; reg = L2Regularization(0), normalizeReg = NoNormalization(), randomized=false, subMatrixFraction=0.15, shuffleRows=false, seed=1234, iterations=10)

Creates a Kaczmarz object for the forward operator A.

Required Arguments

  • A - forward operator

Optional Keyword Arguments

  • reg::AbstractParameterizedRegularization - regularization term
  • normalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()
  • randomized::Bool - randomize Kacmarz algorithm
  • subMatrixFraction::Real - fraction of rows used in randomized Kaczmarz algorithm
  • shuffleRows::Bool - randomize Kacmarz algorithm
  • seed::Int - seed for randomized algorithm
  • iterations::Int - number of iterations

See also createLinearSolver, solve!.

source

FISTA

RegularizedLeastSquares.FISTAType
FISTA(A; AHA=A'*A, reg=L1Regularization(zero(real(eltype(AHA)))), normalizeReg=NoNormalization(), iterations=50, verbose = false, rho = 0.95 / power_iterations(AHA), theta=1, relTol=eps(real(eltype(AHA))), restart = :none)
-FISTA( ; AHA=,     reg=L1Regularization(zero(real(eltype(AHA)))), normalizeReg=NoNormalization(), iterations=50, verbose = false, rho = 0.95 / power_iterations(AHA), theta=1, relTol=eps(real(eltype(AHA))), restart = :none)

creates a FISTA object for the forward operator A or normal operator AHA.

Required Arguments

  • A - forward operator

OR

  • AHA - normal operator (as a keyword argument)

Optional Keyword Arguments

  • AHA - normal operator is optional if A is supplied
  • precon - preconditionner for the internal CG algorithm
  • reg::AbstractParameterizedRegularization - regularization term; can also be a vector of regularization terms
  • normalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()
  • rho::Real - step size for gradient step; the default is 0.95 / max_eigenvalue as determined with power iterations.
  • theta::Real - parameter for predictor-corrector step
  • relTol::Real - tolerance for stopping criterion
  • iterations::Int - maximum number of iterations
  • restart::Symbol - :none, :gradient options for restarting
  • verbose::Bool - print residual in each iteration

See also createLinearSolver, solve!.

source

OptISTA

RegularizedLeastSquares.OptISTAType
OptISTA(A; AHA=A'*A, reg=L1Regularization(zero(real(eltype(AHA)))), normalizeReg=NoNormalization(), iterations=50, verbose = false, rho=0.95 / power_iterations(AHA), theta=1, relTol=eps(real(eltype(AHA))))
-OptISTA( ; AHA=,     reg=L1Regularization(zero(real(eltype(AHA)))), normalizeReg=NoNormalization(), iterations=50, verbose = false, rho=0.95 / power_iterations(AHA), theta=1, relTol=eps(real(eltype(AHA))))

creates a OptISTA object for the forward operator A or normal operator AHA. OptISTA has a 2x better worst-case bound than FISTA, but actual performance varies by application. It stores 2 extra intermediate variables the size of the image compared to FISTA.

Reference:

  • Uijeong Jang, Shuvomoy Das Gupta, Ernest K. Ryu, "Computer-Assisted Design of Accelerated Composite Optimization Methods: OptISTA," arXiv:2305.15704, 2023, [https://arxiv.org/abs/2305.15704]

Required Arguments

  • A - forward operator

OR

  • AHA - normal operator (as a keyword argument)

Optional Keyword Arguments

  • AHA - normal operator is optional if A is supplied
  • reg::AbstractParameterizedRegularization - regularization term
  • normalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()
  • rho::Real - step size for gradient step; the default is 0.95 / max_eigenvalue as determined with power iterations.
  • theta::Real - parameter for predictor-corrector step
  • relTol::Real - tolerance for stopping criterion
  • iterations::Int - maximum number of iterations
  • verbose::Bool - print residual in each iteration

See also createLinearSolver, solve!.

source

POGM

RegularizedLeastSquares.POGMType
POGM(A; AHA = A'*A, reg = L1Regularization(zero(real(eltype(AHA)))), normalizeReg = NoNormalization(), iterations = 50, verbose = false, rho = 0.95 / power_iterations(AHA), theta = 1, sigma_fac = 1, relTol = eps(real(eltype(AHA))), restart = :none)
-POGM( ; AHA = ,     reg = L1Regularization(zero(real(eltype(AHA)))), normalizeReg = NoNormalization(), iterations = 50, verbose = false, rho = 0.95 / power_iterations(AHA), theta = 1, sigma_fac = 1, relTol = eps(real(eltype(AHA))), restart = :none)

Creates a POGM object for the forward operator A or normal operator AHA. POGM has a 2x better worst-case bound than FISTA, but actual performance varies by application. It stores 3 extra intermediate variables the size of the image compared to FISTA. Only gradient restart scheme is implemented for now.

References:

  • A.B. Taylor, J.M. Hendrickx, F. Glineur, "Exact worst-case performance of first-order algorithms for composite convex optimization," Arxiv:1512.07516, 2015, SIAM J. Opt. 2017 [http://doi.org/10.1137/16m108104x]

  • Kim, D., & Fessler, J. A. (2018). Adaptive Restart of the Optimized Gradient Method for Convex Optimization. Journal of Optimization Theory and Applications, 178(1), 240–263. [https://doi.org/10.1007/s10957-018-1287-4]

    Required Arguments

    • A - forward operator

    OR

    • AHA - normal operator (as a keyword argument)

    Optional Keyword Arguments

    • AHA - normal operator is optional if A is supplied
    • reg::AbstractParameterizedRegularization - regularization term
    • normalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()
    • rho::Real - step size for gradient step; the default is 0.95 / max_eigenvalue as determined with power iterations.
    • theta::Real - parameter for predictor-corrector step
    • sigma_fac::Real - parameter for decreasing γ-momentum ∈ [0,1]
    • relTol::Real - tolerance for stopping criterion
    • iterations::Int - maximum number of iterations
    • restart::Symbol - :none, :gradient options for restarting
    • verbose::Bool - print residual in each iteration

See also createLinearSolver, solve!.

source

SplitBregman

RegularizedLeastSquares.SplitBregmanType
SplitBregman(A; AHA = A'*A, precon = Identity(), reg = L1Regularization(zero(real(eltype(AHA)))), regTrafo = opEye(eltype(AHA), size(AHA,1)), normalizeReg = NoNormalization(), rho = 1e-1, iterations = 10, iterationsInner = 10, iterationsCG = 10, absTol = eps(real(eltype(AHA))), relTol = eps(real(eltype(AHA))), tolInner = 1e-5, verbose = false)
-SplitBregman( ; AHA = ,     precon = Identity(), reg = L1Regularization(zero(real(eltype(AHA)))), regTrafo = opEye(eltype(AHA), size(AHA,1)), normalizeReg = NoNormalization(), rho = 1e-1, iterations = 10, iterationsInner = 10, iterationsCG = 10, absTol = eps(real(eltype(AHA))), relTol = eps(real(eltype(AHA))), tolInner = 1e-5, verbose = false)

Creates a SplitBregman object for the forward operator A or normal operator AHA.

Required Arguments

  • A - forward operator

OR

  • AHA - normal operator (as a keyword argument)

Optional Keyword Arguments

  • AHA - normal operator is optional if A is supplied
  • precon - preconditionner for the internal CG algorithm
  • reg::AbstractParameterizedRegularization - regularization term; can also be a vector of regularization terms
  • regTrafo - transformation to a space in which reg is applied; if reg is a vector, regTrafo has to be a vector of the same length. Use opEye(eltype(AHA), size(AHA,1)) if no transformation is desired.
  • normalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()
  • rho::Real - weights for condition on regularized variables; can also be a vector for multiple regularization terms
  • iterations::Int - maximum number of outer iterations. Set to 1 for unconstraint split Bregman (equivalent to ADMM)
  • iterationsInner::Int - maximum number of inner iterations
  • iterationsCG::Int - maximum number of (inner) CG iterations
  • absTol::Real - absolute tolerance for stopping criterion
  • relTol::Real - relative tolerance for stopping criterion
  • tolInner::Real - relative tolerance for CG stopping criterion
  • verbose::Bool - print residual in each iteration

This algorithm solves the constraint problem (Eq. (4.7) in Tom Goldstein and Stanley Osher), i.e. ||R(x)||₁ such that ||Ax -b||₂² < σ². In order to solve the unconstraint problem (Eq. (4.8) in Tom Goldstein and Stanley Osher), i.e. ||Ax -b||₂² + λ ||R(x)||₁, you can either set iterations=1 or use ADMM instead, which is equivalent (iterations=1 in SplitBregman in implied in ADMM and the SplitBregman variable iterationsInner is simply called iterations in ADMM)

Like ADMM, SplitBregman differs from ISTA-type algorithms in the sense that the proximal operation is applied separately from the transformation to the space in which the penalty is applied. This is reflected by the interface which has reg and regTrafo as separate arguments. E.g., for a TV penalty, you should NOT set reg=TVRegularization, but instead use reg=L1Regularization(λ), regTrafo=RegularizedLeastSquares.GradientOp(Float64; shape=(Nx,Ny,Nz)).

See also createLinearSolver, solve!.

source

Miscellaneous

RegularizedLeastSquares.solverstateFunction
solverstate(solver::AbstractLinearSolver)

Return the current state of the solver

source
RegularizedLeastSquares.solversolutionFunction
solversolution(solver::AbstractLinearSolver)

Return the current solution of the solver

source
solversolution(state::AbstractSolverState)

Return the current solution of the solver's state

source
RegularizedLeastSquares.solverconvergenceFunction
solverconvergence(solver::AbstractLinearSolver)

Return a named tuple of the solvers current convergence metrics

source
RegularizedLeastSquares.StoreSolutionCallbackType
StoreSolutionCallback(T)

Callback that accumlates the solvers solution per iteration. Results are stored in the solutions field.

source
RegularizedLeastSquares.StoreConvergenceCallbackType
StoreConvergenceCallback()

Callback that accumlates the solvers convergence metrics per iteration. Results are stored in the convMeas field.

source
RegularizedLeastSquares.CompareSolutionCallbackType
CompareSolutionCallback(ref, cmp)

Callback that compares the solvers current solution with the given reference via cmp(ref, solution) per iteration. Results are stored in the results field.

source
RegularizedLeastSquares.linearSolverListFunction

Return a list of all available linear solvers

source
RegularizedLeastSquares.createLinearSolverFunction
createLinearSolver(solver::AbstractLinearSolver, A; kargs...)

This method creates a solver. The supported solvers are methods typically used for solving regularized linear systems. All solvers return an approximate solution to Ax = b.

TODO: give a hint what solvers are available

source
RegularizedLeastSquares.applicableSolverListFunction
applicable(args...)

list all solvers that are applicable to the given arguments. Arguments are the same as for isapplicable without the solver type.

See also isapplicable, linearSolverList.

source
RegularizedLeastSquares.isapplicableFunction
isapplicable(solverType::Type{<:AbstractLinearSolver}, A, x, reg)

return true if a solver of type solverType is applicable to system matrix A, data x and regularization terms reg.

source
+julia> x_approx = solve!(S, b; callbacks = [conv, plot_trace]);

The keyword callbacks allows you to pass a (vector of) callable objects that takes the arguments solver and iteration and prints, stores, or plots intermediate result.

See also StoreSolutionCallback, StoreConvergenceCallback, CompareSolutionCallback for a number of provided callback options.

source
RegularizedLeastSquares.init!Method
init!(solver::AbstractLinearSolver, b; kwargs...)

Prepare the solver for iteration based on the given data vector b and kwargs.

source
RegularizedLeastSquares.init!Method
init!(solver::AbstractLinearSolver, state::AbstractSolverState, b::AbstractMatrix; scheduler = SequentialState, kwargs...)

Initialize the solver with each column of b and pass the corresponding states to the scheduler.

source

ADMM

RegularizedLeastSquares.ADMMType
ADMM(A; AHA = A'*A, precon = Identity(), reg = L1Regularization(zero(real(eltype(AHA)))), regTrafo = opEye(eltype(AHA), size(AHA,1)), normalizeReg = NoNormalization(), rho = 1e-1, vary_rho = :none, iterations = 10, iterationsCG = 10, absTol = eps(real(eltype(AHA))), relTol = eps(real(eltype(AHA))), tolInner = 1e-5, verbose = false)
+ADMM( ; AHA = ,     precon = Identity(), reg = L1Regularization(zero(real(eltype(AHA)))), regTrafo = opEye(eltype(AHA), size(AHA,1)), normalizeReg = NoNormalization(), rho = 1e-1, vary_rho = :none, iterations = 10, iterationsCG = 10, absTol = eps(real(eltype(AHA))), relTol = eps(real(eltype(AHA))), tolInner = 1e-5, verbose = false)

Creates an ADMM object for the forward operator A or normal operator AHA.

Required Arguments

  • A - forward operator

OR

  • AHA - normal operator (as a keyword argument)

Optional Keyword Arguments

  • AHA - normal operator is optional if A is supplied
  • precon - preconditionner for the internal CG algorithm
  • reg::AbstractParameterizedRegularization - regularization term; can also be a vector of regularization terms
  • regTrafo - transformation to a space in which reg is applied; if reg is a vector, regTrafo has to be a vector of the same length. Use opEye(eltype(AHA), size(AHA,1)) if no transformation is desired.
  • normalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()
  • rho::Real - penalty of the augmented Lagrangian
  • vary_rho::Symbol - vary rho to balance primal and dual feasibility; options :none, :balance, :PnP
  • iterations::Int - maximum number of (outer) ADMM iterations
  • iterationsCG::Int - maximum number of (inner) CG iterations
  • absTol::Real - absolute tolerance for stopping criterion
  • relTol::Real - relative tolerance for stopping criterion
  • tolInner::Real - relative tolerance for CG stopping criterion
  • verbose::Bool - print residual in each iteration

ADMM differs from ISTA-type algorithms in the sense that the proximal operation is applied separately from the transformation to the space in which the penalty is applied. This is reflected by the interface which has reg and regTrafo as separate arguments. E.g., for a TV penalty, you should NOT set reg=TVRegularization, but instead use reg=L1Regularization(λ), regTrafo=RegularizedLeastSquares.GradientOp(Float64; shape=(Nx,Ny,Nz)).

See also createLinearSolver, solve!.

source

CGNR

RegularizedLeastSquares.CGNRType
CGNR(A; AHA = A' * A, reg = L2Regularization(zero(real(eltype(AHA)))), normalizeReg = NoNormalization(), iterations = 10, relTol = eps(real(eltype(AHA))))
+CGNR( ; AHA = ,       reg = L2Regularization(zero(real(eltype(AHA)))), normalizeReg = NoNormalization(), iterations = 10, relTol = eps(real(eltype(AHA))))

creates an CGNR object for the forward operator A or normal operator AHA.

Required Arguments

  • A - forward operator

OR

  • AHA - normal operator (as a keyword argument)

Optional Keyword Arguments

  • AHA - normal operator is optional if A is supplied
  • reg::AbstractParameterizedRegularization - regularization term; can also be a vector of regularization terms
  • normalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()
  • iterations::Int - maximum number of iterations
  • relTol::Real - tolerance for stopping criterion

See also createLinearSolver, solve!.

source

Kaczmarz

RegularizedLeastSquares.KaczmarzType
Kaczmarz(A; reg = L2Regularization(0), normalizeReg = NoNormalization(), randomized=false, subMatrixFraction=0.15, shuffleRows=false, seed=1234, iterations=10)

Creates a Kaczmarz object for the forward operator A.

Required Arguments

  • A - forward operator

Optional Keyword Arguments

  • reg::AbstractParameterizedRegularization - regularization term
  • normalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()
  • randomized::Bool - randomize Kacmarz algorithm
  • subMatrixFraction::Real - fraction of rows used in randomized Kaczmarz algorithm
  • shuffleRows::Bool - randomize Kacmarz algorithm
  • seed::Int - seed for randomized algorithm
  • iterations::Int - number of iterations

See also createLinearSolver, solve!.

source

FISTA

RegularizedLeastSquares.FISTAType
FISTA(A; AHA=A'*A, reg=L1Regularization(zero(real(eltype(AHA)))), normalizeReg=NoNormalization(), iterations=50, verbose = false, rho = 0.95 / power_iterations(AHA), theta=1, relTol=eps(real(eltype(AHA))), restart = :none)
+FISTA( ; AHA=,     reg=L1Regularization(zero(real(eltype(AHA)))), normalizeReg=NoNormalization(), iterations=50, verbose = false, rho = 0.95 / power_iterations(AHA), theta=1, relTol=eps(real(eltype(AHA))), restart = :none)

creates a FISTA object for the forward operator A or normal operator AHA.

Required Arguments

  • A - forward operator

OR

  • AHA - normal operator (as a keyword argument)

Optional Keyword Arguments

  • AHA - normal operator is optional if A is supplied
  • precon - preconditionner for the internal CG algorithm
  • reg::AbstractParameterizedRegularization - regularization term; can also be a vector of regularization terms
  • normalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()
  • rho::Real - step size for gradient step; the default is 0.95 / max_eigenvalue as determined with power iterations.
  • theta::Real - parameter for predictor-corrector step
  • relTol::Real - tolerance for stopping criterion
  • iterations::Int - maximum number of iterations
  • restart::Symbol - :none, :gradient options for restarting
  • verbose::Bool - print residual in each iteration

See also createLinearSolver, solve!.

source

OptISTA

RegularizedLeastSquares.OptISTAType
OptISTA(A; AHA=A'*A, reg=L1Regularization(zero(real(eltype(AHA)))), normalizeReg=NoNormalization(), iterations=50, verbose = false, rho=0.95 / power_iterations(AHA), theta=1, relTol=eps(real(eltype(AHA))))
+OptISTA( ; AHA=,     reg=L1Regularization(zero(real(eltype(AHA)))), normalizeReg=NoNormalization(), iterations=50, verbose = false, rho=0.95 / power_iterations(AHA), theta=1, relTol=eps(real(eltype(AHA))))

creates a OptISTA object for the forward operator A or normal operator AHA. OptISTA has a 2x better worst-case bound than FISTA, but actual performance varies by application. It stores 2 extra intermediate variables the size of the image compared to FISTA.

Reference:

  • Uijeong Jang, Shuvomoy Das Gupta, Ernest K. Ryu, "Computer-Assisted Design of Accelerated Composite Optimization Methods: OptISTA," arXiv:2305.15704, 2023, [https://arxiv.org/abs/2305.15704]

Required Arguments

  • A - forward operator

OR

  • AHA - normal operator (as a keyword argument)

Optional Keyword Arguments

  • AHA - normal operator is optional if A is supplied
  • reg::AbstractParameterizedRegularization - regularization term
  • normalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()
  • rho::Real - step size for gradient step; the default is 0.95 / max_eigenvalue as determined with power iterations.
  • theta::Real - parameter for predictor-corrector step
  • relTol::Real - tolerance for stopping criterion
  • iterations::Int - maximum number of iterations
  • verbose::Bool - print residual in each iteration

See also createLinearSolver, solve!.

source

POGM

RegularizedLeastSquares.POGMType
POGM(A; AHA = A'*A, reg = L1Regularization(zero(real(eltype(AHA)))), normalizeReg = NoNormalization(), iterations = 50, verbose = false, rho = 0.95 / power_iterations(AHA), theta = 1, sigma_fac = 1, relTol = eps(real(eltype(AHA))), restart = :none)
+POGM( ; AHA = ,     reg = L1Regularization(zero(real(eltype(AHA)))), normalizeReg = NoNormalization(), iterations = 50, verbose = false, rho = 0.95 / power_iterations(AHA), theta = 1, sigma_fac = 1, relTol = eps(real(eltype(AHA))), restart = :none)

Creates a POGM object for the forward operator A or normal operator AHA. POGM has a 2x better worst-case bound than FISTA, but actual performance varies by application. It stores 3 extra intermediate variables the size of the image compared to FISTA. Only gradient restart scheme is implemented for now.

References:

  • A.B. Taylor, J.M. Hendrickx, F. Glineur, "Exact worst-case performance of first-order algorithms for composite convex optimization," Arxiv:1512.07516, 2015, SIAM J. Opt. 2017 [http://doi.org/10.1137/16m108104x]

  • Kim, D., & Fessler, J. A. (2018). Adaptive Restart of the Optimized Gradient Method for Convex Optimization. Journal of Optimization Theory and Applications, 178(1), 240–263. [https://doi.org/10.1007/s10957-018-1287-4]

    Required Arguments

    • A - forward operator

    OR

    • AHA - normal operator (as a keyword argument)

    Optional Keyword Arguments

    • AHA - normal operator is optional if A is supplied
    • reg::AbstractParameterizedRegularization - regularization term
    • normalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()
    • rho::Real - step size for gradient step; the default is 0.95 / max_eigenvalue as determined with power iterations.
    • theta::Real - parameter for predictor-corrector step
    • sigma_fac::Real - parameter for decreasing γ-momentum ∈ [0,1]
    • relTol::Real - tolerance for stopping criterion
    • iterations::Int - maximum number of iterations
    • restart::Symbol - :none, :gradient options for restarting
    • verbose::Bool - print residual in each iteration

See also createLinearSolver, solve!.

source

SplitBregman

RegularizedLeastSquares.SplitBregmanType
SplitBregman(A; AHA = A'*A, precon = Identity(), reg = L1Regularization(zero(real(eltype(AHA)))), regTrafo = opEye(eltype(AHA), size(AHA,1)), normalizeReg = NoNormalization(), rho = 1e-1, iterations = 10, iterationsInner = 10, iterationsCG = 10, absTol = eps(real(eltype(AHA))), relTol = eps(real(eltype(AHA))), tolInner = 1e-5, verbose = false)
+SplitBregman( ; AHA = ,     precon = Identity(), reg = L1Regularization(zero(real(eltype(AHA)))), regTrafo = opEye(eltype(AHA), size(AHA,1)), normalizeReg = NoNormalization(), rho = 1e-1, iterations = 10, iterationsInner = 10, iterationsCG = 10, absTol = eps(real(eltype(AHA))), relTol = eps(real(eltype(AHA))), tolInner = 1e-5, verbose = false)

Creates a SplitBregman object for the forward operator A or normal operator AHA.

Required Arguments

  • A - forward operator

OR

  • AHA - normal operator (as a keyword argument)

Optional Keyword Arguments

  • AHA - normal operator is optional if A is supplied
  • precon - preconditionner for the internal CG algorithm
  • reg::AbstractParameterizedRegularization - regularization term; can also be a vector of regularization terms
  • regTrafo - transformation to a space in which reg is applied; if reg is a vector, regTrafo has to be a vector of the same length. Use opEye(eltype(AHA), size(AHA,1)) if no transformation is desired.
  • normalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()
  • rho::Real - weights for condition on regularized variables; can also be a vector for multiple regularization terms
  • iterations::Int - maximum number of outer iterations. Set to 1 for unconstraint split Bregman (equivalent to ADMM)
  • iterationsInner::Int - maximum number of inner iterations
  • iterationsCG::Int - maximum number of (inner) CG iterations
  • absTol::Real - absolute tolerance for stopping criterion
  • relTol::Real - relative tolerance for stopping criterion
  • tolInner::Real - relative tolerance for CG stopping criterion
  • verbose::Bool - print residual in each iteration

This algorithm solves the constraint problem (Eq. (4.7) in Tom Goldstein and Stanley Osher), i.e. ||R(x)||₁ such that ||Ax -b||₂² < σ². In order to solve the unconstraint problem (Eq. (4.8) in Tom Goldstein and Stanley Osher), i.e. ||Ax -b||₂² + λ ||R(x)||₁, you can either set iterations=1 or use ADMM instead, which is equivalent (iterations=1 in SplitBregman in implied in ADMM and the SplitBregman variable iterationsInner is simply called iterations in ADMM)

Like ADMM, SplitBregman differs from ISTA-type algorithms in the sense that the proximal operation is applied separately from the transformation to the space in which the penalty is applied. This is reflected by the interface which has reg and regTrafo as separate arguments. E.g., for a TV penalty, you should NOT set reg=TVRegularization, but instead use reg=L1Regularization(λ), regTrafo=RegularizedLeastSquares.GradientOp(Float64; shape=(Nx,Ny,Nz)).

See also createLinearSolver, solve!.

source

Miscellaneous

RegularizedLeastSquares.solverstateFunction
solverstate(solver::AbstractLinearSolver)

Return the current state of the solver

source
RegularizedLeastSquares.solversolutionFunction
solversolution(solver::AbstractLinearSolver)

Return the current solution of the solver

source
solversolution(state::AbstractSolverState)

Return the current solution of the solver's state

source
RegularizedLeastSquares.solverconvergenceFunction
solverconvergence(solver::AbstractLinearSolver)

Return a named tuple of the solvers current convergence metrics

source
RegularizedLeastSquares.StoreSolutionCallbackType
StoreSolutionCallback(T)

Callback that accumlates the solvers solution per iteration. Results are stored in the solutions field.

source
RegularizedLeastSquares.StoreConvergenceCallbackType
StoreConvergenceCallback()

Callback that accumlates the solvers convergence metrics per iteration. Results are stored in the convMeas field.

source
RegularizedLeastSquares.CompareSolutionCallbackType
CompareSolutionCallback(ref, cmp)

Callback that compares the solvers current solution with the given reference via cmp(ref, solution) per iteration. Results are stored in the results field.

source
RegularizedLeastSquares.linearSolverListFunction

Return a list of all available linear solvers

source
RegularizedLeastSquares.createLinearSolverFunction
createLinearSolver(solver::AbstractLinearSolver, A; kargs...)

This method creates a solver. The supported solvers are methods typically used for solving regularized linear systems. All solvers return an approximate solution to Ax = b.

TODO: give a hint what solvers are available

source
RegularizedLeastSquares.applicableSolverListFunction
applicable(args...)

list all solvers that are applicable to the given arguments. Arguments are the same as for isapplicable without the solver type.

See also isapplicable, linearSolverList.

source
RegularizedLeastSquares.isapplicableFunction
isapplicable(solverType::Type{<:AbstractLinearSolver}, A, x, reg)

return true if a solver of type solverType is applicable to system matrix A, data x and regularization terms reg.

source
diff --git a/dev/generated/examples/compressed_sensing/25bc3631.png b/dev/generated/examples/compressed_sensing/25bc3631.png new file mode 100644 index 0000000000000000000000000000000000000000..cd2960a2954f20d8a82a402314dc81f630f3c565 GIT binary patch literal 33673 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

l=MAFd#!uaARJ zk%0P^R-35rAw;-Y59U^SNO&!eI<< zqz@Deg^OWxv?O@M0v`mMd;EzU(@;*muGj5~0gOy<-~%HyJ*rBRSeV$z#BlZgK<0S} zhAMXqemz%7?kZFXn>*|yw46kq;~84WAG9yS7gmb} zLhpcY`bP)Wg$sxTlvi^{OjkUNA`m*~caXVHWX=T&hJoHi)d^n*VK%E0*>9FJTlQ$O zuM!J5OJIQSsLrnQaenQ9kBLj*1V#Ydr%b_d5}dam<^nNTf>MC6nQKotD@lLtt-*T)4WYNAmT7r=$6X*>rMSR ze7`(t2rXr3{RB`C96#UL|yCp)|)jG{%E_ zGg_JZyDmXp;4Wfq3%Bh)q(pldVS0dxG zW&^e!lhM^DT!rzWIlVfpMn3Q$7iWw$s)^TOAzJ`-X@l>ctAGSp5P!=q_uBeOY#<-@ zN878|a=OlY>VxJ^ULOxQK+6QhAcw|E0M<*KV!C_QblW3435r;vFrc(Bf$vBgOPq$r zae%y1RjDWnHZ9C}P|^EPd=tvZ`dJqhw{2FF;Z4-FBno$O#jh(p#QTG72m9{)wUqjq zjCvyQ?ca2N%-{7tY<3NKviyW3+^sA*`iB@D#2tR|?vi-~rGym?bY1QQXZs?DbX+Oy z?5iN|vo(7p*YgZ2XM|d+VOab71+QFuy(;xH}A%L(9_;Gu%A&nQ_w$YM1ij1 zFc+F}d*L5p3B>l+dSHR8DK;r>fjf+)h3$@N5ik3ArbeJ|^PhjtLM}0B#A8$| z2%bSr;Ji$p`H7YJoyqXF;>x6AH?Xu&^*^yBtLJUJpLI?)0IP5wU`iNmk)Sexhm-vP{~HzC zx(Kc%H0JS{I0bqvV^lCsNw~#W%N+`uQb~f2Yktkm8jf{)&Byt6N)JzA9Q^p4rWf0G z>HDfrowcBncR~u(+Tgpfz3|qlk2WqGglTQuGyXkjnS`R5Mm+F-gk`bO+zvye^BC1! zE7nB}cm^mv5uZ{sa#Rv;t{l9ck=3AM3;BR0^yIYvXyry(q?f(#jr4)C9 zY(@ABx<8j+1^DEwiwE~v7r~{-j)@SYCbNH?>W>q!9Z(P!o_57B$j- ztyn{--%-4F#@A?@?bW(B+PTtmm-i(ig&P0`TG+c+uJ<~i!3DbX>#FXvnV+OdOn7^hw zzUw%u^|;E>RFuJ`bFXN-Aim_Wr=INqLw9Sa*Nhb_cy6Ia2S;L7zkx->jLtKD+`H`HS8~mBF?g#{e zL6-rGskf5J-wn!9Y^K)6W@5H(2I0%BXn35I%;QZl$h|h)@ z1IT&g!j^e5Rz?}o6n#J|wB|rI*K^rJi^h4R0%uD|%CkNM)W(h(Zhk;|FrqLsT?R;? z)2j*o_AKyj>3+MVNR!;Uzjw%MUFrSeN_$faB-kH;Ce<186RfPnnu(gA7M!@7(N#1M z(0cyFMjx)buyeEeu-(b#c^Cd$0J~qw+tWKZpnbIc|E=BRB)p6pA$q?bG$9}ELVfW& z$^h3j_QvnB{fa_0p+g0Dd+hozxOJpj#@ilCI)&J)uY~nF6)RU@T%eaD>Q1P=;^?=u zf5P$-!MGv-2D$^(-){PIz7-Ef07PhIV&*g!gtXb!7jj1(KAhf;u?kbZH*{rMQ7aIC z;n%fYlg`zAE(3hX*kJ?;-oY(s!7D@xJJPGqV3@|Bmtjj1I*3?&+g9G)P&?`MGECzZspg s&41Q*4J7yf=8cj6KYgtKUtax2u|vy>uSZtM^KT(#J}H80#SMf053%rEK>z>% literal 0 HcmV?d00001 diff --git a/dev/generated/examples/compressed_sensing/3073c051.png b/dev/generated/examples/compressed_sensing/3073c051.png deleted file mode 100644 index c3a380838949fb83fc4e17f60ba73af1ce9b8401..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62522 zcmeGDWmHvR+cu0YN=l@=yGsO=?rsTbX#@$8?gk0z?vn0qL^_r35Ek7?*LQJ0_w&Br z9%KLBzxI+bTrMZfYhLp_k2)vcRFtIAP>4_<5D1#AjD#8l0{;>Mfr&?g1)m5-&=-Nf zUKqQ(5k(?q0-j977~Zh&^7m5f8W0_xeP@tAvAjaFtEt*$m=pq4vMiU-cLm- za*Bp2gYRTBkLk&GiYqEAj&@VMGu^)%hvoWGAo>62t2>||mtO<}UiA4(;-jb>?0?>Y ze;7o^{_p33`1v&dJp_Ioff4zCj)oU?{r?~S|GS+DDhD^}`lptmS3+v)P~+Xd-N}0E z*|0-&QFW@v`}1*f?`z6;&##-k>C(|uZtFj}l6RMf$4wirN~d-Hv@>JsHrfih|6^Ds zRw@ZqA@| zxCAC>#5@NR1@hr|tOO>|8BVH?&5pYh;A}U}c~X&55d=mCSv0w4B9u(%4|iAihD%G$ zUzuC@;Z@(sC@N;~Ia%4;R~^}XOyjXx@p*di_xBGwGCy_O$qDI!eqN|6W>Mm_nqv48 zR<7Has+GxQ@x4gk^ITQU4m#%A=Jxg-L!jfq+?Vl8LEL4-+`l&uSF646|8)91QSHY` zsK1J)^`i(a8G#Nb*>&7(<>%Anp?v%H4VzA3uI|$$eU_(jbu=QKXgsse{i$@8kXM7v zqVuF8uZE)`Q|!@lt6{r4uJ5Qhzr&`Cq>HqouS*mIwTvtUQZ5shQ8&D{xaD$-Q=w7@ z3*K+9>ivI2TqTK#4R1d)&K z!Y^E}LSN_JzLN2$C=ozJCtIpAf?I9SDKFJ5ms3!ebZL`~w2g-h7(Kl?>OZ zw@PuOW@OwwS^uS3S}z?%cCkN;Xn(Zy?kLf!cAn^sWwsygBm!{gZWx|i8B(dp-g@?B~AL^WMjkY@NYevj#hWx@LC-=ELm|t64 zOJvn`-kTb1^VZQ>czn34t*y<=%ai9MslqvqrC?^>p8}hplrc0sY`xU8N`pq*WhyGF5oJek*sl3q0Q4~lEHN|l|SiI2hm1a6sw^zA^ATl%MIC zm58(HHF3EAvz)G+M&n&NnN$`|==Gv5VXbVxOm*$b^gNSY=G*9xI^LtCq!f+k&lpn{ zx{+Y6myncv*dTvua@>tw3T1hlDeU9DHIl-kyN;usa=y1J>p=vzX z`p$bO``KLE7GU1nm6AmU~c6!iMH^QVSpxy|kC zav)6qcT!@0=Q6piSE#5STPYS}S;Fik%TBZU0Pv#`^`pqZ-#b4m)t#J^hA#kFocBNG zMG2|lnDvI?=5}+93*_znisW6f{O5{~gY$f)Oa)Y+AV5pHyd@EGj@mfp_X6#9hOTdK ze{w!93~<+5Rqdb)I*|~1?~ZC8Mu~ZISCmAbPoqv3MuMeB92`t+*Y;&7o^ineV%K&W z>=}04aW`g)mm?bR!eT5vW}p16y~xZkLX^;L(VytK1{>X9!Dvp477?u4HTh+B)T&i4Om1gM0D)Z#l`qM}b#Wi9{Y1{Iy} zS9XS-fxApRIwd6`aewUd^uGRlM%QkzrEbsYdGXMpl$4aK6_3h4yr>^1@@3DGn8SC) zgI@xu{v!xb#^y{L^!bNcbH%*(Z)}&YK})omJ37|cW~}-=>HlFs_IbKn?d^|cKn5GO zyWHBSdSz^ETvJ=?wVV0(iQj9b&8;OEUpti@mo{e;E5^_crr-lsOlOq)J8?NNv)lnn zN)B26@&#NXBBrgEuV25;&CT7^C*^nkyxdanIRJ`~;daB3kKg%#p%IUSgoP>motT@9 zshQc}5sA%W1F4{U-NE?BdL8Jzo<9S!gOcE*!V0(tcI_84esGBD!beO1^y!2zo%UxA zCkn!cuy-?DRxmH>*%&&aL?MffcKC{ea{fhxSXjAyG;C~2B*ytP1K;{8TaQ{|sHFjk z8hQ&3CuK8)9Z-+iB~=(o6f+>xw#nD@*wxPK01&M!H_Ajd90gF@Sj_9^L$IXlPEEvwy^x?FppM4Y?b89)f%ToaK`Bos zc7 zgs^b(X3?(m3%UCk&<(wmEppxC!cQzHb}hR<0CAq5Ew{R$QhUVFDLObfxZVJglk`d( zZ2(#kkcXLtMd#DwT?s9noTMznpuU{4GQQmm9;*)Ew@`<9&NZNG+XOf{Rq?0{-FFL~ ziP+4{>*Ob5$*u*ZfRsv6IK)FdwSXS!6&&C5+s;C3gk%|T4e|NhqFsCoN3DLEyD(Kl z4_cVzJv27f;d=VFOuKedAArDpw0Ov?Z{6Mxx8Dqt>+0UzU@FSXV{1{?5tU9et;&{% zP2`A&fSpzVvKFAQTy=aPsFQDLhNYUU>zP+zp9X)1_&nZN#4Mj*Wvn#X8LE13MDjj@ zq6y0-5%$(I+hJy<&7lEhV&`WpBk?G-2SsN@PCzyc4m?n)HXX!LT>(n1txcfXdUGJg zcorCdUQ|Pm!}={U0DiPtIv;)$m~_8dZ2oHTXP`u*bn~_b!H^6Kc!RB=i@oXh?S{}& zY7^c|?C7+wRSss8bZl^lacmg^wLH}uK z_3Msg9RQ1+cSrnR)&R!zRPZ0Sy|+CdN?;ZXwE3M4!>*vDgm*#A^O->x3G|2L18D5C zZrM1xZ?|Bf8cw=+3y(MBK4)Uu3g~EPxI=}x3~WjAn#(RnOM}B&Vr{rVLu zlRu$`B}WCw4(~+kSshhkFtn;B=?&lFwmN=M8E2KId75Wb*bGf zS~%%;e|-wDvLHYI1nY4LGB7@l&s+j@{aVM}Q5?D_s9XT|PbDobkM}q7No=Qwz?T#j z6byQ_x*W5a9|Nb6y)P$&@rZ?o*8tSpU>toVklVn=0TZ%@UKR0c{X^BqpFkZx>&|8I z&igZYjf|zGC7?ma(|DERL;doMyL@4cb;&FviFs`S{2j67{m69RW4ti|GWZBA0|?NQ zC}d>hg#md#f=nRyo%W`H%*mglUF?yp0%{KNMhd8=$J^P?Aw|Kn0qSRlx>1uWkd!@| z@P&cf9A3}=@xykp;SiAH%nW|gi;uVecF$DNfk_Bw?JdFwZY(P*e)^ zPf6tupj`#bw1HX&;&5-a(&u1~v)TnnqMAX5H*XxlZV1#enXs_4vokR4BpG^R;?{8r zD+^x4V+{E`Txi+Y0ib3au8F8-({BkC((CX{u^Z@X1Uv0?wB!b=8!+zfWZ`(zmyJy~ z9n$5Hy?k-W}!kLvJ5E0zTvffpf76B|^R!H#h=!9M%A__lVZ?LzW z_^;xdC?L~Pb*{knMu*;eO^veEk5JI&$Qi|QF~5F2(J#ej(AES17>K}w#l~Y`1>D@+ zTBd>0m&ol?%HSIm9)$p>rBSFv8j}Pd05s=ks@3$jU%LBOumah8{_|?P-75u% z19k-f=rOPd-T;sP{c}{^23wDc#}a+9366Wdd0>aZM_{Qq%#|r7Z(e$l2f*48d;!)d zF!tkX1wFQ;#T_JL+PJ9kO|DF{^zz~WaBUdP>(^?|R-Mj=sjjsw;35GRMMXtzM+M%e zy6zSvncCsu(krDuZ!PF=Nm;;(>P}={|5P;w!Oq_V_Zt6sF*p$S)7VNuDlJlr_ah$< z4-XZUn9L%utbn9XN-H~b05}2A@!I*FbG7s}iiPS<259&Pxh$)|rcdkZ>m|%qD{ajz z@M%Da>KmYl-);Oz&Kl> zY~KAE$^yQC1i#rVkGwc@48O$qx-%^w|6JjOpb1wWFB^gN%>uOgaC=eXF%FEvjg*qo zSUlrm-(gq8;)t;0L6CyaNhB3h_rl!MDwwt&{4@?JS?vbetC^ zZLsq|&;m99*Vkb>7@NWGf`TS`hwzT%RnF5?rJ*4|YUxA4+0_xIWDO|PaIEI$X5pv% z+7tD6fYLmU+xr_Iyc7qbY-3`xCU-{$2iF$?oX?mi#AJP?{EHtjFffqieJhLGhq4Ax z3z$xC5Tc~=*py`GTo%k5yU0?ox2bf$kUul~BX)~*TXt)QOagzx<9 zER4i@X@Bi+Z#YCLQy?WK<|n>0^jW$qjo^-j;W7sXa{v$fbiXYuc7#7h^ZL)9KTBFe z>-Hpq?&{tfEqZK+E_=_79g^N6H=uFmdH`-V$jL^CV^$?$$6k%KyOa#rG3TXQqBZ5JesjnVOmciJ1BdvxN-C8=D1n7PeZCE87IotbS4l z$JKxE>+B99o1joM*m6kT@kNG=(9zO6&vQlWsHZdOM1<#lc@qed zwRbEU6rB+oNtZw{3@9DK`W%y~zTC9n=i-X98z`x~T)f|i67Ct@9?!prR%q8seRu_9 zYGJYJFw6=-W`DMF6_~Jr40C9xo13IF1W1(+Jdh>#{qo+9x<7f+|3d>S;Lzc*G4qIv zqvgB$Sp$Cee?^~nnG%}6YG)#&$z1Dk zhX>$aU`I3TtoOP4dMJyFi)$^$@d8eON(aIMnE16WKR6Q;lU~#S3c2pNYLi}PU{Zmz z20|n;I@%tnqHuinBjBV!G~@8&98d@Oga`x!AO8v@xZ6-DbaS&zuX*Asx=}L?AVD@C8ale~MBH-uNihH_YUaGJmR&%Gl@TBBxHnbI zyW;w5r~g071nwPka5TFIP|fWgE*02w9;uWdSpc#x4NkY0apZf^H0=@pW@va-NxmfW^8jANUg;f`yK9i*Rt*;hcn zTpliF0TTl7$l%DKc~d3iS-sd`vI0l$RLB((Z8i!>V=R@M8AL*0SHZm{=eCMJqC6{T z2kFdkBI^cncIV9&F{aQkLELhPW9#-Yf4kjkhjB(A;DZ&<^HHE)sAmuFF7^xe3*M{Z zY_P6X0z;Z-z^VS>OrzT;Yy@SgLZ836qih&#nZ^ojCsF71UsQu4o#GYa>YXhcjQuB& zU`uBH;t(^SUk5znz!n4|l8fC*=>{j*WDX-S!WD_!R7(0W-feKj_=8m%XD&b;s-xDx z?o1X&y$w&Ndrp6I^)AH^r;6j2szKHxbC4?J)xw~KptOU9g+*2Q)wJ%f!{^Us3_!0R z0-FZ5bQ4t-`UEokwD1naf;uHJ*`rwJK2`5LR35t(mIYN-I-9^Yn)3fdF=o9`$#A@H zD4d*}xq1m6bs#7M#D=LlmVUMBV>qQ%-t>}!g+<}JKrz@75c^6zXc@RkUbI_hWkm@; zewa$4pQ^X^8sfq<{^xZut>u6yCN2(w3qXk;8dB7!XBus_2QGV4yMXP4+|Ep6EVOWF z+1bZw%A+F&!-h3WHE=)X={Wo>diMT4*XxLeEjmp5H1R6H7_h3m{5G&E-F{Cg59s0P zVfATH7@I9AeB5X0OFwB%f=WK$D|B?jdaDH6#OmZ^0vi@#UqI{6!1e(O;?OFPug^DI z0v~(acCPeE4^0%(1(*=XtPiHRs9 zD&n_38=ruHCl~~E>|g;9*a12G>e$fG0?0Ig1(rEj29g30?O+O@(A_~T2na0~KLLq# zkE*h+kjx>9Tk=!CTDRVc+kAvTm4V(2pm?KGdo5@fYIYdr4Zt4vlHS1}SY+yH1y;`u zq)}8CDqvbMmcbuH9@A^AU1R#KjKBrVY{2x$nD#ToGsvVvA8141GD0szU`A58_kj(J z_Q5vQdd$ww2GU*|?;-prNRe(TeIDdJM}~&@9DpF8mNuond9N%8(oC0cQ8nSmfU%!T zl{`b?!1)evppy$40S5&gos`Qg2puUaN$9t|U^&1nCxOXqO3-I@H{b=D4p@!m!V8Mk zNRh79MiEXLDj)I-lx$dBoNmJ*9Xm}NC^&yifgkWU?O+0ffPlbdK7tVhgm_XKn9{`4 zQ&3Y;{ZL48xY*O+v}V{JC9y?H9L0&K20pdIuyY0Kkg&x{jU=gx0|ojYUGQHti7IuH#E1ZadX@y+5H<0V0{wQ$;Xpl{Ej zfikFTy8-|V=q66`2Fy`FFn>5-D}5CKj6StgM0BBp^>hjMr-^(Jf-K)YdsUzzsT=JY zfdF{81ZX3!QA>~r|0N6r0?JV4ZUSPCk6poN#Omy=>FMd!9V(6QZ^i#pHT}$8ptsjm88{RzGHJIwY&jT7l@0Fp(`^L`gfog}i@K5ugeaZ1%1UxQ3gPj3YgHK92nsD%(6}))` zCKMB+XK8V9UqSTtJgxz`G3b#zQ-6tf_JHf+=#_u`_%Q=gHn;OFfMydJlYif4jDe3c z1w9&o$t#H6>%mWb^N9*8c5`zR*i>p}W&qMZ*X`?oD_6~v>b0DNI?&S50WB>=MU@LY zx+IGU_e4gpLNRRq8Ai= z0Pq2(EMQzUdx19-Wbxp@m+?Hiav(`@9A9;D2jfF4D=Sx5SAf*8GYnd7&%KmuEU*WK z06lSf^DKDw0s!mBA>IIhv6`(IwfPDH{3$j&C5%8e9oih@yY~oho%Z5SmMkaozsU`C zf_8J`1K2kJ6xB2n3V67nLxq->DomClY#gkn)iwG&3)})=B~iDR4cgr`R1lHqEP>*@YnIpmj7^#|acfUbBr`Gp=u%FiR>Z-&4kiT~Gw9xBe%|MM`2KSdh_n4|yq z(Gd3M3HX1X5 z`dzhbeBIsP`>LVVLx+_|aR)jqAC1TvZ|6O6|P;jNJrQ)93v2oZs z8#hWZ$~4UXUI;9K*SGemq>__%(Wo$r?-VvUOk)4t6N$B-FNLpH$JErimUcP#-{OD1KXqbS35EK?Na#f7?k@Ui(+^IDC>g8OKpsnl4BVnGrbKbAaclyjD%=@C|aNR}r5;A&ZGg&g?jj;{QOhrDZGT6tE$5cNdn&?a~DQtc_$ zLQse6;7#tzDqOF|TwtzAP_)yF$&Z#R%xbtyFba&_>gqK!gm4_8k!-E+F*>4o^R;xy z`L&Q~ys{P6Qhy~hxuZF6A=)gw|FKOKW*T0DCzA5&D@^277bO(h;n^nrQgJEW-FNuG zSUj8c51xZl?tqm9g~&$xgi4)l_NY|P8>eMHk)c(Oc@Mo89Ch>L*!%Z(15ZC-=Nu;| z7CSQ-nRKX0R#*Pb?0Cg(ZfLo9;CHnTXR)!Q2#|M$8Wy$)dyo~3HnOD5n1vRqfGIEo zN;(@u*qz&ZJrx{+oflyXJ*rL87sBiOP>vN@*`n0Bh58rvwp~sQG5A9|%p8SaixG(T zrdOTG+-qYcw8h25FZ{-jhM8b|e@3 zEQdM`XI_0ae;dBxVanUJAiW)VfA9&i`aK0v1g4wis8YDU7bO9{i)a_AIHl0a#i`My z{~&9C_Ma0cvkR05KL>8vIv;X9{4)f`bK0rEbE@l58S;G9^o!{J!_XN>x>Ds2ZY#0% z#K&{lV1!P_kW-~2DUHbZq`MWN&*Qnl`%Ep=w$8m}k`artpKj+fSA7;s=fgJ(L@)}J zm(tAwlJ*C7=*;15xb?&RRGZ6`EXNmxR+Kg}DB3s_cuFQ-268DIsle1ObV0V1olkA43K|M0%bQawReHwuISW#+<=XLFnW2It8IE)nu!(S|lk`MTkbpQjkn2+!jO zGkMp_k~ze@?qRnfl|GM!o51AdfHM@PXs}F);Z^TVui^IDH6rBc^CfOtk%GW$Y>|@$ z|23Ns*XF;DuqZgTv>$yJRl1U4ITSr>O_d=jI80<}SWLW(>{t3HYd$b9iwT=r{1Wv! ztxwr_%n;#{Zw9G1qeU>ht1t8$!>eXcWlD*6`f!V;AR5#qt}m8fGz)#i>B?rJMDr`^ z*y&~Puzv9};%;@oO$@a$siQX3Zs}=@MPrd#OL!C=#XRWmWzD}1$kBe4i{7C=B-qx& zVQTz+52edz4=j-n65kmxb6qplC{XUE-VXBaeXxQII6*@`9B{LWf>51{o>N$@gN|Ph zJL>z_Mrbcs+s~Gw$YfgLzz-!==XaW3To6j2Xt>q0B5El`s zO~QN}$Tv$PdzsmC$WFRtkUL=R|CID1GAh=R;voU{2dk9itgOB>i2Fb}0(j75@5 zE>?uzHpp&k*4UEC0Ha2~9P#_nl2f1=uLiH6TH1tS#P9%7ib4Yin z-{bF4_vy-6GwIkI8Kg|O?|cZnF;3&!VUIH9MnW;H=enuyV9lB&jMX`&J8vsusyDKy zUOhq(RcCw24L_}eNacn}e12CFB<*!+RhYPRs&SsxS`>1|Q z-|Bi7m=B(8&QcTY;0d=+uoOGF+(@BsH9n4h*?U8CVbT3-vbM6;g1Zhr$gkOP@4Fr+ zao6f&&1D}EeX}W%O)FKJ)QZhjHA}UW_Tk+f`}q5G(UHrQJ{NK_zL-^{D>r?V+IfhG z-(QxsN12FE^p&*Mu!ML+_yD?KC+M#pwhv-U5WjNeYGv#oP~1f=2r5(qddrm7g z`~OBWE%(J2n;={(=NZ6FuNG`N>ym##I+U)z9azC0$I~VXh3S| zNhXdP-n_nrE9JEw$*f>248-$s$5YkqFoCQlw#zrInbR+XoTQYpv28CV=*mk-{}ZU1 z&n_~f=V2JR&DrD*l%1PeiTbOVy8Sl$O$MLWU|Ep8k z2Vyar?Cq9kveI>?I4WFO5A5IKXEb}QR@$W5Fmlt=cFGXqES0ZT??!eW6YJIS=Ce(X zUkW^a{2D#$@FgducPP~M-q*^Q%s`2sPZJ@*Oav;|BOK-fP2D;aF;P=F%!q5dDo9)& ztsEQRm=Id=&X;B!ao5xZOilB`9A1$G)aF2s z@8H9%f3`{J(sn+chog4N-fn!5E!eMTKDa+9HgnC_;+NldMPr+3l|f9R#ESG;yZnAULd@U(Kx>M)pM~xMZso9-uI^;(Z&yoK*otv z@sf3Gw(HI}>wRk<^6O?cz$78d8m`Et3nrV8NlF~@`*S$8m;5>Y=}u6^PsoQSc{}~i zA@(36)n9KvN5cI!g5rd!QIs$N3V}v7#`K^cYt?}5qQYn}SmJ8xjPCBl1xNoMo1kb2&Aghs?78bgW zI`8c#g9~9klfN^3!+)E^2sv83`9P{{3iH*C3ej`iEnl}nzb%JBY+{*jaPf(^BohIG z!;FKv^4QrZ^>D5A$2f7Ac5F>$t~Kd446je>NbIdW4#d2Xc;GV+Ls%|@eKSfuV^E>s z>zy~$f;l6U@?u>^*0U|HGXc$nf0#Qu+H)gbbi}=8xc{Eeef*5bev+Iok-$xXAZcT3<5drsNoxjVr{A%`&8_Zpb-tpB z^EZtCts=`gDm%TYMk`Hr&nY~T?pU!VHLQK% zKx&43Ba&$9maZ5@(z@eK(FBUZ8+aWhKO~j9J-@5hpMv;VHLsLV;gXpQBN7;ug7lpc zzQw*Pl*VBqWCN5<1D}Q(80>-S!jVU6uE=qr)Ql@xsBe4p5dp$+dXqxl`Ilql$8@Yedyx3-Z{ ziuh=SR5I_S;e~xnaUN=6=?Iti!YnO#rj4TsbBpE}q3m}pO{h(W=pGEFNOEOt-&5_p z0Fi$Xen)E6VaIqO+?@N9-WsC8VH@)RLLUV6eMPg?{gEX+#nIKyZELbexlwP%QQS`v zq)Sm|6_=$DvC-4iAk?}rze2fz8_#AciwVQ5)Q*!$VypCN!P(#A7TmjgD;jVwDMcX! zhCcJ<2po+I>ju)I1=!JHDw--N>i;Jv$W9JKq4RQBZF<+yLQuc(ws^WwqsRTD*aRG2 z$G;l(f1aOESi4MNZx|4XT8v&SAPl_V-Aiq%NwR7qMtCuReaTTpmP~*hVVt3;qmqHy zXO5_0-7yt^{4Hv~ACrXW*zCKVJR?^r?#HSRiR532(Tp2~{kSM0-lSaUA`G>#0|DVM zgi2N_BOzbh6e z4~uSn$@!xh*a~2mhg;+maIlDAQI=V<7NR`cN)u%-QK!{jZ2fKWR7b{rnU^YgxxN(q z>dwPU%1Q(|=hUD9r-1TgQ}Sa3dqCCS9rTldnMU{cK*PQfIE=m}gZlZfuU$v|)|IIB zn|Xb-QF-4rWq(Vz=Y{J1pmk$wOVf;S-bv(y40McDoLHKpPK0ch?VgW$Sr>)}r}i{0 zM?NmiM%&f7?Phyqz$c-G{hdKeSHkQsLpGLjn#7ioEgHHmdTzl&7B~M&SC!?a-`uYA zadx*@zZKm5F=^hw6EWraF>DeC5IZTR%{Tt^CtVPbY#Am>W(hLS{4!9~(V%xQ{X_UQ zFHv$2O>*{Y(w)9HacoBLkykZAKc|AbmgM{kx9+~_5@48D!!>OVZQOV^#dZ}erggaU z-4}8HYh&K@-|RP(h^Wyj))8YT$JEB|D_hCYS}U^I$ihX%dC?2Y(ROu=P~v=~_fWUg z_2X_^aNZk3PfRvClC@=CwKOJEWInQlLO`(}d)1pOe+%Y3wVX!@_V?afh>57{WMc|KIZJ;KwXYA@+w%ql9= z98YLSN+2BOex}n2v89LpP)PKdx#*6~iIT`Q*?D2`ZSX7G541krWaM7&rh6J;}0 zg+#bH^Z33%fh2WkuF+l-Zqbzx_|0M0m!0~lAz*vFlS43MioSvjpw}v1-%YL!i*d9) zRo;mEr2k08DYL8Z@cBF($WLBx$`5&~oX+yO2fJgW4Nni7a*Vb`!e2Zw(4lvx;sRV` zKrR;Hq5az|ZzHRVFKlN)KtP{A)lV&zR59`sbfx_Yj$5M0PU(gG^pv{an-f}U9_S}@ zv5|qi#6lx?LLrVQIrmqzbG?jnfaFL4mN8@jAUc88k z^`(_=c)84p+x4isvQA4l)}||*LF%3ggCy&sjRMJ*3eJSdvDa1RMKYb&>hJDy`ev3-xm^7Ae*?cIHDeR7|rfPqOt96J&%bxVo6ZL&e{bS&;*bQZe`oGU3L4069!UCXJ8(SHvY{YVisD*kD0}Uy9|v=^jgdb&0-3}?7)d1X zT;a^xE6wK1bwZ-L#we2EQldJUG~FNAh3}&5CtaIUQVp=GKWW(a(l^`L>klfJrXru{ zEZdS^o5u_VA&a=RoqbDcZ6-Zu{rdrAJ;wqNm&eN{hkVUAo6IW@Oy)cdF)n{LGHkJR z#GPx>FE#t~KRNE88r&a*eDN;jottzPe?e%M6EZd&VC-R|8e7rA{*KwHuLZshSllim zdPl12oW~>oVj;YnF4`de`P0rC-;5h*7btsOKheOKzuglBO)fYu*@Jv%Dih{nio*EnNaf2JEiHF{74Yy3b02pnP48_Aezf zD~7~3+TWZG{z0129L-p#gvht>Mrg$)1iF6-W1X$Fs>z+JP50D|q*F-Qjn~p?Q%4BZ zEo2&qtYOAuz?-qVWP@;*yP-=Ty)qsdBY@=4Y%(9TmVIA!wnoat#P$8_z}})a`VT%# zwg?5Mm~tr#CrzmE9VATrB<6Qr+vwyST&PEJ@1Cac-VCAIr07p%i69mGe@)K2aBd5_ z%z0@t>(O+}^(jH>ZXu4?D5A<|Gh44?qhg1h&PhKFJGH{YEsOI?#+Gn56OkXQE-If! zIViy9-yKxCOJM|C#<>j<`Gfp+QCGJZ^Nr6k3dF^SCoZY1+2xNHKN(!rk7Isi8;|b9 z4VKTn3W6$aV|odjItVI=OdRiY{Oo3%lE;Pn#`j)zJ&G;-ifM%jto;aS9#{{lZ1IGH zI7T#>LR*v`2X$5T*cgr|;2#y;zKu<2BXv^9ixEc3bR&a- zR6WeEF$ptSjXKmPwQ*e^;!>Vc%;!C^YAy!z^`?wW{T=2EMz0q;Zp?{{nZ`$7df_ta ziNy7xdVD6Uq2z(L9n&Wn!mZPCFjc!1nPd4lE~uIOd-cx#i$9BpZb=hJ4GntW8su^LIlRT6h~?$BZC_^rX6NwT#{#6eI5&4i4YYUx>W0ZLD0zX?^^vR8v2P zM)>LDT&Wh)*K==uj+A3PRjYF+LK@7G&;)R zoxPa}u^}0&;Y6&M@==JNO!@vaT%<=-jGk@m*g%o+7PRGEe4VYTlz~EvJ~!jk3WiO# zm{UNXhwP~)R(@b%=JHF6*?N8AT7Mt17H2%jTg*(o9UkmNoi3cYnhXt#gt{8>G-?fA zA+BgE{@ZMY-*z`f|*P-74^ZV`1)vMV5n5Q!CI zrzZ9vAKv@0PETWlOF3+>=G#M-(8lI`qsq%o?^|ke*HxSC5VPJ)qNWUj$U{v{bERi5xWtxvE%*b2| zxId;A-@31;jQ<@{!SL)wXrix~E_xHlL{pN8WUB_@rLkW(2s6h!Mc%z()5Y*zS~wVd zAk$cu>aGbPV5F&VyV>#O>%RcY=3tRMQSD!fC{mY! zne2++bUO0VTh;x3j~Ktp))|+7w2c3yo}IQWjc;gvRR1kNWoo3oK|(8%vyq2DgNJF# zxobxVhj3^_HRyHt;oc7((Ck7Z`@-WFoE#jbqwOJ_kV>)}vqNZR?q$(H)7^|h6d!yO zhV#t1cTy+JA=W3F`aLyEjo+q%#sd}P@FLYBFo_S=e`3E@*Alz3AeUx6o;@N!%RA@Qf>vRazf|RynHGYh7{yc|_Pv0>$B7mK`4#4GfnVwtj{NZOX0^%sLIGk($Cf<(qcdqh;YVPsXky^RPfuC+35+3fY!9(| z9RWW8sW{7@ANWbel60JT&&p>bNjM5+r~@u>=nm~S#|R|3(t5Z+q&tfk!9q~-3g?qY zjIaS|=ZChD|9uuY=Yev^n&H0M}2yJ5nLRUSWfwod-lh4nYvdh)JHxP0J zw$p+pI2-||(ooJE5G(wDPE6uo9c~;#@VFx;mlrKAH%z4%d}@f`57X}&jw*I7JYe5W zPg(Q!iGqqQ)&T^k4+j;L5T@_ltU^*HmHU`CUpA2elUna2#s5C7w0ZSVVH9HVy9$ za*2+&K81c{Y8B6WcTGi(pTZ(Td~F@;g4B^h=ZMbP@}_xwOA~2lnKtfyXzb?fZ8z5n z)Kj{MYzu+t*gM;RSFxQ57EIu(*5))-jpkgqAf8_RRFFI&Pa=^xn^#@@Wew4g-xv{2 zaKH9o==hlbTAwx0zooJX3(`NZf;kzzZWbjI{AmK|&a**;@r9L@wJ+quBKPxcHRzEvE z^CbrR{$z$%f?A5zy0TYK`8N@7-9%>z_jx8Uf~PfqaY;6x-ZkkUn~{c4Xi8se<<0`e zCZYBJ#8YP*JZ)Vum{d%>bLPcvE7b0I#gyvN?%72`cY&KExEvF;RHa|t<;$T{^*($q znG6^j4W`nS-#=*=(Wo~=r)6Z393y5FTZI{Uyp+z*j?s<8rsNAX8*f#04eGUw>2h+W z{+PcBTQayh8^za{zIXWJw|n0b6L0t0=s0gSx)XO~+?Z--cv@i!c{!7SyL6HEOW44n z(~YZEdCJ7SKbVFo9p@z|?wT~HczAN-z>^wES|2|bt)`GOe5 zP#?`G4M2P7DtYb%rK#d0{m_l8OW!4i&u^N?*_PW-hf)h< zqe2TtV>i2)Ov#e>9|TKrhJ#u(Up0SOCJV!g8%xuR*~?>y=Z4Q)EGQKi;FWW-Iz%w& zxS=9HuIc}?H3g^fL7YPF1^WAjZezb**ggZnGx^_FF+Rd>yiXemdp+~rTOqRoS?H2l z;wnrZ8q8G)a2h8gX*9S@&_pZNG~!?s)_q=vx!b+V4NWg1LZnolPjE@?dq?#8;>(UY z`)FyuKqu>a4fTF0Y}o&OKm!RpX|fa<7BD#Rsm@l1!lbTS2iL$LatU4T75VYs`RL`y z>!Bg36>h0l|4O2S++lFv{W+4imNbW-a2F~5&K;KV`yzrVSUi3Z;nsht=?{uE*LQM| zuQ)KBy7FFf8}p+XLTX=r_ztUE{so| zxlwtXwRG@%=X4mBVD~{{l%M`_=xV0XaM@8y88Wts)1)UdjjY5Fa%#)m`lA%cTno^^1|Lh@`+#2g@^~}0c4LXthvV&mUkJ@?u+PlGIAn+DH z;q4UN5T)T|R(Qnj;*`6cK`Y z=MsLgU+Io^Qc(H5hL1ZppJ(w?uO*T@+uiFC{ZTWnvQLaE5RO98k=j{WCR_T9vz8BZ zEs$Q)A8WfG1|(f9Ylg}4Io?tc`i4-sc-a^85*#5tY%Heox^e%)VX$3RiLE010G-4h zBC4Uej+7mn97_8$KxoQ{RQ)y}nX72$2GKgxc=Y|}cWl;~r6jkSdjw{DVj3f%a$MmB zL4!>CTa$YnW6PhgV#=6zi083AB{U^#j+?8uZkNwihBxjYq4z2ld&`@~qs+;u|5{4? zD+H^vz=)vvr{<3liUazr&^R2kag=(1eL5b>g1sI&%Y?B5q(A>WR+6?77ZD@IDRWh; zNfCzs(&b4`{b#$qhx$~U6efX(H1uNKm`=PJ=Y195Eb`=rV8@^?PpM`j4s0mowX$aW z2x5K6FM9@952KU}{6W&2{;bsD$KB7d_X8^LjDfgr`^F!#TPG^SlkN%3JWz_ClqQ_O9l~g%zx7)<917Hvz$rzDptX4Jq}mz=4r-68{fAWnT&H|~w3kOR^~k4b2IG@9dIH7tq7Neglx4A@ixJaa} zd{L7h^{S3Nhx#wG-gTe^hy17^uj|r^{mt=cQrVTWl|THx#9Rg&?Pa5n*%PHuq;K^) z04v=)TKG9JzHJaH3&p1T5I8t@z7!S^q<)Y0{e;6g zSvDYr@cga|VoBb%({};7h5&SyMR~=tP1iL6fPL%tE?H1vX|iPqXB{OpHdwCU!WpbV zK+_2Nei|@7=J;>L+kxSxME)B&BMjLCJ{}CVITfzHZkBbUL&5{1Jbs&_R=ct~OMd(n zj=)xk9Nk`Wh*sI;4V|Cbq|+b7x|w=dA;m%s59ag%xpLPsGw7fE!c7EeEd-Ws>0*NA zrxyLJ4J7jUZHIACo9-w!h-*8+1IeAR+>nJk!INch{!koSuikI~+w z<_VNAErWp#NGV?R;|HgCKm|d~Fa1+Pz@^&w>e?uvZ-*Ixh>Y`AJ zP?B@*Q5dG*pg|S9ff6YX{%Jh%b6rs6%96ry`P&cg>l|gGf9>0`rv(?3o$O6;B$wa$ zC zyPq=u1b)^ol}~a3+;{JQ0RNljq3!qkkiSYDL=i4NF=N(Cs|-=`kHz(&FhcrFh#s6dxVu+jOh(M&_?;?z*iGl@>pKT2ZJ^ zG^8QT$lN+w)N#q-;ol1t@mzh`?15Due#4rX+|N^YlM@KhXlK2aAqVl3zq=WOGx9~0hJOsH)tGeVUvGR9+ZTgaAHyH#P#0top)!2S@1bGsAU4J!%2@SE zVXFEzlvLUePf82?=%??s5HO2{lrfK(b`beuLZ;>Swg{^bpvVeX$Y)1Wbv78H9PbuR z5$szTOux)A)EFWX7N?ZmibB%bYzc^3g+O~j87-26e7THeI+`;y`x zu7uf_YnoK+-)yZvc{USIF+qQNKBL)W%67KTqW2}`PEnJIAE7%~DZ(9Lhk6(d&sM1k zAZUATW4e91uA2dD3X-A4hl}5j-ykP>mgee}MUjsJzfz zDL>z=WuGXH5{=wBrVZ}aH)tF2Tj8a>rzS)>I^73hh%O(a3y{nB<#uYJN)E?feBOCc zoA8B%K>Us4cChqmBN}~Ff%3C85Yj7Fh3*W#O+k`KL&5UFxM(^~>H>~RtOfTAZ&Is= zryoTa$tJF`o*%AWq%-#oKatW>XXmYGT5C{Td`TR0n@8MJXncG83fCiDVD{Kg$MA?4 zk!9rlsJ}fwpQFZrF>XX1L@}g?oW{MqfEKazt|s`Nt@Asw>iRe1Pl{=0R}#`~h2K4+ z3sk25BhvH&Qg%0i85-uSP&*CmSp{i|FHst7GsJs7MW;gN8OQ475=jN0$??PSVH>o3 zxR{|EQjft;LpVn|y@6?mA4^b4-ip(k&oK?uDMBa)%wRpCOrYY#H(#;#F2`jL)l(wi z-C#0=8Q(tqQjm@rCo@K-1Bhq&p0g7yPCC)gjFj9x*0AafUML=rul&&m5`2>-ns z4&`U^|0pzf75xiDAybL)Rd(29qrVLutbZu-_xQ&GtJMOjFqsv`VRLmNTKmW70Q8Og z0l~1{U}D#AAC&phme9tmQ@iL!w|&AWQ6*ECPd?PH+~6M_uikr5aDiZbqu-Uqej_2U z#Id!An~sJHC=_s^0C-^oD!k3emN6=F zBp`tN;FXFE3{9+!1GnZ6GAfE;z`%GO_9B_%p~_c^6B6=t%s@81CPq5Nh?<6^)UU$4 zOsZIpnY}3;_6#frf^NQF%tqC9qvl@+9+6<5c;R)A9jeoId;CW#*_7cnxj_wHkQzZkDU^=;BeiB_QTqQ>biG75vEK=i}HWlH{TQ z3-alAoW|5}5^HSP1T0^l?tkAPX>>#_6X4_`m3lcHKkOxD(Tkt>~ z68d3jKky1WM8NjCxWV*p?Xkw0CsfBCIi8a}LGW)ysDyyp%6h-=ciL`WfD`)k(S&#- zR2`qU3__ATOsl2?khxK?JMSm|u*qCFo$tYN<y6#f`LXfdL=3nBX^OUP^Du#3bK=qF3^wy0t?_9U#oPoi|sJ*E{ zhnH4&?55W&v(;BCus7G9WQ|l*A{zW0$U<{d#DzQXi*aUZ%|IxpJ}-;Upq$Io=~Nv? z*q;EiU>$`B7QkS9mM_A|!-oZaQ9W zs*3xRlOEcG^fDIh7J(pse$$4A#LTDbdJv|=*_f^(@HoyuE}Z2jjhc}CIpDJ`MyN?1 z%i!l@#JeA52-df1YNX+)H+BU-6P3@!QT3wgv5V}ObAa8v?jKAQqyDXkFex8VFX_DU zAtyB$B%?D<2paibq0QZhCg)>$0OeDG)cMUM@vMlRgi^W6M!r2wCw>U-*`A^Rf+OR% zRWS+vd?X9^YDaMsyE;7nrM{F5WFn4ajW)zL+jGyNkkoC38P1}a4I5(#p;aw(ulvh3HL#b7FfI+~GI6JL7|w zccom+11Nv;Xt01i&EK&VK`;+1l>zm-8|mUJRfv& z&e22a2&*G`QK?~Y*CEsd#HoE{x+s+rUdtGkUTF))oAtPN%SJt-c5}tm&=$;~ErYaM z2AW@5Tk~J~5SuTuwuxp8uzJgrZzeA-)%Ma0AF=!1Gp?A2&RS^Zgy__a7p$>Lk(HE~ zkDv$7C8;BBm~|?ngyJ60hPYWq)_@?jk^wI}&=Wb}!)1W@qG}VUJB(E+HJA zP~oR8(G1n)7zw3DLk^fKtIXeSJX?SSVL$?3+?Z!>B!^NuX#)gOzETrcIJk|T>J|Ft z3}j`zm`m*X2Cb& z@5FAfKZxSFQn4Zj-;cSHSw|<7ZCU(w*Y|xSQq?2n3_U|L*~H()r6ph#S0ajpYB6^z zHL(vDOy4dS`+uZ|d@T=$NDab()XAVH8QGM|Sr0o`PF6!OD0r*!f8g9Z2-B{_OP=08 zc`)*d?a)%@Cm)0Na4=0w$|AIRA+jL+7ZT2BH=Zmm9p4t#Bm&Mn8ly3^0vL1{D5 z7wy)Xps?YHOdqC~Lmi%5AH-yj$2Ny5O<@-E-pdeXkXV5cgJ9jHR3m1V-xQa=e|N40 zGG5La)T^gS+IK7gDBWKR(D+I(>56jD8$HoZoZ7HN!1{f#tiKEaYCC$TuI?>PCim$m zj5U>W=C$m-4Tm#&oM5h8gjY0)PQswvmYD)~q+)McYKePHzEFOlfL}wwgOUK_Ml>z% z5?n^{e2KrvfF(47MqPr+qZy%wOl}pzF@Pj?whL+MkYY!?!(@6c@Ia*ZinTQ#NmEL` zngily`m|$i%;fEaBGYCXEG43LE^8tOb8F=N0hkyjgeo~m1@z4kB^-|Re5H0rNRzFs z?QlGyVIBI#WtMn6c~33^xywUqASFFRc04)`N{}&5uH zqSAv|6WchCun6Ncrbe&HS(PBkq*U~m(X7Uij+~F^>tzB$Q8;F`!b+VU#^=}iA*!Mw zs=<^fNrS9B9<39oMMb8oP?cN|7#My(UvdHU^-Oyskd_N83021YSO3FfYs^oE@c!B< z4J;UDC=?tFQX$VUv0h#~KwLyP`JCQLm0VTUb^8Rp+OQ{>#dECjTi_UC8&SgjUF?o`POS_3RodRxcKT4<+I;c8Sx&qN+h9>( z(U)(Ki&z<;@SdEBYh)y{rbJGg9*avpbx34|ZLAvgwH!mbFRDyxP~zIS5l=bq7u8yolI^-Epk+W9&Cgyl$% zKr!HBP%h(YIJ-8fv%kr8OMFsfkwOoaFzg&I`k#fDZzyIc8F5NA$*?9?khHj%NynaV z-E+HrTpu?-p5a3q#$acqqCC^6V*g4y>a&9Pz8sQ@tG)b3FqqN)i|0B1pI^BL`eH~@ zs-#lHOVR?`i|PzU$gNBdZ;dD4q?uxp5RjAE8mqn z1s2&5tUeOwt=7i?QG~?AL&E19H3G0zYL7DrQLsSTSVuxi1nLE{XVmh_stJD~Z#&`G zb6yV7-WJ{doh>F`xMoo0KJ9gX^sf`Yr~(j)o6Wk(8FfPN;3KGCHKT)Dx$L6RDUGbj zlm;twxX8XpK#K7RM|k4vrI|=(aVd!$37&_+zgYdSUR7`|M^mk@0aeTAW$vF5D|=5O{`u?6kdMJOu*g<3n1mFP zyj*yEY?1m-jX)j35#=&r1Zpm_>wpSaKq@<6IvdbKPz2G~g-C}6N|TOgjPAVW7Q1dJ zi~>S7i``>iW=jDb-U!R`ZzajeN`-ZmdRFPyAG>pjIn!)WHJ0HaPH;XCNnVz51nh@h z_fYpx^W7}V@dRjK@ZZWx>I044Hsc4RtDKhc9+Ftyv=MzxTAh0HQbd`;`Ubf_Pn+H^ z&o(}%rWh`s>B0|7hVS1|&~G~jr4Z)ngs5z5C~4N$$~~A|v9pptQy$`QVYxRC(bVJ+ z16Jp^TL)K@9zT9>E$P4QHN~K=RKcjt+F7>|d`fp;oHMm*^ze0Bc&(7P1g+ufsDx#d(@!X@ zv>o)>oDcGm+eQknkqr>7;sI*l{RLYOJ)NO?5^`#S`V5{W=vIyPOV4Nh;0FPPFC_{) z)!+pl)S$hpTw>PTf|^kWLfEq>=L5VQFE)Q}b#iy)`E2`X%L01HeesSorh}}agXtGG zI4`#x&Sm6KD2#L{1+kQEDMHM~m1wp)_jTfn`?eA{`X@0)NQuv0UnFLwfT}aT%;MnTJ7$-gDnW2wg{f1|jS1vVk!b@;Zb9BEFlg_9m8k zS18gH`Aq~Nq0$|d8#@MR9Ck7dT#CF%nx$=)M#eV>SSc^`?7L+`AXMUpR9*gWmWo8X_F3mgh#*_f?)9+4AD}`q9B_UVd26MKAnnHII!0J6&^n3dSg%!JR z0`MEl=qTXOwB;@J+)elK@4wp;`hclk^l^-0#`4WO>lrdK2DOX?fc;Ghi_90efYKoa z;+Pwe6Ikh?el!?i$h|-vOn>!WlEhBv^=$j z+BJ+@#~80wk$TzTecef?f8l&7(B>i(fEcnXygc2KM7GeVNyjUPJb&fK6m(JH1|ag> zKTGTYSN-L7ILIZ1{`$8@-{Faw+eKooY7P(ct2oTe{V3lc&{+SE7J&bF zR8if|Kgmy3H)pBJTh{s@q0J792%wP%=piCGK7T$oKuhIVoG;(6{{SQb$j&{xu@f*z zqqC5xilx>i6U2-KWkswg0vBGXMF?D}G9Zi;#W=s`rxVZhqw~YRg?yFb4tHJlZ8*N_ zABXt63lTY5f(v!sQa!MIB2Gt;h*CZ%DM<^M41aG_E2f;OA0hmy<*8*v(XaqEN))o9ugX zP?);tA`yw(@B3XX67Wu#)bI6CeH03+Cem(m;JghavXM7HFZ? z7_mbB5E0h!DT6{@@(7!L$-vUN_N#LeQ3gJaiIwo zduw^_18D0lPS>iTp&ULvpLI&c<`9Iw?yW7nA7F#Vx5z}dx*EBw{0g4v0p|6rw5+>j z@-kNgO^}J@v{?k!QxHYU4@%H({}q>|U%^k;7DbQj=k7a67I) zXMN!{J&RR}Kiu`64iy=*XkXs)JTjz-@cSN`9$sV5_{`s-OZvG%QdoG5Ejt86o;T?`SLGvOz_6lFt z6g%Uz+w&LZiF4Fo(c&BlduPy#dE6m5&y|^`wfOPli)hX^c!i0*hPrkLgSF^pBcgK; zNE19|JpIxUt&-&7Co9#O>J^>GjphSSc_wlS zZe|-^IlZqTb<9ql@lwY~C`-6v6qf6UT(F#^MmpqyD2sl-&WFP}|Ahwy>EDKK^pLOU z9JLb7*}7N;`USe5w81BVFT1h7_gDF!4?6+isD{syE=*~5pKQzDdRpAda*d7Qz(EwR z-Q0Gw=lgX4$Q!~Ijf_Z@8V`!Fy0ue)oT~R?8~1`xLnb~_Ed@2Dv@nu0j?pq&0eQ^> z7X;gyGBf~3(zKb3)~o$UMpb`U%^}J4FxH0YU6$JX-4Xp13u`!noXOM(sF$?IEq+}5 zS>C*^(j$3TqfPfI#B_vRv|WNh@HflefU+kE^dn8v=46GqpU+cS-mDj_cm4`!z>z^b zlCysq6;c1Es?lHry2^q_wWbE^7Q3$9th>D4qcoww-9axunwS0F=MS1OaJXGq2TbKF zW(5V@wY}$OJK;{Ypb`Z-9k1-cPWg6Q&7njY#GBWJdpd3s=g3;1pi3rj6(Vnh;G^Z; zK_vGJ-%MO?HXZQkwJg&|8uA$Y_d>~$Bw|jq2=%Y@L~%6xm%BrPD)%qMdbNpt-ub`so9a+iPq)3&~WccV?rUS|5+f|al1Vo0KHo7g z)s^Xbd}-hQIA{b2yl5`FjrIx>8lAiNs{mTNj3m|m;lT(ST>HOZno1}lSGWWL4sQ;E zbgA=N749%OgFynX`K_cN_TDh{JVdu-6sG%(i}j~Qx3ia#r-VrNBH@zphVTk2Kr~J7 z{|y8^qyQ7jorwF#sCFxxP1rtu=R##s_1OFL+=2tLPU1PRJNTCVmW$@ujZtYMpsSFQ z85or?6x@sWa!_7#nT5ivp^8lLrMxk&C}9-j2iV10U9h0C6e6ynyh#?v8BTZ8?X!SK zn!D*v`D7Zx6sIIrLF@gtOq}2iGzvJST__F92h(+pt8#` zajcc-c&PDfyS*W6LDq$f#rP|MI+Pm#rVo^s^J4drGAGV`sN5_Jr>1{TK0klu^c291 zU|MFtpi@6d+Mm?%sJ7E@$CR>I)u;8jbn8Z1Xe*L`{5^mqQi6V`;p8j==t%G2@1iRX z$5^)YJWXjINNL=DvXI-ANZ&=@yw?pH*6pycxOD^^HvN4BnGMtW_l^El8@{{xbL+K@ z<8H*|{ZMdwp`Lh3;amF*sFS9z^?FqBts47Ke zkTn%P%^r4xejgv(P)|>derBn9Lh`IKowcXkP63&q1>aK`9rT+lcUTd(1>^M1PskxomE80LgC`f?hR#J5Z zA=Jzw&lvL5XHe>H+Z(#`bc4r`BKfvgxfi;EZ4&3g6A<3@Q>lNrg7DuTpR0+pAai_y zx&Z9ce|cRZu=ButWY7^~AhWK%=}hED@XvuGt7a(yY(9IL+J=eg-y%kIQdsj11=5tz zoCFCildt7wK?g4JQvGPw&*;s#!cY`_H~}x{(bpnHz_^AicL!M2%+$veUWfKuZpFB3RKV2dxh+>Oel_9yUaJ&nv zmBb6&3vcF|uUqzyK6WjC&Oi1&wr|e4r^#(zvJ{9b6?8ww{&WpCn|$Gb+<74SZKCxr zBnYsEoz2eWmXWM89zFP@ikZ6R@n9>NZ{#mZ|-c^-~trQ1bkJ=AgT^iLMkL-tw zK?zx@Emt;e?KWDZmZ`?l6pOB=*q2`t@8B{02l&x)j5&o0Da4~l}PLFlOLdcq;DuRm+NDIz=pSD2H$iIV)~hc3{qDo1Fx%+y~e^s}oo^F*67DdYAIgf5VFi z@C+m`tp3TL*ilDTSVZ6q&LMgt3AWDuqwEV})`s)bbU&P`Gns7z1Zmp`L}j3%ww zUyRr;XoQ@}D)wYUz89~CK^0v}I@YtDo}?*jk$0&#<$Vfw4xmglm3;X8#{(eVx=XIy z?l$U8gzl*@@fAa@{9wl;5wX|XpjWTR=@w#8aM|!D5atQ7XaeEvh|8e?G=4w;rgRY2 zAz7c+rcSlRI2=>}Db=Ivxgm+jfbs)1yGymLvCvTB5OG4~D5T6BsH z-{lYPY7Zz~1EvMB_{l5#f|Li!j+bJggx3&3GdGG9HmmeqW4Sg~RU9_NV>f=c(}6*! z{d7v~1rC&o{KRvT-YX#BaUpkcGsL^9<5$%myW;5qFU8=~@#-$i-i`)*cv$kZP#UbE zJ#99MrDQZ`mhkli%Uu_6B6YmV@1Ps_*jcTwyy^!)SOxHMK_-om(~U`Gh)kC0%wM5W zMD@65HzQ)M>-mH;H}MP z(-(1~Pyzywh9{V+zCjmN`4j|MukB}*3fEZiXxy;eYa$b4TPwE?zW`QzhHH1vsCh9~ zyz1&te%+XYZ$aY5ElU{W`Cq86lm$u0XcZh_qo!t3)Dc@QXG6_0IvB`N^+@kbsywsD zp4b|RC;gjtrX)`GtlREi)}`mM8aVVeA0Iq@WNt-6_3igq<*b|+q9Q2$n~>Xr<8J=p z7SN8S#otxKXBdYnk~$5~NYImKSJ`IwbikRV2<850uu-aqidAnWg80@xF_s2xofPY0kDYFo6sSGJ12JMR?Amf?(=Xa}Qer5sBb?yB+E zmr-Tnd=9Dv_Q78Y=KVhgB>n{Yr*^wsfF92wgeWq_*>RXArB}K>Lu}6V>oV@!KP)~{ zjn%4er@Qk%Cap=?qHv5f2>jX2ALS5Xom`_ssRSpHQb(L#H?HOuH1c+SeIpRUkPitE zB=9lY@2)=&lf2DD{=?Ov6n*oP?6CJ|3@8P!Hc#YBvL$2T_2TyuD`(WcXV_n&>okD} zxe7Gmgb_qj9sB4Hor-~#Mpy`MenAN#iSg5S({f0#s&STpMU^Fk>W zx)*(cr^5sgKD%?W{#sJD;=vSpE&m`PLU8BU9j&wM{DMH*{8&0KxD)mP4G(`${i5d7 z3Q0<70#$S5I)8zzmBPm-IJbUb7MwWWFPE!cFwWfioM;LN4ouPmq#vUMB6#HJ;v}ia zlF$ zv?T-J`g9S5Gd$CQ=c}Q25L7OO`A7v9;2bVgroMfC+Hk3uYwZ3vqltBnuj3fYJ{)Eq7JTA9uVx>^g7rI*|!8Ac?*R zYi5tVttha?pqrmLVkqIlXY~GxK$OI!slA&W+UP z8Z^YT)S+psB2G{#Xqy6lrYt0?ml4Os97`?~Ak}XdB7uw*7dZ!bEpkY`oT9VhG@i

lH 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�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 diff --git a/dev/generated/examples/compressed_sensing/6384fc55.png b/dev/generated/examples/compressed_sensing/6384fc55.png new file mode 100644 index 0000000000000000000000000000000000000000..37d71f20603bad22dcfbbbc5cfcf73e17b3e7657 GIT binary patch literal 63894 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%0D`hh5#ee{ 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 H2mk*AF{%&K literal 0 HcmV?d00001 diff --git a/dev/generated/examples/compressed_sensing/a03acae3.png b/dev/generated/examples/compressed_sensing/a03acae3.png deleted file mode 100644 index 1c9a830ccffcf9ebb8f4bece1f684de43ecd5f33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33565 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 k`~SWD|LU{

(256, 256)

This produces a 256x256 image of a Shepp-Logan phantom.

In this example, we consider a problem in which we randomly sample a third of the pixels in the image. Such a problem and the corresponding measurement can be constructed with the packages LinearOperatorCollection and Random:

We first randomly shuffle the indices of the image and then select the first third of the indices to sample.

using Random, LinearOperatorCollection
 randomIndices = shuffle(eachindex(image))
 sampledIndices = sort(randomIndices[1:div(end, 3)])
21845-element Vector{Int64}:
-     1
-     3
-     4
-     5
-     7
+     2
+     6
+     9
     12
     13
     14
-    20
-    26
+    22
+    30
+    37
+    40
      ⋮
- 65519
- 65521
- 65522
- 65524
+ 65514
+ 65515
+ 65517
+ 65525
+ 65526
  65528
  65529
- 65532
- 65535
- 65536

Afterwards we build a sampling operator which samples the image at the selected indices.

A = SamplingOp(eltype(image), pattern = sampledIndices , shape = size(image));

Then we apply the sampling operator to the vectorized image to obtain the sampled measurement vector

b = A*vec(image);

To visualize our image we can use CairoMakie:

using CairoMakie
+ 65531
+ 65532

Afterwards we build a sampling operator which samples the image at the selected indices.

A = SamplingOp(eltype(image), pattern = sampledIndices , shape = size(image));

Then we apply the sampling operator to the vectorized image to obtain the sampled measurement vector

b = A*vec(image);

To visualize our image we can use CairoMakie:

using CairoMakie
 function plot_image(figPos, img; title = "", width = 150, height = 150)
   ax = CairoMakie.Axis(figPos; yreversed=true, title, width, height)
   hidedecorations!(ax)
@@ -36,30 +36,30 @@
 samplingMask[sampledIndices] .= true
 plot_image(fig[1,2], image .* samplingMask, title = "Sampled Image")
 resize_to_layout!(fig)
-fig
Example block output

As we can see in the right image, only a third of the pixels are sampled. The goal of the inverse problem is to recover the original image from this measurement vector.

Solving the Inverse Problem

To recover the image from the measurement vector, we solve the TV-regularized least squares problem:

\[\begin{equation} +figExample block output

As we can see in the right image, only a third of the pixels are sampled. The goal of the inverse problem is to recover the original image from this measurement vector.

Solving the Inverse Problem

To recover the image from the measurement vector, we solve the TV-regularized least squares problem:

\[\begin{equation} \underset{\mathbf{x}}{argmin} \frac{1}{2}\vert\vert \mathbf{A}\mathbf{x}-\mathbf{b} \vert\vert_2^2 + \lambda\vert\vert\mathbf{x}\vert\vert_{\text{TV}} . \end{equation}\]

For this purpose we build a TV regularizer with regularization parameter $λ=0.01$

using RegularizedLeastSquares
 reg = TVRegularization(0.01; shape=size(image));

We will use the Fast Iterative Shrinkage-Thresholding Algorithm (FISTA) to solve our inverse problem. Thus, we build the corresponding solver

solver = createLinearSolver(FISTA, A; reg=reg, iterations=20);

and apply it to our measurement vector

img_approx = solve!(solver,b)
65536-element Vector{Float32}:
- 5.479949f-19
- 1.0197881f-18
- 2.3187864f-18
- 5.21343f-18
- 1.11894665f-17
- 2.3435446f-17
- 4.9866213f-17
- 1.07909926f-16
- 2.3241126f-16
- 5.017118f-16
+ 8.034031f-19
+ 1.406842f-18
+ 3.1647723f-18
+ 7.2798826f-18
+ 1.5588576f-17
+ 3.2338676f-17
+ 7.091761f-17
+ 1.6379288f-16
+ 3.7461387f-16
+ 8.232712f-16
  ⋮
- 4.608231f-16
- 2.1284327f-16
- 9.824584f-17
- 4.5602487f-17
- 2.132212f-17
- 1.01756814f-17
- 4.889565f-18
- 2.3502145f-18
- 1.3239986f-18

To visualize the reconstructed image, we need to reshape the result vector to the correct shape. Afterwards we can use CairoMakie again:

img_approx = reshape(img_approx,size(image));
+ 3.6059794f-16
+ 1.7738818f-16
+ 8.813207f-17
+ 4.2510688f-17
+ 1.969455f-17
+ 8.702172f-18
+ 3.742035f-18
+ 1.7658197f-18
+ 1.1275466f-18

To visualize the reconstructed image, we need to reshape the result vector to the correct shape. Afterwards we can use CairoMakie again:

img_approx = reshape(img_approx,size(image));
 plot_image(fig[1,3], img_approx, title = "Reconstructed Image")
 resize_to_layout!(fig)
-fig
Example block output

This page was generated using Literate.jl.

+figExample block output

This page was generated using Literate.jl.

diff --git a/dev/generated/examples/computed_tomography/index.html b/dev/generated/examples/computed_tomography/index.html index e0a423a..921cff7 100644 --- a/dev/generated/examples/computed_tomography/index.html +++ b/dev/generated/examples/computed_tomography/index.html @@ -62,4 +62,4 @@ 0.0

To visualize the reconstructed image, we need to reshape the result vector to the correct shape. Afterwards we can use CairoMakie again:

img_approx = reshape(img_approx,size(image));
 plot_image(fig[1,4], img_approx, title = "Reconstructed Image")
 resize_to_layout!(fig)
-fig
Example block output

This page was generated using Literate.jl.

+figExample block output

This page was generated using Literate.jl.

diff --git a/dev/generated/examples/getting_started/index.html b/dev/generated/examples/getting_started/index.html index 89a3596..d358ec6 100644 --- a/dev/generated/examples/getting_started/index.html +++ b/dev/generated/examples/getting_started/index.html @@ -9,4 +9,4 @@ \underset{\mathbf{x}}{argmin} \frac{1}{2}\vert\vert \mathbf{A}\mathbf{x}-\mathbf{b} \vert\vert_2^2 + \lambda\vert\vert\mathbf{x}\vert\vert^2_2 . \end{equation}\]

The corresponding solver can be built with the $l^2_2$-regularization term:

solver = createLinearSolver(CGNR, A; reg = L2Regularization(0.0001), iterations=32);
 x_approx = solve!(solver, b)
-isapprox(x, x_approx, rtol = 0.001)
true

This page was generated using Literate.jl.

+isapprox(x, x_approx, rtol = 0.001)
true

This page was generated using Literate.jl.

diff --git a/dev/generated/explanations/regularization/index.html b/dev/generated/explanations/regularization/index.html index e0bce7e..2abb476 100644 --- a/dev/generated/explanations/regularization/index.html +++ b/dev/generated/explanations/regularization/index.html @@ -55,4 +55,4 @@ plot_image(fig[1,4], img_prox_wavelet, title = "Reg. Wavelet Domain") resize_to_layout!(fig) figExample block output

Generally, regularization terms can be nested arbitrarly deep, adding new functionality with each layer. Each nested regularization term can return its inner regularization term. Furthermore, all regularization terms implement the iteration interface to iterate over the nesting. The innermost regularization term of a nested term must be a core regularization term and it can be returned by the sink function:

RegularizedLeastSquares.innerreg(reg) == core
true
sink(reg) == core
true
foreach(r -> println(nameof(typeof(r))), reg)
TransformedRegularization
-L1Regularization

This page was generated using Literate.jl.

+L1Regularization

This page was generated using Literate.jl.

diff --git a/dev/generated/howto/callbacks/1dcf3132.png b/dev/generated/howto/callbacks/1dcf3132.png deleted file mode 100644 index d98714a76d5575750e55c6c440d0145f1093c6d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179641 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 R89Kx5zr=MitWEU+_Lxl{>LKwF&ini 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 diff --git a/dev/generated/howto/callbacks/4a366e8a.png b/dev/generated/howto/callbacks/4a366e8a.png new file mode 100644 index 0000000000000000000000000000000000000000..a13960d0bdaf21653d86d92d4dfedbbb33a832fa GIT binary patch literal 180800 zcmeEt^;2Bk((WDxcS(@ou0az#xCVl|I|P^DE+M#ku;9TZxJz&e5Fog_yTjdi&pF@u z{(xI`f4Rl3Vrpv7nmygUx}ScYUZDzdl4!`UkO2Tdla>-w0svT40Dz(+!hr9*Jc8zd z|KN>eB*lQ|zkk`Sh4BDD21ttutGJ~fw7Pq#PBlJ1YkKxeAtJ@`kV7G2>4haT7FGx^ z>5!2LFtMb{w6sMpm+Zc%-|x3BFU=j-;ue?Hr3ul;0g5lgen%nKIa_9=NQ;m`A=J>+ zF_P)y=-R7KjsZBB9ovtCjGE?$wKID68>KZfHJPCfqr#Z5|GHMQBQ5~M0J48B?piW( z|9`zC3jwI8{&N$SUl8oSZy|$;i4pqu`(gk#_J2N#C?o>&pG6^3QvY5Akpe(M`u8^p z!~Xxp|1X;*JMsbuQGPM%?&RboBO{}tqT=Fm)!?u$;UV^q(TNZ|JUv~Hmxzgpbu~2b zU%q@h(M>L=C>1XhWITU0=KFLW5D<`_p3Yd_u(lS?A}1}~_;5BfQ=u<7Axeq32J5)< z>)ZL5pl`LPwDf>fbO>3@^-)7Om4rL zv!diC2_TE2e0+SI(epgCkM|hQ5m!}J1#j=6NB@W&0$}i;`00y;L`A8oPI=$1lRn?D z_}&glMTC=u;0!H4UDd0Ws6}4TAqH?OE;!HV`XG_h&`8WUUvHjm4w1TV#Kz*|IqZpu zz^r!i_+E@lifbw+&}Mm^?TqJ2Mw2}5%KPqdX0u=gaGzH)?Pq!(t)_GIN_a5A3KRKi zX=$mI>(CG4(8&I&HkGlnv(wjKt{D^fnx4+Iw`l%O7!izjem&pE%RmH-ursc<(@6L8 zEpc)2pFe+kAA2tIT`xF^KY|b3*V)+_OGqh<*_XBau*G%Ua*pmdZ`baf*C&G6bGi-Q z@kLv&)>2hbF*b)Ttzgk@JrYCUCcDVa%F4>xnke-YtB?xZlq7_l*7igC_j5B3U&@=0 zcolaJ4VfzFziymcsY~Ixe~y+K=D7lN0{%g}L=Y zsoo3pZ9Fg2+V9{X*sk@%`em1)cv|@@(lmC{Fm0dn5ia?q6wsKRUf?g--`N39c5YQ+7Wo_Y!GZZH~IoOQEU4Z8+N2po__LGzO1A_pWSymyJOg1s5^`#r{bFHwxh z3;VzRrwcnwQOx+LC3%l79Gv?VbYnMiJ7^egGvlPPnwKhhrE*%*Tw=3 z%uo(yCp|dwEtk{UfX`WcR$hMozn1bhF*9Sd7>(^mef{$af*@eO`WbJ@`+AY`9Z>+899fd-NCw~a zQS)(~4WW>V%5R?S^!ThS7Luckj12w9J#|vI75`Wg8V5^ZaNXF11S;fU!yw`_6!=_; zNM3hi3dFUZlgDG<=l)pAh^jsk&*3bNSh5g~Xao|smG6a_*qbcgyE6CJ$IEp#+TPxe zU~K6sD3I;7KR+I~UrfkQa!ITu1fnf+&(O_uJ!u(e_GtnFLo!zZ^0DauV1vBHu|y1$pJb#x)T{hpuB01 zp}xhqFDjmw9gN)JNW|!HmbO2y?dI!7e0LtNmtBXH3+3MZH5FK|);LzU@Q?QQQTX9z}CnhGqeDic*E;!%dkXw|_X)^~VSV1tt z!E~#nuCA`3K{uGJ?{f?83(o3wa>TU;1vND_Wo632j~_n@f_bW<p%mBm2i42 z5$~s+02F3>E(oRLW}uwlVG}RL?HEI<>CVE@N~Ov_os5T?f!`Hn*-M0 zGIYAzxRqwLx3|}Jzj$0wSlFBxmhEMD%EGIC3XS3ikAK(3(j} zxV?XFPS+oo>HjHX>204}U5{sLXc-uaD=S%PXw1Ouk)HFvfe1U-KOP62{{IGX%po0S zu(^ob(;}{|ckl=zseikb!z_e(vy8NM-i?%T4Cb4EBPEKC&?zd!wqaWyBz1B`BRbzT z`HT(52`}1^*nqA3?d0{686JWry0scd?5+C&%zp!{koB=XYz%<{)Kx?TCK2LOo**#x z{|(6yh0;KD7Ba@zZNoCLL@u0uSBaRvK4olDCW3zHie44+$*I^*;oV>-ZNtqweWSI6#7?-x3Q3P%7;C)>&{tC=IGvu4)z z_z`^G*yiZ};KFn)uR*w;LhUzRsJH$}D6kGXH*boe@GF!`nw5yecWqFCU05?eN(Qg6 znowoze{iClwt&Au$HQ93NvpW+nRF8R@O3gL9?}}e$@p4lpR{FP*OLco>hHE=0C$Pi zi$XH}&r$7-b{9Z{#q_-fc84WAI-gq40iv0VRsplJ3aw0@O0Uxm5^x{^gyD;12&7-_J9W29t@o78=VI7*V9JE;~Yw=Gw>|HJd z^~Ofq$U7*rcIeQ8txb91CHN;YDF_&GdiqxJX(armeXP%gU6G+na!-}T-Q?S69jsl> zaKkom_U5uo6AO|CcasZ(i~k_pwND24-N14+`C5)YTr$F%|40YEvBKypE7Dy=zSaH~ z6mfF*DQzVZL=I{rfYef`BRwC^^)6qb`)fSJt}(XZFTk>xIhIy%ABn*Pg|uSN z_ccjr8DUp>4fddJt`FGxHENG2D=X>qE)5190rN0el51b@`Kyao5J}!#%ai`gUaCA> zO`SLx6b;NxV|E1vnV(~-j>|*m#4~ajtezl>D^MsCv&-Q;(0jK+?Y`?;2;@4ydZA(;6wWMdNnGg&dv1M4U?9hySRN!bB&fbd2Sg z{Bi_yLk$ZLApd^QVLkX7zczY(K>e<|u`4E}ax3wzy_w!=Fs{$HWF=P+C;zLZ0L zKm^bFneC1Dc3k?hH3EPhgbKK;-Ye|#CrQ$(v^}ZZ=GQPT>*)K;ju`DKI!+M*E8d%U zOE>rRzHr$Oahf^qv%d*D;9E=R@bABP0G5tQ>$&v64PUMki5qlbmKOCD1FSQOAuftZ zpqLl)En+JK(^h+<{AX&)hY0$pFyORaU#Yt=W*t8 z#nY5cy^qZB^~dWaloQ1k^YKX62h;9A05`!)`3KAW9!zi4on+jP$0B0VNcvj@pANFE z`>`cQ34u=%9Agx*5CdUFNVZMDB!Z(34H)u?2Ibzq4X7(HQuh!#)UX`6er4K?T9yWt z&?vQ>PX+rt?Th3dMRRooD^|{+{cXg)&eek_|P~%HgMp8Z2V-lc#Erk>Gkv^?~V zOLsxjgZ>3PHTP%evVm+0mxK@HANym7!}|`3)F|TiB?9P)smoAkGgw9XR^%V(#p*EM zJ^k`}mPNI5#_Xh=)ph3ptVi0^7rM{G-ZRvzun5=%TfdHolZ-C*uEq5m;qhCOF@w=K zpN21#gwMX&GXfGTN}1d33x1$uw_D33nNnBGof_S~J@2^PE3?`VXUTvA*v75u%3sqn zL>UBcEGBQSvYPmgU&meH3BG)@EdMdeM)O5ml$k9nKo`N|0|!{{J?(L(DOTmV?23jL zzQ$!~ECzNmS?@5~z3@l9vUELY{R*u}&aXWm<2)h1pVq#Ka~z*+a~P5k*03#} z=D$5YSeHUL2<9~T(LxSzai(Bq( zUekr|$CJDa3lvbls&KdJKB#WaEW3?#8{jcZT)h2sX`H|P0ou`7vb6Z)MrRzOV(BTz zg7bK9BJH&mx0|M7=)&AWHO<<)km$vQmJ;#bFA5nn@a6J_Jj1ex(vAx$NOyf!P=s0Y zRuw+LtZ%<;DpTWs{L^lCGs?&HSbbv^4)8=;a+P78d-rxVLo6PZ2yQOY`bK@Pmac6* z@Vol_*IUfnA4fm5Gi6puUDQ1^(&FmZD@WeYTf>y4z)Ib_A zes4Pa!Yla1B1&~xEiJ)zyu_YvYi?|?U=|6U*WVPh9AZg@W9|8=V*8!B-7K@AXHI?E zaoMUG-5?b~{c)f=N+(IHk&>^I>uKUTSg%Q>? zkUR(GHJ$()7&os4=J;ka_G6(5ujdpo3^v>K4+Ir%E6~77>6Pr(X#2Ph=#YPNnGD-! zJc<;sY&y&;z1s|^_Usr>#?@`U_{Ou`DF3^?;S<62NM+o<-E~1FCDpJ-wb&0gpV^7s zmok>g0PEhWkwNLX<$Ag^V{D;hoNI+(5$V6?|29o$EUb0qHDF67@7ZSx#UhFw42Wb z(P(zoJ>9HPYrpzo!FrtY6==KDCj^F@Ju=NxicMbyJ4USZu02SLZ`u3($N156O@1I0~m7caBZG{xG82&X3 zh5vxtchPRraV>vt;#&>KASUN5q$rg@E><6}{$+==T|G>SUX{suwLU<{+>GFd{0(En z$=us}kwd=J+m^@gt6eK$NBEErkJC8U42!SWg%bNcGu(9AWjh?Jaj4Gn472ynUD&d6~6YSF*ci0?%H~;X35FuIr z93jPYxtJZ2^YA;qPg40k4RJ?pTXJW2&y(4<}SjhCmEA~zgC~D&gWokQ|3P= zVbjdidhSu)&vLW$rsmG_oSf+{&%u94x?M&k9E%8}u5EXdBCM>1G+!`($3-O6oeCck z{hqtEe07*YDKU&?d}OoSZ$1XhTN>132=+x%4yk$D{|5>zyUtWUL zA#X;o?B5~Ikcym654`uV+$^!O)&0ccN1ObN?I+mqE8X33_j!1)575zfI4=il9SU!-b_OwFR~j;S~Lh+(zIjDlUFF@nx|66CvQ~ z8;+0E(fHc92#s%3_%6thJPT}11aN*>aI1#=sKNg@-oZP>{K03-8&Kub*W!0hDKE9<4{w0EBbxEy^mM3@)gfSzPsPyu%A2dZx%{i6NwLz2MQh8QHeq;0itg>T z^QQXf=K@I4Y*XEjBK#Pi39F~m7k+EsXZSMQ%m!VSg;-T6bY|eeU=btw41XwHH9tvg>!|j1ht9+Jq&ivZtv($;E(Y!r&Vt_B1Jud)$U> z??w9@?k^YncxlcOzm#Y}HaM>~on&ADcD!-@BBKRivTvH;&fa(V_5WDG!EW$X?l{%v zRx{c7CMmG2fT;2xdR~t6e@Z$vVj3xG77-edkb;l+wySY6!<$2`<`51rEmwvZ8x;8* z?pBwCskbt8M~|{F5W59%wWcOEH|l$~3)gK_(nhOalZseJ#3q(<5y2R26odrcjY5I! z{imuFxLvJ`c(m8d)9My|0ab8tiqiaGiW)m!4Ue^{#V`VE%74X@Dd zPxsZiB=yBu*@BzM>{BCvPP6!K^fn*qKBu4x^46^Jjk}UqdvI{LI<-FuM|-9!yoXsi z0PY14hqo;45dB`_eFm0fH=1D3XTRo7I@t+dq3%fDi3#7TsvkcOfkq|(W~|&n3m*|G zdOgBqQGYwAxr=6mB;a~M7OpiDr3oKbN2Rh(uoON~g1z-*>Pdc}?^FjsGMsTxb!bQJ#nX2hF9oZElihuZ?1`6DZjgep9afrix2c{1fHZm9n-e=OVA^wJ34} z6O<^YuX6t2c>TjXom-r!VegV}f+QM(2^TJyqU5#`Sji~q{R@pOVQ*6o%du__=Wd6u zve73`eoNsb3k~?ich_~~a3cBfRVf(75Q7&UTZ!tw)db#@tqB0R*I^CPb=T-r9yE};5uE*mG^L-^;-X(n|4}l zeP{d+{B8SWmU0d82^h8s)KirxCUVvS+=%Tat@E{Gv0(}h}k> zA|;BPza1wCj=ge2jn_j;pC!E#2M&t)PM6!jo1gTF zc6O*WVlWC?DhHOFI%=(_7pm>8g4>05Zo0~d3C1Gl-moD|z;Rt_wMnngc1?(*iGVKjO9vtfUlcw7!?MS9mM2E-%36{cD9{~2tE{R zSq?>0_lbTgw3d;yaj*V*oBxESfw%#{MzT|Ag>`K_G>EZ%uGiS znyp>VfW4?k z+kCpBc|ypact@bf`L%*7n+PM<2ODds!DhktFU_{TyNSy$b>RVrDj=vx!DE&Qn6fLy z(@oUn^qeA;U-mfq)I48XkDh0n-ytdb?bfF{^uTsQ3XzEY7y@)OS%=a6p5}j5Anj&( zXa~F))7Utkmx{X7g|j#NX4L=ojnmWE-KwpXED=y!vW(9aRx&Jzw{Z2o9dG4NSUjVr zxtxDV7`w&YJiyxP5eD-pRl(1th%S4$hhWer2{kCNkt}(-h6B`7UzRQ0?o7%vwIB)U zd!Pd348wXSAJ9wnZyCoOuL3+R)dd{)(ZX*sz2$l+(QWS^5{T#xi@snB6gtBEm4>}& zEXG-3Zl=*zh2@|}2-b^juk(`^5Xq@@-f*;#9x<&^A|ZuLK=4xsJkGIDQSZh$P$s5q zqSo2*Reti*&MXTpPr{%Z8wDTLb5A(iYczh}6QFlQB!?KN2?saTYcf%5$fD-tf(9@9 z7Ku>4Z@qng1%D{bBf^OvHCUesAyX3S*tSwsQwdn|VLegkKiVbS8#&Ns>!=sHX&FKS zTQ3r(mJMpii)8>+DRPBKU;Fv&b-pX4sLcJ-Q9561dAe^hJEl%H1{U^4iIhmde4OMi zMauVZOzeh1n6w~ng7S`9O>7YufKOtw3C2NjQN5XA0r=PIdl=9Po=j0AdXx`X&=2($z?0=|nkjAVg z?=uBU)VgHDt4_PKA)wT1Vepa9xQYz~kVDKVNPhr^L`OSo(JF4XJ@qX= zfq3%0?L#mOO2?VGujl`h6&ac1oie-lk;8n{%Oc&C+8Oln0seI)7$URJU`#2A^o>81K#{*_Qmg5;BgJT zn{&ok)brx+U%5&vzga$(?D3HJo~$Q&3Y;YRqqXn3x5_K&PGc8D%MK=ut)T#Ox`3j(FTluu2RY z12g3y6Vu1Sdvyzi5v)Y6Vmg4v(*jPo?Om{E4skxrA6J&%vgoOM>#{MJ?E35O+PANo zwzmC6J~=&P?H*m1I0gbA(XLhDPOQ8nCQ%jgLs<`a#2?ZBC zYO+xwYaz&IFU*|E*@3!pU`J5qnC?iroZ#j1#4+i1)7-Lbg@zJHSj=xNLRYR!d~1tN zhKvfFzIrYV>&UvxK~Vc?{XwY%_Vp_{c+n*E)o^%t;Jruy9fC+u!`2YsH~;)JmL;H+ zRP|l_j-b!;WAp_lmg|B$rXzZkf*iYFQE+!oWGtVYXT3nB#_9rpg%H!P$OtN36Ooll zN99D4T}1<$KFF_q^Z>S8vJq!1P8u^v`Yh%U`mFRFe(PyvY%+rw3cd61`kM!oP2|ON zcD?zwW#V>w+i5MnU-R3G)$)ZCoXxB@k9zgqm+hP)+_V=M4T)CEb8a$As!>h>uFL~S zFlooMLF7jW{((=2fVjg~dUL#xoaS6~c)D^sY=EhF_F__Uu=h8CB^@S-!41SKCw4=o=kjYPvR1 zZ?C)0*T+2SXKdQbueg8$b*9jF2hL}*mv&pS4HB7MHVs)eLnNFYkYHcJG48*HMO^zW zQQl7}jo4)#Yd9X&wAcGuzU{fiq9dbF-lT423kkM?LR|kMpnGJPTu2;bh*@=1ciyp4i~?8kY&DVox0caadb+YK?f?$l&9t*Rpn5je&31@tiD$`OZswWJAc7M zy(dUTXQMct{T}3)N2xRRImNpPP z(3bL|0QG20bM_xKZbqlav*F0?K`TEL*47t#t?F7eJf7Z+H{3054>4!JW#2FN(ps0D z^O^z%a>LjawbSSv&JoH2Yj$Q4f+&7V_K1Fo?nxdELw~!n0~}F@KG=@*w8G<${t-55 z)Kf5E36*L78jj`{n}I51=O_kqG)?3XM=NB3ZQ@>Uu4%GqUWA4aDV=)6E97L9=W&PQ zU=?3IRSw~Pk9w0^-P;G*X(M~Rn!#xZQN6uW-b`LZUHM+m3A5ri;_fiMpvlq#S^54w z6%Xl{Q5~0 z&MUSTDz1WjYhO`#RymdHxhhy$IN{yR`FESyhBfW`asLGKfL@3U62x!r!vDr5T|c{3 zo0L<-TfTm3Ubj-x(hW-8Tr}yW91bv@y-$nNAVjipda%kn# zU=4&0Dg9@!#uxOVNO5{b)|q0MgL7(H%)ZDF>;SIuM~Oh$7M<}EcE2+g7R>Fk*%lZ- z;xb5)_nm`lB*~O%TCVrL89Mx^+s%a9aSYA`QLUc~DDl+PSSfQivqncV- zNF8DED1wH>8&N?HA3aR^iWVAu-Glrc%7b)Fza#(~nUBA2UrOiWIpBubmyZ)?K2T(Q z&9H5AJg(Q*xsn0)w|yXfaqj?lt7XVGgAtWs+i+h4+35h86WCql^t~6%KHeQI08>Qff-ymzGtE}s7htg5n@}~CN z@}k|O>-$ME?>--bQ~UQ(PPQn3u@cP+J+n!g`Dft`MOzCv1KB}r;Ur*Zg!t-4g=->K zH3d$n%&LyY)T6SUo2?1 zJkjB?kVsAglBkPw(Jul1ggDj>Drq_nwu6v4yQX&xP?{AFEGc=TTJ=}xjZ3|@DX^v; zA`PT93uoJDsIgSMu{P-_pL=^Hh-2q4_#_ZI;6E^uYb|6f@nE`;cSL6PKhez6R!}xpfV_yk&CzT? zvL1byO)NGHU@&r(+|_h@eEgc}VV?x(-LR(IW@>FD_Djv|VftDUwzOcoCDZI{BaZ^u z*r8xBQ$@7AsG>;rS3sFqVOkSM16se0^vh3b^OXjm*6uL?ZX<=Wl^}@{;sfga~fVq{Hb;~Vq_#V z+x4PG*d5REnvBE7x862Jjcc~XYasU4(qgtQP6Hocvenmjumce=s2Mx`RmrV=RNj2` z9pPt=r?@#R$9FTB!|8(q^ zn-+RN18H2#oQyPphnGf{KL!u3f$(nNvoJyB@64Ee*AWl+1$Z^%c+Wt&oq$S==hRZ! zY|J9CzbZuSns?X#Z58YT2Q=VGKJ8z!|B#aynEu{EfO+*J@(vtIo(t#xA}wxHSKI&%+{ zhwP@PtEknMd7S?Ks5;M?tgj32N1fv+bBU+^Alcd7ToxdEX^$tCv=*#Z!z#-62g&}? z01wzNg*`MtxVzgdcv@u!B#yXSkFwtiOifa;{=wL)15-K}hY`IYK5fFjtrcI_mwEApP zm#r7Y9yVlnP{PI0V1BX@?L7VT2qhL%YoQv1T0~jJ#N4Q>R;w+m5^86OL&sxJ%FoBk zw}~gx_VsvHb?v~)F;p7x;n^iJ{LqOH!zSM^k;={4842_S|Dt`#`d#$q>dF1G_dpvj% zVEOv;p+)ue&R%dO_ZAV++j+ge5_YRInqS-kh5L}s9R0n-CmKc^i#A^x3QtPbF?sm( z?~a8n1y81mDc76xV*dMFrYr>3GFsR^ldM!uz$t;nI8F3-tbigb_RqR^ zuCiCD)6`|R?g{XIR$)7RA4xOwP)`c-mV2b`c>XN81`wA(6q*qr8o4Hd@B3ezh9~%R zKMOR>{?d^lUxh!cKgUAwN`viF4iI&2MP-a>Gd#{$|+n{EOPOW>-p|4Z|81(#7F@_vnl(5s-ao>BxJ2-~w)} z*fN55t+t+wETT5nfrMrK?n^@vqxb25zN3BNh6WnFG(*Be^mfJR_mXa>kw1G-r_On z;APas@(6%v(Un=83h`pN(Ey@Z{Uv^lE`5kZof}G?&OmuKPml4EEAK z`Gg3QK0Z=Y=(~D6k#9`Fi z_M5iqP?dCZop*x%!ux$%3G)t{}Os16YTvp-1QK%47o!|MCajX@G4hq0AloRUa&q8^q)q9N(_kyLq zZ?)6YbY-%G7?_D1ssTq}>5T$VMX>Cok>rC6M9*oneHhF)HAWxd0m4sqf4oZJgSYCf?}>C<(zh$6=#SR2^92i z0Lak3z2J73hD$~iiqZq`I+xxCMS}@$Ne6cLl+&ZNB~ihN=oR*5e4PEE)74{r2{N>c zbvTmC4D73CJbyIadq_$sn{EE|ECxEqfTEhzWNuOA?U5zMfrf6crx>%n1llhL(;dvBs_GV^phQ05?uD#u@&Byx3HGt zot$7`8QK6ynIamQoK_GLjWpNfX;d9=-in(7#dWISj9rt3%H>kQwaCEpW9#QomcxrL z$1zq`GqkJr$%vvRCbau}8P?GBKsGBSPN3{5JKi(`)B<@+6U3a`jek&LGsq7*4taQg z{i;teEE8G!mIU5lqwp>Oom!d=s8qtPy}rIZnliskh|N1(V2Oz0H>B4A58u&~_b(vo zER);yfu$fNA^-Twkse=jpppmS;!aJ7`J&eQOKJKGa&n7HcCk1Qe6TP{T`@6R$_-Dr zAWX7zf5B}#JqnWSj0SZf+}lPKHY?W9~ zhX`T`3O&2mM-fuUhoQn(hEnrX<@8;4l0RnV?t_=!0ALIEj<@KFd*5xVl~6}YS`G$5 zL!gA#t={;jR9dYhHHkE5OqZIZ=a#oBH}WJM+sQ!F9l3qcR!bPT|a0z z-zNU-_|{SCQi=v0vPiqkg8gSaJGk@N4;g=z6{xqiVs77&I9VF3=St9LRrZ*J0n3~3 zL$3I#q=?V!pt>@wG#b57g>T<#YP!mS)bUdB`9;(bj`Np|6QGj}PmiPeV(3#-6=Tqa z>@1*8PDP!A(vWOUZ_rJ*vIy1yNPZX_B~81(;KZP@2)y|GXPnM1ejxv|;6NG=y|z;V zxtSpiU{m4s{n#40f%)JQ9O^P(A^YxgwmSydWyfkIuni*b8o;O^K91*v`Op%kg81$c7U1%FJAE^; zM~le|5pwM63;wUxgXQ-hs3rK$@IJg8CD-^<9#sTP#|v>=3+a7eG$%I_Y4>hPO@MWU zYrJZdq~h>W$N4i2xuq*g$A(Mt4gg#S#Du-af|;6kt6>6qO=czLr<O?X4`^rhoM! z%L;bo89qT3tVGJUpf^nn=n1)@B73O^rBU0VJYh}FQVyDR)YACuVdX)Amjg6&3 zt4}v{Lf=0ia_;kCE%iJWukUVDt|;+%z6Aw(%ewN6ubzq5M~+9W(Pzi0xw6@}PajW4 zE>0c>0cBN9x?wnD9n%#9+XDl1aB#^;8x$uiL^VPkhCiJXbVtkpMS+|E?%5B$Ve>ER z=j!Ng)JV!cPAUmI412#6ZxHioz!`^p&JKGo)Rd8Y48Y*026Q16 zWj=tB>!sgc<~$u_&Xe?lo6#EtM|X!)Qs{kpjMSH_^ykNmZ0t~BMK=J0t-^u#=)1{Y zKeWrN{I&NZ2Kl+hK;em>OFwhSP;MlV3k6WP=7h4+nl?Mn9hregtyUP;87Aj=L3Rr( zn$8Ul-QKC17S&I5o(7@xD0VHV?imwc^h}?gTg?~)Ck$$<&_+F39?P_O0r=jC0iNCs zqNEg{BaJ=N|7DhM;4^9c&BE?m?HL$_8jh)h;Z_+Ihi8nX!%+3uB%z+vXk(=f&%+Re zr2;^^?RsqJ`bjecd5BA3T$%N5V7o-bcwN+ZozR@RdHbvJy7zbtK1jBwohq8O*!J!l z7JPPzFzd7E(gk@}^CIuyX`Hz4FMFc9dN4qswMbs(sjyEXgz1jMA9E#!vjn%mMM?nR z4>H3xJD`W5o z)6u9a_tFB<3Im6vWH@O#D>>pwhEH>Q{m&VexfW{zzf3}wy~fj=*7gQO1B14R8AF;} z)HkPs*x>Om!~pz&`cEhBY=iIrp)&n6K^}pwy=nM4Z=hrWp$et#I(yEo-~8*)XPI)3 z2F8Tfc({Li&k|`H3%G_8T}~Qv&$h5tIZU5CYUcIfw3PgVx#J4;M&3Og=wRg9O#_PNdu`;RyRq=Uu zzrgv=>`hqLHfu;c{!kagx_D_D)W5}c-^^ySpm7vG!inRZ^f|RTD|;SJohtaX0<5lk z&QD(%UNeAWU1}l7`Rd7Dl`9h)%k8_C zWcZAKCeKY{Vk-tJFeW}H^bSF=ENn1NuQ5}ww@vtriadOsZl_G|eKKQeWxpVv?uxyb z(&k-w=mfWl@%yNy1!gK(K=H$&h!oJ$SB)Chv<~18ht6tEBCLt@-Z%hxodB2+$FH~@ zeDG_K*&%d%gr;cQ{*Q`m)}K3dX;`b|wngm7I4G{Kz#W)pg}|pfjGF$RS%A&V$4p$~ zoC|!H?z%J_4oFcmI>1^O;i@cLazEE$AlI+p%8M=YOFW)B3jXidqi0%Fm46?Rotcve zJizrQwvj7y?6LIkLy$U>=lLIM2^v^<1~sL|J%1tH;ADS!stmX z5MKhgYK|~OeBsUo#VdZrm0pH3eVqx#c*R>xjTNmwXxG&h{m*|IO=G=G@Da_!J83>) z7dmukvFjucf~CR9CkP$)?-ws0#{z`*Uw!hdTFU`;zCa};ecTdy-@Yx4b6{5AUdtaK zH)fW8(d{x4mLRO0AeQsy`&X;U>c~{p)xd}sE((g zWOwJ3dfy)x8|#IPO#9jC#A&o@D?bq^P*n*DoA<3={q9s_sBH`N!$>7AJUs$F3sHlo zXLezkFk!+&Ywzn4bUB;1BF%vW*;bN{wetdu>9ZCk0y~f-g|o+s?w2LaJw!TKAe_7-Xx%2!`NW$l2e+#}uJ8le;Xky$u8x4wV) zLzfJ*53;=AV%};e>HDF3s0MH0e0WeFO4s=0!pf9c$L+D(nNCUtLn9`uL~DWW_ibEI z(}1QcY;sB-m&{8}@UnOa)^10i#^D|hAK6lmzWfRctefM8~YwXbJTw)55G*ZDG}RLgGRDkJ#p zLq6CoE;M`8kHC4lPHQbRG*`UWG}cC_1m}u>n1v){v!QLKWc<3$eiA18z%qeYVgj1- zITakAYbe$^<@i_!OB+_g!OU#gV*~R`i*Lb@QA9MyilQ@pX(38r`D9NEu<+DgXw^Vt z<%s(|n(IGFj;B%bq=;hhl<2fb!U;~8V9ub{SYTR-X|Z{sa|bgIVPQ}IZf8PnyF~}? zu5lKVwXzI*cQLp8l>%we!WYoRo8H{$gmtq@N%?az7>8rriAZu!vN~e%0@F-IN@As z`Xj2~zqP0JA3s4%&Sg4M8oTJ0{h@G zBK0?>b9|eL=>DV`{N2qS#!UZFSN~IY`M+i%u2k|a5lre!+8w4OBtqkjs9`_*`u6A@13%6W{F$F0C3MT;S*Cbk zwnc18#uS84f0hLVrQ3ve`dD3z3018CyFYnN*+u|NBD`7|12{SI84-WR&iG-I@q-0Dr=>&SZmc`+PBMQp z;O)!L%|8>uO8#SQIt`6YFIIzH+a`C>xE6%|I<%*~>%RW+H396HT#=6YK>eH}S$Lkw zw^X+qo8$J4dde%1syHF1-P`JB%)8tw#et-M!`zrj;+dE^_sb-f27#bleXgpG#t~D0 zta8)qN;^p#^=R{c%fKWV0N{KlwTDy|V#z|iNJ>DFZG&j`OBIneUngPiI&vThs@y*d zHqv~`pqAib3}i`>tu|LKJ8M2j`F^=$_lzNo`RK$1 zxwg+-@!JZ{1x$%foyB?2IcYx&jNN>Z zOq%+3Si_2m3`h2s-fg)n#0lNg`%fkCwrX=f3OHjTK;QZL*iGYIOlkHDpMM;|+&S%8 zOyL(K9B#dZkd%nhC~f&dPaScEPqJ#otu}F{+k>-Utln_I*h$Bp24N6gRsbI(DaVw~ za&!}jvJ%>S#q%52jI&ek>&2b2kHoX4jF9#Pza;=ADCE!GMCMekY2NW>rWVkKcn;;j;htOQRWBkaPVCnx;7+s1jbD= zhGye}$x*s*fC{gzre;6&~AxU|hYW{b$;No`%NqM|2ny`7Jr`ly6=50z<&tjy&c zCK2pxli&OXrVg;Q|3f?99M>=+qfmoELr%`+4q5m91X3>W;lw{U5@wU)pSxv-^uj*VA7LLo3bkkAif+NC&;{jHN z!;NENuM=KCod$((f|5xoPzEBqm3tmlZ;sP!k$-wQ?H_M;W|LM{c4rCk$D#(sOxm%xM z*i@;p^AZ*M&y8?{51T%Nx7dRBC)W*RL^FJX(o2(jczA75DZ2#d6cL58mi)N0`kpAQ z0`NCE)>BAQ{wYgI3(Nmdq~yF}h?EV0yJ~gV!nfiV>!B+w;;FT&rV3E~b%-%!^*>y# z>e~N#jfhD_i$eYzuVsUZZ+d{ovLrsWV749-BJ}+n@upNOL>#s~;S$HE)a_G#uc8ce zC%cV%@;$?TmMqTiFvtRVb#Qb>s%`NCQf(Ko{KY+Q;=}d1gcfszy;OLcj|hI~Pu`3S z4OK+I?`b{5ESyM6>T!+#<{*L-?`{$+DVbSronGQwx zBKP`QgNS9T@59=0#sSJv8FG#^YVx@9vn-#j}r}`6nzkPl*ZFDV~h(`Sk)K zOZ52!Q#+nx1h@vX;_LPrIr?Jf%92sdlZUN0IN#KqZ`wG=YW4o63n*`og_H5x_l@0_ zud%~}8PZ*dXb_Oo9ECwF6Fcq)m2<{U(i*taTA3}zb2esIilJnMS7ZW);M?)7wYIJ9 zN+A4AnUy9U^EHXA#SAn$NE3oMiC=i<>GmQ^pJ;N{4|Mn6u?B*OB z&F&nmI&)x!n8ghuXFwuU(K&P(TYBQ{Ng@zqdf{Gr}Q2+fdu03KT6Y zzyllDN!UVupzmaHHr##oYX#%1)t2NgRTR-QR{kWAeTkKb-9bEy0T5JqD<+oM{#&}Xs3@)AJD-%R z2uUDJ^lW(0;7$bkQ1Nu@v383BeYjb1d0w-lyyfl0e;vd)2Lip@+yVW4kq3nM&&eSo z_v^u;eCPEKq8Dbs(ciBrP%?tr6J{drRy?#a^1@pg0kzN_^-xXpsGdk zh;j9tS^^;C-aio^4=`QSw6MAFMtA91a2*OU$tEhLt$z(znj{t?Zb>2v`zvJVZ|)hwU1Of^_UsPdsi85^1;DA1PM?y$Dv=5p3^ zEIl2o-XSQTjQ%}ot^e#j0d4?9lzMwj!{lWalaKiDN0MWr96? ztKgc07hKI$&FsYF#KilTQ^#MWY!<(gyWeJME4E^~q5oNu6db5tViiw%s8~K7r{)s8 za&Y@BW-Z&E@EdqvdnlI#%3p<7i^%Pr6hk?}?#zfc_siEZ7!H9TGnW&04(VI9j~ssA z9|z)QQfjoP5?PMESfi>v$>NlV6NK6zcd(m!*D>AhjU^Z0$Ju`gIMYW~kbwRBm_Z_43#@oJ;pu~cF#%`jnsac8V2>Zh{#A2g zXDk7qePTHcoW-^S>dICOUokC8Y&ssZ<{{R=MLXGTldUPmZp^Hf8@T_Kc9}|qc}Z6J z2ESsAxNs1S_nMS(5ZK1Ls&-Hr8~~_r;JTKPi+2b9{WK{MZX`m=?rt}oBZ;08g4m<{_E z{I&FB70P5|;L#QodB?n(zQ6Zf@Jk6&;x1JmDGdO_>&Bz!d$Qiff^B`Qmjh`mT|Ysf zP}3dj<{d?QFHLOF)$>Hw>JO@#FF=m9Txx5G6|1sMBq(DyLwVd_^jU5FDPgI$|91g= zTJ8K+vhRqJ7X;KDza7FoP2kK><@Z?fUauImoUL>a%fjQPikqp$?D2j}#SF+7c{THc zxD;UW=m$=uWIk04#mcQH0sEN~yHE#)Bad{KJ^sIm@1*uzGZ;szoYl|t+&)sEoOfff`KEN_&BJJo>FBK7 zKtW2N)b{NyG2?`%I>m0a)cu_nuruzCy|*9))Y2o!T{W92CLU!nUX8P-vc=qsuPz}& zwG+Jk5dnm>K=%YnbnF7Mw|gdNt2b#*#`sVtYjW7ZgBiGZyc1gV1eXp-CpmjgBud8kRjY-OQ;#LjINzE_V<$&4uLircvzL2{JaQWsndAYy;Wa> zMlK+;;Xje~2wbJkI@Ho3&wMx* zRWuBQGNA$oHB*T4&ymP+A+T+2Yuw~6qHsdrSfu?H?A9lZ3^>J0gqV@196K2>l~o_e}YE>323g^#HQ zi23RPr3b@6=C?L~#vJY)b!*>jqrZA`&Z_#66>ydGmB)%kD|^|Hceh{9V|N#2QI1`Fm`!`Ngrg4WpU5(ITHBZo3HF3 z?w?9t4ltn)h#7^+ItLx%MhwR*C+cjC-iC&CCMh>)Z*dX;e`1r2nJ3FiL(0M&3T6%T zUJvZ)&Xj~UrWux$`ftuP2H`D)!^^rp+=$-u*m#!IJWZ~^ZR*b`;a6#N366%|R)$eA z{yU#jar-EJ08az6HNOjsgq?=cGx{{M16g%SIFe)ZvLi;LLrpHU?#ma0^tDafTGN& z>h>vVY1rug7#pWdmq|8Gc{DYTl5r0O+&jwmc z)E?ZCXqQh~fAlf=ePSgh#B=NVDuNiT#`uyA+-ZpF8|noa-&<+ea_wOAV{Dd8QUfc0ow4j@nLa# zlHbjB{KR1kJ{{jZAl2KxWgJ?NmMJb|&P(FWGsuPEMuR3-zd?X)eA5V0loG{-CAdAViC+*qYEl&Q$+$Q&E?Pw9vc1pUoCY%HCvrK5k z0bpCR^j607*t%Z1IQ5O6hy{0HT?7Kqaz=dSvk?^xK;pBlE)FubzBG#X-A@3^^}8m3 zA>AvHr@qQkosMb~UPpuxV?zyJi(Wrhzo>L0)pEG8;atL+&O zH4(NRNPtytI|rg0)Bx~(Oum`HPU@QyGVwfXFO4EyA#)Wl=9M#z6-z`%xbIC4Mj>@oZ&VUo+nKv4vc7M0N1g!7V1|Y7hG*TcclE3wL+_vd_{_^jwv4F-s ziS$!iM+V@3XSS55FLI8gc6=3Yjqgi`&-^u>gNPqHttbJHPzko*X3&jdsZZ-KY(P={ zapc5Wo$-B~e03h-osACa7{2Py`*FiU4z96OP-&?wY&k(^J`vIu0CAIAH?*N5LN+Is z7Ca;Ihb^N;)@j5>_a6?3HPG8g#ZP+S0ObjEpF$e1BO&NxxsX5a)w1V7A74m`VOqve zfNSI59~j0leQnepLsv3MC?B!*eGvzCKzq9dpuK`h^VcSy|4fRpSqZ1Y1+FZ;#${V) zTOH+D&a;ynO+S7l&}X&D=Kxw8)n?UT0DNW`!Lnp#E+->3ArTAW39mk1XgNX8a@Mkm73|} zD;0unGrfd5al=RU#L_{hQ@tG4hA;SmP~i$rPLXz0M>T4m&XgC3{K21?D|jgx?Y&)f zFTtF7#c8!2CAyz-7|@P3)GpiTvmdzFuYcxvwSu#lmFH*@R89ka5deACa8+ckJpKv! zV|a09nW%vuk2RA@-jCb`WnD)7nJpZ#ZTG+->%xllJ+27rI1i>Zpk>WX3F-mmYi1^6 zm)%n>GyT7?-0goShv^v^ksiZ)&l)sjugA-qlO>Ov#4o~nO=d{YX_mAuX$H!ravkFM z-Fr@CUhs?*ofu(fCSiB=C?1UAnt5&6=Cv=u# zIb~#iCK}AiKp*Pq_6G(clt}Dh0X(HOpAwLzN1HQGf)mqk{X2>+OLEsv!jHY9uzoRF z7ypflWJ2K&rfYL<9zMjjL)$6}7}CoGb=5G;6ic3}=}_n_;G`JZfx9+~H4WpnONzF% z`2AZOTVNi|s>v17AHK5r7m_7)#!~)gAWS8{o~=X@LesR1di|xJ73Q zp(pu~LVy1!(9fAj5NGzhbeUYg$#_px^O_BWFfBJ08^uKpHk$$CkY_=9efeoPS)j@a zV2E)JU2jbEH)SI#P!?ZOkRz20vBOSOFmp+BaI`{YOXsW8T_-3;qIJBvK`00NC=-Y( zJg4%l)+&UG65004ioS}WAdrUmu~>WE3+?f(TYuSMW(hovX9O;Gj0$a%PIID!firDu z%QHJk=lfSMI4-+Q*>nstjO6Cf7;K@Ze1r#(59r{L&nl$4QaeDta$r0%Q<_{b1SKqk zSO8TiYtGhT`$2inWkg**r5_x)kK&RDXo_de4b<#FN<|u@okJ;lVomb{wAMe`c@&aI zJukuwJ^cOnksbpBc|Y1ljWWIQUZ*~rq&atGt>6to-f!iW0uspMG%^7G{%{7EygR=P z@973@^)Y>S0`9O(qbwJAJ;OkQAhAdjCjc&YgpwvUF zDdm2^CN=8aAqPPECUql19tIyV#=Lud%JtF#*8$=~0t!|#cz0OA4|~A3LTe5)p-<`o zXu!vFstCWfg;n2!8h&Ir#(%V>Afs?C}8hQg$R5qIdP0Ag=n#rvEiC z;y6+s@+R(pND$K7l5GDqSj`#}AZ+P1WNa#dsBMPea~6QZzYu{GL-F0|VsHZ9nM5i( z(7aQ6bJYh@Bp66-_BKk#E)eS5S-wqkmX6~C)-4rT0m~*;I1s^XnB0IGv8g(o8bDQJ z3!=ir(7Q%>Oe+4|@(AKVEy)>;>?l6)E0yb??Q2jt;z4I;gHgKlMpJO`td{?7|g zI6nUL^x)NV(%ve9j!m_DboARI@otr-Wc6Sf5t7=mH%tQEiC0`A4V3cpojm%}U`LoL zFIHaK($-tOI+gphD6R2xsWnB20@sd=<5sA6twAH^H?tUdm?to&$$sj&p>7Ir?a(g2$hor1vUSo*3y?xuwUF+nD-}eIr$+!elHhZamKy8n9Abw-D+PGe0cJ? zS;1JZok+XCuJC`A8%-sCM-kH!e_}#Zy6PPgc$`sB5p+n1Vr^t9Uh|g!pD5x zI#uk_RwwUV_jS!mbulLv(G#_l|5dl6nGch9cEe&GoMn?K$0B0?ShJ%?1^tZT!hk@7 zvT!FV!)&h$8Bu1_a)R*{Ki&&1G4)hbL0cS*=wnq~0T9Irj!7Ep47?G^+s~ z!k6)xLVnxVNR;5SKcar;lch-f(k@@i+AssZ|08KWqOcFr13{gw4PicIcW7`_iixN- z3CTPzDACh0UG_^Qc(0RgbN7Y#sv zr{e(#rSkj5m7*&DENrkNrx^D$#fHF$+G4|BGiqB47XWq)hd?eYpWm7$E=~R_B9hSB zj0L5ju@Tm(R~vbCq!=bVDFz_K%MReWv28A*0JVi$b=a$cureZb_V}v}4l+)lToK;z z_~3Ufe+v81aHG4&VeiGgZtMf)BI&meLQXrfmEqNuM$b!mYqa^poQT#vg79ST8_Hf{ zVbi^O+M4d*7B_Dc+}gQebmCv(%l?S6(-2Z){uj5W&n4t-V{O=Y#Akd_5+;DHvtT66 zN)FU#G57QM+unEPm_Pj;p3Zqg_gtS*b6miYj~V#T$2V}010fB9ytvA;>FA64M>S?3 z^3QAHd*ua9FjU(`yaZ`g&aR9#n1Uu&PBk@UACV!-;Vr%XAOB#>w`*NI7q&s-~EX}>WVOju*Lxgo@-%Bmnx~Js+ zkA)8$j9J&fS+AGEk?Rz^JUZ2LBLiB8&#V#38s2R^G^V1vnWI1jYT@N(tfX{ht~U7l za@6IuQ#Gdti9lHc2G`S^V6C$#9KQov7hp7yr-0gWizbT_(9^&~e_MF~U$uz;iJUTM zuieu!%*i|mBY2lCjT{c3Rchif5#p`!m-}5g~-GaEO`0 zLOg-r=7K;K0QV(TF5S_Fzg4)i1{u|+71TvYEwL!RYR>_~oe82;DrjZh?%~!yfzfVv z=z&R8#|4P$7Xx8&;mqPBvxuTi)<!o~MOCqG}{|z^D?`1HH{Y1S7FEYVebg`^(tPOKl`r>xLM6gn=-vYRB*W0qdHZ zp%LeiL7~`B!z&eR}PcpY8M!`|($=e;BtW5V7o!sbr=6iZjK4 z7ku?yBIv9advJu|Glm<7U_me#KcoxOMxWj&c*V>%X?MV%rE@o`n0NJ|7s-I{oEx}# zc}{doqYY8yrL$TI>fCf(eL|j(`9BKw9~ZkWvHo8LMncbNthw^!`0+4%P~RuguPtCr z_?*SeGiBjR*@|$@Hw*L${RFl*mE)R(K%r1%h!^^APeSO*5=|5x@M|s2d=+3%BI`cF z;|K5o&GNdIa9TfKoQ+>UucPN=5`;veu^X>RM0a_vrX#AC$NcuUOcZC9sWV)^`8#Dh zmJdlLNXB7Zk%qZr-i30a6uKc-+ zEWy)qVHEwgFzb1q(D7sMVSHpws4a1K{rPzNBJ<$>mlU~ls_^xCI=V;tsGpm|Lv85b z^WVya!GBpm2b>t6j%m!yhu;CeI;#REdb6EdULlri)_=bu7zMtJAjw}~sB$dI^x`<>oLBcm~=MGv)Uul{X0id5^c-khh3bUA3 zNJu6FP40t_a@tZZ$7ZV`{^NLln zxqPbOFR21Q-x~6wVy~}6Ly!AHd1r@G2V}Ae&^ywj;XEHlZ%&syc=g78B;j#mzz{yu z2JRY1TE(9dp8-FS!To3vl zP0$uB=oGZP05{l9uJDx53TlftO<@|-Iu)^hH zA-z(cY8NBKFJ@^hl-a84RGSQX`*S)UJT}Znb0ZgiGUl2GSc}Ud$9QixA%o7gM?~Sz ziciSe8qu?iaoWq{Lk!#Du5d#8YJcADmLe@k6$@gn7gtjL!}`&+iEW2P39`VO(g|-% z0z5;r8&Bfzc*-QA%ueK}*kLvGvJ$TW<=SkHl8@lzJ>5*>txnWayS$=;tK0Y0Z*V`q z!|*PbyOm;+*m5-hx_{{^>A}m54aS zKLO-4EPb}9a}ocY2U}VnX`3BEuTwE|hgy*iOJ0&_1Oi=c`ultiO@HxbFlD$vH=Z58 zSz(ozO8|HyA4s~>)zJqT=I7oobG&8&MxWIe5;MlC>5xvNrZ%S6uSmuH9S|W0^ai97 zCyEaD%_yg55UT@%3dW|GXI`UozO9crz#cYbG5a0{uk(c6niz>HW68=o6cE zJBeL6YS)S7CPA6jY7dYpYiH{J#GT@oJfgwP^Y2|Q1E*~UMe!h-(oE$Qmg)Uq(4`=tEFh&78KZ97sMTshoT|Mnp3ALA-T68HcL}dM$!FnZFim~vUXOM@ z8!8n~Cn^<;@Hw$`WM2!(H7Qq$8PierV|)gU;Dbv_D>%B|s8gTttYyJxSPmE){2C6|bRD);>7O%aEnDjF30!r32BFOeMb}(e0$HMY)pC~` zu%_yml-Uyju;+>0vIMRzL1o6Ip%HYYX;RDJ#5`mmytx!kTo%^fl<96!PSyKmpfe=qp(27LX(@22aCtFPS^S=EB`U2uMkCN`QA&$ayZ4pJ!ADLhpv z6TV2z6rVtwKLc7AA}H?@O1XqKJpsY{j#CtI@00rvO@@c`^5YpR9WeyKDpI;N3^p2! zOqaHpwr}wPZX|fIgK)F|)>h^Y`eRvQoQ z(ya^en=JgeA8%X8fTCJ$1g4^ga>jtW<5D{KLyGyKAM4*p${U@k~^|Z z`=UZGJsOo78g|FZ2+#%mn;Y65Lmqepp?RVHE zm|*$`O}!xu=+@dc`cP7LE`o>00^9IP{o=NPEGV%Bs@meLn@kN=1#BAI^JqQ|fJ}Qg zE#rkx1MzOCQwX-#aep8kbYAH6Yk0h|G#B{wt_54UpuiCjJJSD;NV=pjQU!MAmTVPk7!N+~;2`;C-fV9dM3zruM_sYkAQg&MuI|Nq$oVJcg`2RF61gdj=5eiWqKj% z@Zp`#p~sH5xB?;+S%7A7Xc;lPZr5Tx0UeKr4;8wXGf=gXZsZ%z(G@}MW{wKadeL(Ppp>e{9(u}B|GFMwCICC& zK8MJf>Ma==P-c%I$*!u=5SB|+^0!#+rVw@yf~6yunVSwWq_TZVv zIl6YlQ@&ExNt%OSSuQqSPB?Ey6itHslM>rieM zg6{ZPe9jWjbWh_u{+7)WN(U4JSRRnmA~y^CLgTf!5vhhhTO-Wp?sWxxe#&!Fl-+jy zfH`eiNdwI$LyPcYr4uL7!YYApw|o#*U{O)zp>wR;`ss)9aeQbcnC2Dr3QlFUR7 zEU#@DiacwuFsUkER6O+~l&r<rOb0&28ii9Ni zy;ct#h$%A69a@Z$u~*O&hP04ToSRFOA|&4QIzbQatG^dc93f1_XCHSK z>nxSc)HGdk-*ul$1~ztZGFb^jxexwQqt}TyVZyYagfVo~TJAB27{0|LJM)$55`4ON zcr=vMc1t&hL`gRMM(^N3DVhD7abdXiRX-1`C)t9RZjJdHV-l~;%vFDy_f@OHzl&VS zf)Z7crk^W%PRjqea3-F{DZx|)Hu4R4MmuAijeU<#O@ua-LN2T{JH-@e&1*G=_r~$N zbgFE?CsmkatEl<;P{DB4sRUP_1ZvelJ+p$zQXfLvu4p1IT55}(x!acWr@_(KSq(E> z5*}pPwD%hE5kdirCJp~Y9`m=S*6?4+uMso}D>fG}hbK9p${s>3nr0SSR&$a+gOeCRT$sIVr_MlY^^#+|&At+j` zL?@e-D{hVCX6}^&c>sFXF_uVO73CAwlQ{VUW>NDqndT`7!TSI4Yk++Js~NN{iRrdx zAsf4K&UAR}4EN6YgF}QKODO|e1{jmaY#Vq|%FE732-vI$f8}6J)F@lxR^XrkhP)*1 zKd3ng=ZoVf`ORF%7bibe8h+(L($?B;Us$ugZuA~JZABk^_bFzM`0b;=4TEx;@Q1zfREW@Fb16q`yXs!!KH@lck4| zQx=H`A-yxWKO;}oDXTaz(K;#Evy-BWmPz`^=fMrAGnknvb9@@LmSvHc`uU4%LO_$~ zhvTV_JgH1 zz5))?-Cx~9G}UtDK38RX!Wi41)XZ(A)r z3HT~FPwNH;*b2T(rW?-SW@PFtOp*Sa>)MR=Qhx`b{{E&&KmZ9#ExNh%$5<`QLA0gS z+K2!Z5UIqP0Qa4Y6>VMk+B27R^Vs=zv%Tp)9jaL|WxC7psB?edxr#x73~>eP{rnZz zUaBL^OMkH_dUI~`@^pW*@{qA)RgcK`ihsk7$QFCuAohUm6v4M!Ci7uC5n1=QAL*n_ zKPZd65-fCLFt4;mV@avq%)ne_$^+h7p1vqu6^`f~ejelcvS0XEY*NimLx2KgB{c}; zD!cR~dWi=(8|TmCAt>5ojD+VZdj!+exR5230P3kd*xus3^t>lU-y`^P%%L;HdRDRT z*;R|dK=o0I8JDVd5Ac0US9sk!sOj?dh!pDVL-%CUDEHw$F%j5aZ6sI+$$XL_z!fFe zGctme(g|fmDiiwBcc0_Ui^$DvMvXhgsi9?+ZHCnR#N&bS9~8fJ0wD&j0iYw-4{Q~% z7-1Me1^B-VN>jEUHu%`T2r;WdQ|jQ)1jU|K>_p6K|Ain3bPU%i_Z0PkK}K<57%0y`7r+({2;{bg^>k0gwZ@YFeb(U*b0^6u z+Bm>Gh{+Xyl1)ouy%^F)EL15o!W_?;a%;H^RHe+lC_Z0I9o$*9)EqESD?-KjMd`<7 z)4D(H=z3q?-zfhI3wSb_6#a&C4B&9|36NPq8{r;3`dn&nDINwLo`}G4f;nHFR|4Q5 z60b3e-Dy5Bsi}XQa1JvTh}?(%xPU6k6sGDId6VnDNkfcz!kL;qx6xi5fuPnu&b~q3 zTszaM)=25aXKHj|7jw?(d4@q(7)n`Civ2{M-bYw+RP{NE`>wHtyRL;hZ<+~U?5lh$ z(uhdaqIrcCF;HUzTSqHdL=Rj2&rJka1U_5+8J^87`X`%h3Ln&pQXSQUKJLBlkr?#f zoTvDjCiB-#c4@OEUJVa3^w{&@7fv;s16Ev0xvE}pY=*&1qQ=!9HAX^kV1mw{fDsY; zk7H_@8mcO`xq%0-XJ({Dy;zuDc^w#eEc(g6x>A^7_#ao*O4=jNDq8iDDRjYWd)RpT z)O(utykl|lkb8iUJ(N$H6oLvB#Pj6(wz5+8iS;dIQ2d6!S9#yDUBx;JG5=UM5AwA# zQJe=_0=GO91VSzGJtQLi;DR69xPiAO7&%m=ku~NIOiIX_=HpkNugJUfz&n% zPn4vhNU3gZYn~8Nufd2K5IzjwEy9&ePZp=sg^`+VEl^81 zXit6e_GF9lnC~tuj^#~^ZdZ;FJ9rlaVf&ftlO9Yr%h%j;-TbcOp4Iu=m5vD1ZSW@( zqpCkaY&kzhqo!uEzay=3_pqsas33yETyA}hyR?GP4Uy5)H z+KaO-2frVFZTDdY{u@Jc_Rq5#Q+l6z>8Dyt@i3TKt|VJ^6_d{nln;ldEf`_`gU5*o zyvYq_oOM4}-jJ<)9vT4qwRT_j-~FG6NVrT4W=B2(3>?zb6@8R zITyYf+Zr#XMkg14U;FakJ3DG4AyxoOGBO}7eebNNMf~m-TMVJTiPTs=^@1Cx{|D_S z0?qyK)ZAlz`KJSCQZCQJSUrca&%XqwmDL)8?{7?9e-rt#tvi{$FP`2Wro0>Og-H_x za9R`L$jC;cs&1i4yk!5ikESAg|Ln7~c8cJSxn3bCahrn?&DWU)WB@kDdHP!GPICX0>NYctbEYqR#%U$6 zRkey&QBMyPmGVG;l`$2KB1bW>522K8d2)NWJ7S@y77e3?hcuVG6~KbV=a?i@-~S>{ zd{qQ%vB7R3q1h_Hoe)6d?&)~Hr4U}@jh=bZf#d3ehUO4(I|@3(bs4^T?sgEmj1qmG zK#KL{c3Beg^CDYQSynTfiKC&ePG(+KkZhTJ@(_PLOQcMdWfW7E@+r6?u9?cF5Z+}k zg^f1u2$A};myGN75XmfQy<%(_8G(;U**Cl|=eb4idN2s{Pxz|8CB61pfL7V3h7#Zm z-h51(F)-oWMM2I%4X1662B>aU*@QO39Y4)@-?E1xNgqVo(wVNf;u_QUrpRD^3wEaw zfJhGW6GZDIJhiTVJ)7v}pjnN?0A8g%-zvP<68_x!;6Q_#jX7&HB}tATCk{iPtL;TU z$Tac9b~B%F1J-Tyo|Saagv^@V-K=-L);rpx$eQcF@iQbX3bO$)aK{>J-oSIt8&&wjJo za-~e2gsY)8#|UX=Zv7;2KGi0kAKq4C9qh?I-F*Do9)|h!X(I2K>#5X9K6+!dF&!Ny zT&1E>9&lu2f}zgzezvS0MOcu0?lgZVvG*rbcgt^~Js*R02dU`X%p+0k>O0J#Np>;I ze|pT2s+4D8_NI=nNQMo0knH#p0A^tMJ=PPcZ)1XXcvRhYGF*fQLnAROq+tX$v{mkI z5qk5@d-sJsi!&(D6(<`Fi@S<`pTA3wtun-rdsF7dPC8UJoG;{!$=jhG_{+q!K_@Rf z%8je+Pjzl+Zs~~n-IL#Qd}oaL5o@G4mJ~H~x432q!i|l90P-VG8Me7;d3uWtaCTg4 zHj@fHGC*(ltAGno);AH?tgo$pw#u>hjU|diNNy$9;wiOC$0ga`5?sEBzVOGbt#BkC zsQ@uGN~)*mE@WaD<@3{Uhs@YfOXZVhRsc-bP6Yiv1KTnnh*MX11UZV`OoBzFyrO&9 z7DcuN5erGe1;iF9XP#W|MgmhVJxS2BUKcJrIkqe{%Dalj^(Zz~CwJt{GK^VID;#I_=kxGgw)|>@4cY=ukJcM3F{YGv&o?gquA@CJ&RsCLUmj zVoxqJXe;I?$GO1eamr0E;4<%V zPOudwbQEXq++8XIZ$HI~Pj#hX1t~CdH6Y7vj4_%0*r_yuv2&xdb?L}a+tNe_qu*~z z5ZGT&M<9e3y=^U&q?iy_J6)R23?XQSlwgCWkg6roXgp zM$)M(E#zJpUP~U=%1O|)aTkwC;1qH3hL`cOY#HnkVV5!*2 zyFLY*74($qa4ld!BgZ3BagsUB4)@7)2<&Xq1I~i@haX=b{4y>_# z!#gk`0)#uKY(Z7yxJaMZZFUwOQZN4|u~c2tFG{S6X8E7s4ex*KM1tGJ*_&!LgY=*C zg$E-ESsodxaLNb2{va`^`1<7rOTYBUm3V_8sa3LvD{fV4|2Yy?a15|mn%h1c}cQBh1 z4lv+C&;M$x4_Vql|e+-|5EPeP)2=^ccueEBiG~U&@W4U>&wlt4C=7PkrB)v(kY9Gg$qyU=PNw ztyh}Z@!BRp!0$h>24{U_`-`Ct^~#E$m^ouzKmS;)5~WUA=&%X;6jG!THT$aKqDUO? z0!oD|@^aenavtjdG&!ub1OLpDV{7-;gD+3N8NOq#dSNq5cl5z`te$pkcz}FQ?>c2a z#C7=H9KT)m6EC~2dKq|aLkN_Va&RZxAd_Vzh>w&HA+pS5ePLfrd{em;AA~DMfh~?N z85=JUt6ZOl4(sXwlzBG2AuZgfLCCVUWaXveR|kC^y6ZU<`KT)0H> zyhimO1*Uh6^z#V`2IW&)Ow?3Kw|epAH-fJoQK6LNcZ*|!or`}9*#oPD+ZrOr@@U}y z8=>koGrvNZ@y&WuH1C_O6pKP}g&cs|N`ym_NZfY?JWcP@@UfZu%k+s$!>G!q?(axi zRZDmyTW2i~IvUC4K-$IY8WOR5Y5I*SWa)EKJK4qg?aMx2m)4R+gyFIr?HK&xMh@>J z{EBmFvHfv@P>JBL{TSga9kmzvUt<2)pU6MRQ$n4u0LaEb#^-!%7~{HiC#xPc=IPII zbuRu4N8%3JSJBOW?OQd)$N5cw8FG zcx5KTXX?TIAoCS@v|*rQ@Z)me!}ZG8;w#Sy3cbrViKOGXOpNwnT#_{-s-K@3Oxmju zmjafM$?f1G;&m1zecP7a)VrbTDL#GmC4u@kue0t_E8`s8n`~t_U_ceY;(G_AUMA6U zv`^emKO>6?=E_W)T0#YR)f=rb5}PPF_#=%kxtpn|A<>_*OI z%12S}j(gf|e`zMDyoz5U17L}8b?EETx?feQ^gKmBE9qVj1xrEe8VoluJlPWnvswQ8 z64{E&6eEC#JQs)n#hfaJM&gxk{-q<*Va#8JM9_f^$Bo74LzbpM7PevyLTBD9nBnS= zK{avVbTv+c-m@YlRI!_DiS+6&t(~p-4S_DlLN$V$_2h}Qxm*yL-}}ScSXdF3rHZ`0 zgphfCUj2rapXDs6?Ua!9t2yj}8u0~}|BtD+42mP(o`z>}cX!v|?gR)B+%;HmcL=^% zAb4bZZsQM!hmTJ`t(Tc zM~u#4r=O>o$DWVf(_LlfS{4lwIhzf*iA(sx5fJs;hqn6_b7XTkY*%z?HB;DH`ghpq zH@Ael3mYtra}hRj!iDbCrvc5K33q(f_coE--i0p35`Sq&W5y>6DpZ*z#8njMN9_7~ zV8A;VmJ;%4xRFBfxePbIu@iRHJW0fTOFx}O)QoPo4l%k90NkIrLFM*SX^9iw^6X(> zG2zsC5gY1CicO7t|sPI zDNV91HD6IR@c7v0r}FN|3I>>yGDp6j{UR6M!UGpT=T>a?GX96{ZTnZixajM;4EZMZ zZyp%DZ?xLag{qjTP5VYQo)Q2FRnFsr(1(BE7i!>OV~dY=to?Mptvbi+6Ff}m<;&2_ zUB{hi>|2EPNb7mJP&Y#O_}HLlT0@z7&cu=;T%@yQwU6Ga%_lHqI2Qjs7YhP8RIrBw zQsVS*DFS`9*F8o-cH5tIoUPb6r#D=zZ|QPS;)|%k&OiG3aF?8#(++uO^7!VF2=F9#XlO?To>$selEQ!tqM&O@+mrSHb2&Itb z_l6FPF$54bD>q$uKy{yuJBb9UN%b0D806?nk0s)$DV!~QwE*b^+aFD$h($n@{KX$i zEa?!cPq@o(bOI13Hu~q?E(ls$KEQpuo+=-}g#pmJo;`Dpm)WR(GqjH!+2^y^t>2tE z6MHWRA%=DGJ+7|h+;80l+_TKPO=N|sR?(;k5t_&_Gt-@i0Z6KH4(zc@IQU1>9q))+ zb>LvLGLw{{8tnK-uf!Kb$cW3OI^}Q+X;jRQAuC=3Eo8PWg63HCenA>j`s|jv!fH_n z)GeHF7Ld!BYbcNk0ki`@!6VOz$@HkdrarQisNxQpG|4%au%)FkwW*2b=nvDlX!*ZC zLOgLHggoylEOO!`Uu<*UkLNBfO&Nrt-*|a5es62B!JixEsm{=`_#@pe*pL+kE`bNW ze1rkFF42YbPT>Nx=BJbZ&d47=?aUXUjTg3@V*vyeevL}+iD7U3d-MS4W0AiQ122Yg z0vNp6yKw_5dhfi!Lk|77`CU13YS0l5AU-x*$$(23`?7Av!W z*xNF~6;DaCj#?OjIE|H0&$tqheOFb&Bj6o2m#s2ZDb-`gN?LBc0V0`$x*GrD z#DUBL_1zzTl^=-Vln@1G@7CE_z_Xam&xO-7S3UysaE1$VYM!n8^>>hSXkR)v4pMm_ z{$BAlCR7=}Kn0YCj3*J05_r=kiM+zl&^j>fcK6SbT93myn$!GGj*WdVn?^{>^OIJgJ$+?M>yfa5+eeHV_ zp5f249jd1|;`aLQ>NP+&2hdU03pr!&(5|>ILzSeI)oeU+nQ*G9kO2EJ$V_!H&pZ9> zc$=TIxbjggP#yT8o%~YG-=&&2HBgh7QT%G|A%lfWW7qc0b^=6Elty9SYN+NCT|6@d zkiKXID|0wmb}bTD2~iu79hd%mVBHWCy5ujBE#6HpW9pt8n!`=Nb%eOb%lR7W;d(#X ziMT58=(;NIyi3*3cY*J7S^V~T>+_}=v$=jO`Z1A2ym(vHvArDjSfXe>34uWc`hSD9 z|9@9k8>Yj3;KXR^!wJ>8aRyGe-@A&NGg}i4fultd+M7UH3%b5R!LdsF zR)oYNrl}OUTVr^Cft_zk-?jRixJ6WlA<;fr6wd??c{Vg1LWRl-z|ZQc75>9QJOcWG zONfk5Fz|KB>$2%Aj$RSMm9-U22!&i<)j@g_60@j#9qG>K-1lItpnng;Tqwlz-~V%m zP#EIu4FX$=W^P@`L-fJu1k;P0*b&i&8e9vJIXWpX{?OD8Lcc_MpVWV&9(6+Lsa)>` z$;%b=GFEf*GD*Oe@^r~q(%R;CO=W#p2q&bZM=jP~?@z@1{97u?U2}IM)ybc<7GgoG zb^E-zdz_S5WJj-!-?)${Orw2K)82x&EaQ~>AvGfiduC2f@x~jmxJ_(Mv-f1Ux3&FG zT6;Ed+hY?|y8Su&N#gZ)fGBw$!nb$_Nhq+2s>qn`IAiqsi7&*>36z^rc~>6sj%$1= ztVO_JI^o>;h>M(gtC7j`$*f`MQ%3ve`R{2CP7S-2{NQ*ex-UJ?h@4j-FzK9DI`ze& zoaDSBS|Me_8A&1#f{`Y4Hcchj&uJg!{zLzUm?CO&UhcBgMvE#BcY#+>=bFKvW%b5? zWgp>^H7Qf}!`~-N-o7pL|6+@bKSi8WK*!xttmx%(ELzu{(vrp5(PY|e^LX%y8UaWt zppBCzRNl%_K}Xw_PEi**EeRDaw>&MXB;1oBNKYiVW%?K`QLT4fhSQL6mKCo7f4tUe zr8n!GYg{2nu>a5*qesWv2Bka*^x<{V_~<9bFe8LHzfqEU+;@G3j1qj;d;i$-?b)4B zTlp`7@;}(&sz6Ht8O6M1Ysi|Nk^DT$K(^cypJXoQb~Fnk9;J-!c*|&mRcx7cFa%Lx>%=S<#q6myV2TuqPM}Ro8g2bDpx5BS~|fA(qL8y z@@n%<80xTCqa$L$=Aus|1rXnDnV$G0S1B;^#`^vphX*-9Isy61l#$zoLt|;b(U%n>X!4mY|Dgv43MQx?jS+ z^g+pEv#z~nA4C+SD)|;d1-Zzeh(kW(bUaXT`g+WKlfzcQ5*2giyMnc*82n^p6s6)E zek><^KV~yFHA*2TT-MkKDP+2%ke8-#7$`2@Ldl)QHa!**?1K8s4MxR_rXE&N zKj2Df{vh#FU~btf^9L#Nw?JpBzS1i4izIAR%$~-d!x+>?R*S8{pJq^5gi{~5AE*FW zItoKFslaXd;zbRF-hbB4Y5{TfOZ;=w--lsUEi?9(7TaZzq$`}?%To?szf~Yc$(DT5 zp^#P$Cl9v>QwHGl=38q*YK1kKihi*ZaS|IbX#Lm2Tejb-NU2N`i`8|kJb9!RVC{pGF zCFB8sC_4pC)j2tL;$3%Y;{RZ#95Vc)uIa0>k$(Vs9%g?~`WOFq7sA?P5X;_nRBgJt zmMaqY(3B@Md+cGA4JUV!9?xI`I(LGF3l#*0n2@9;=Iat9Eh7TgHZ1O%yjGSf=tB6R z&!QXkrXg!gaq1g6UY%*b`5RobR2ZI_seQv=@F5`8G;Jr=54j90MnF^-??= zAF-6HBF^z6HGHCc4smQ<=jk_p*R&d26?^wHq9Kh8((n2-Vvu+Vy`lBDa&8%&*#I{O zTEV8Rh)rTfx#Nrw+fYENvh$`o-sDyWS3+bJ@ux*_w^E4iu9PzmR0zMSa)+>2EVqQF zgysic(aRZ``yMmN{u9Lz@ET;e%ae^7W2q;_C6cR%0#=QVpTH?!FHJYt+fq>lt*UFb~E7%5XUC;Y0(r1M2 zn{-$UdB3+q^?z1@`S#GSe=0>e3R5a{s5EObcvi#1)I8X1Vqjgqd{&2*hvPz>Kq7PY`ttPy#0w0aSuf?|ibQccj%NP_Z?jwlqRO7( z%k@{BG6Ku@!UWcH2j!`>K=rK~$hhwl&-aSg#i{_`H}|fqC3QA`AMLL8x@?U2v0e|V zi$f=%ORBUKIzy<1e+HF?=%CGg+Ai_0`Lxf+ z+0>_-UcN+dgC^b;YVyB(4S4G7dVG?(Ls1#Q+Sj|| zieY|^f0O`u43aZWB=0>DfJa}YlBHMeu#IRZ*eimk>2u|{&&BmTP&hkp=I4sRG%clW zJ?D?^vEiSnsmeH+sj2Q7*~Ay^u8T^4dM}C4 zrNCT^+TNBVhj#5k@{_#d!F_E^G{Rq`N-l8uVz8hH7h6;hZ(D5eroxzpg~^lb3+K5T zc@*-ek$c|!qb;9PDc{_Ev4B6ZAU;VvpiBumwbq_N|Euw|6$L*w(mTbA{zJ>wKDV+~ z#M2$P8AW>3I^o5?ipnyd%Rh3LWm_FcPebHW0RevV%2 zON9Q}(-O2ytgp*Ua0ig?e|!~0tJV5FDtJi21|V7LK2c;abp^Q4@A!+Hto6a(zHmU~ z0PwfB@$e6?hFu35%x1sNPh5CY&b&OfRO7QFf1n2c=Zf=*WnG>Q7E0q4IPzKZWy+F{ zR6B6>3F~5?bFo}OD7~$a?Uvc-G3W$7{&r#Y&U*Ciz4A5Ri0&b7^rEThR8GuyO3KHb zFR#m#z)mYbaq9~we&2kG@ZJkcdM^Y}7hquSJ*l1RjNNZ!IBUBkM%vMP@+prlQr#sG zZ>MJZIf`*~Po*jDkG8BfZx_h~3AAR;1F6u@08u?SVvsGXD~700N6cLPv>nS^=}UOK zupb9sN6m9wh+TzKq1(rdHCNO`g&%t6`|B?*+Rh)=wY#2|^hJ&AkfFmfnVyQ@<}i#~ zcOPJZJyB1;^5vl5B{kApx!`@yj4DAtaG-EjM0E$-gWAaBX13s%xT{u&%@T>SgMA$I(Ga0R}k*C?dk6cD^us@K!vq*IQd652} z__O&7mW2`)au}}q0Vk<#gU2Vl*$fVx9bwB= zw(cUDMVW*vCTg3qlrBarW&S7sN(e^S&vev1hXceZN`Z?N`8Z32Y+Ykn2->MUbRCZr z<(0N)FN~vhxm^|orgAhNnReDwirtJcYTHHChYi=DDPBKGdq`0DnA4MrM^RI~6Ckd< zB?F-Q_^Gf1PQI1=d#rL42^($U&1I5b^Zh;oCk3kNfUWL~k28Tl8rN%YcsxJQeISyn z#AaK0&IxUNOUuoNnZZV#&07mJ<52?7X781McT=dFKl$?b-O2gcYq9@*ZoQHcv7*<~ zf7E*kREA9s@gx!MQN{%_$n_nc+1%fJ&$S&|9B01@-|a1)4w$wS5NZG&7&~>i8iV z_n1Aj&Uq#DWOcLREke;i(85t{l-qA!brV2tNhEiXstSuErkNFk<_3$9tX4<>w`+AYBh~q)PicRt8oUj|MTH+H23_$gXQ1xTU=j2U&Z`!w5 zP>@$VueKqu&(EXnCQ=KqKmQdnD)LKv8$^31Mgs~>77k}SCC7Xa0^|NY3LS`5Bb?x~ zeCybR9N#)yYPf6mkL**g-=ksz*;K5F83VNSOXXIW}|t}n$VDfK>N0@O$aR6K5Z+H?Nr8- zA=H@G)jnUsvq zxO`%6Cx34B_xsS8hXF^vPj9bh0hVCR{+lq`1EAo5Q>UEWvvEw&Qk5nZjB7osRmybn z4o$L*n8B`js`A9LIUa5MZDTE&4M|%GoQX=2{zJLm3CoQDm=sQ@eh+j%s+5~p6Ys<* z2!7Wv__ft|QiTW{8@NXwPFqMI5!^7FUusrM@Rl+C2L9HnxT$vK39YROLSA-jFt`9p z{7fYgi)$ax-I@Nv9ECdP9$ zI!NLk=!l_ch0MJ85aPSkWA8~JtKtB1>eK`}^$$I!=w0W;Mkj9;L{c&2`V~}b{@fi+(M)rN+5o{?#nC7d;Mc84XDlNU#IxGxF9b&!Vl7Bwe)pI&7yY;F zc=Zpk8G(f+nZO~5w15h2<^Oq9gnwS41#K`pt}Bo2@iQE;zQ+64;n#!6w38?7iz3TR z)n7GO&o*9TLq%}xAi;N@=IG#quGR`*(C-U@nKDDUkTmfTJ*`8e7zb>wTQl?ZB{$$A zK=ClVy!^FVg?O}!an2`-<03oQm&ehELe?sQusn^x1kR@ZGI$_NJe&BW@ML;3x_E z^R6O)?NvFM@;Ue0;OktxP(TE@U_%%2f8SVwNquBA7=DzgdwcnR)iMuJscVT*X3;%9 z4$8ylmymFmPRu&{$g)juI$mxDq?R(BR;b`Op?!TmZ|K3q0)Wsz1iON{sUI>JSF(+f zQGj>2(ekv8GCx5*;1Yop%u$IK7s76j3^)qG_>>L``Rxy?f(6z#Yj~z++ET@W8Iz^M}j=1+|h#1nY1anR&p@jvz zk<)!7*_vJDDj;LtFwp3RO4A!IGvuxS??&_tVJX}W0Yfj>jZQCeDac$Lq?9zl(Y>7o z?8-!yp_BN?icd!LK%3msgG_E|WhLV1J3)}&_HkL~m%+SK%H?umnQuw?pLa&PYW>Ap zVo(y*-a>Zdl2-}aV`P@Qt1{>oY)#aEXBWPQ#B~UN@950gqWBQ2xPk`&xz!&a(XW&Y z#l9o1X~{;cprAz=R^e$m2=Ihlud=<2!$u+u3hJpAC-kNmgN7@yU%h1oM$x!js>5hk zd?oV(1%GUX?jqi98NyR`8)nsODM3w6>#}5N8l`C&rQxlt3?Gmz!2<*@h^7>X2(^$9 z3ZdZd;e@BE`69#kN>o@LTSRGLK0oCJp(#cs*P>kQ-QE)$9DFHs+n6A8lFn({onB>0 z$-dZw<*)jSG~?1K=H10xUX=HLUI1Nk@16B3r106g-Ql#~geM2mLRz{N3Af#Lm0TIe z{Inn(O|H2*?pub9*2hxnCY{!TI9EqJBBwD=01KG|K;sSY7p_Y zAaB4iDUD^-2#|@O4nJ6^O}c2>bNOLt`2A( zjp7q8krUVUQzWT~P~ZarKbF)XmlA$`Qc$DXq}GDu2<)CNiM~naHgiTxK6^Tq1Kpm^ z@9-AP_459>@M5_ojbV!cu7Y#Fo00L#lcJ4`munwe?al?v$^S4aDc#S+P*JgOV&@>I z>u{7Y=ar@$%kk1uE7TjK(_!wSDpbdrJ%YE^*TQ>>Rvg*Bc$6zI1ov$wK%Hl@91F0xklEVJv zFe)$<3e2y69jiy0__}pJ z7s3AM?eDzx0nVB~+T@CPOo*6J?uVzREQ3BKh9zRyrAHP~{rLg%BF3GpU4c?T`f#Tc zZ)aaStSd&K$)Y)l9E!oN$iLJHDFwkC-Ac)$xr~4yk+5Gbr}i)Ki5Z{^R^-w$>Q^3!^FvHhZokuV%aNP2ff~ zxNbwD1|VlCt};RY2Wib9e(Rv3ZgGLDH>cJVwY$B%g`TlOoRiLWcA%F*76HRp==P{_ z%9D~h-?h-&{RICdpu*JjJYx%t8^bL9LJ0Y%+@4so&o(#+tf1KKRT25T(Fg2lPvT~_(u{-QZ=;@a0G7mM4|0RYs4ZCDrTiT--Zp< z?SV7G1d^o5JF=9LNnzwtxyY7JV(ijbP<5fKvEJGOCawiA!mq?JIJDo^8e?l&DC4YT z+^8YuDgrT%fzM;W=pR;d-yX`qR6j((myYXVVW{WL`A=uc+peqR!qfR~Xuq1jWiW?N zCo@2>xXeQQ?Tw_w>jW)raJ4m41+-pERBSw@vA^PNaG!0`jLwd$(<{i*fGby;#hX`^ zJ#18KGzAKem@JSRvddn4hcaB9eZ2O)@Zs}}FD6FDP-}lE3otgLAKD4W&QAG-5P*S1 z8mmN=);Jg@f`?CX6k!=zA*q)pu- z;;u)*%t_sc)khvD!y+Fz_bK@9{i<>aaG z_J0roWDS0@>|SepB9<4@JPQ7(Cg0}ll6(b3-7)~~$*buri5pRf22CQ#9fem-f~*Uk zX&?oVX;e=Q4ga9O)nJOyJk~|dFt^Qbok7DHc#7BA`i%p&T)7pOvj{Sv#)xg7)jsyc zmkfwdTS{(oV87j=0YA?{E1AtbC%ue8c5)dBkRy?|7C+Q%$3RZl?%~=4BKT5 z+rJUnzf$9WBo0#lY(%>q?_UJJd;kT!7}HZgXM3|CT4)mkqAjwNbcpjR^gw4i{sRh(k=cooN1o!4t6lrED6Se( zy2JWSd-QG(G3`PzgdZ&7NDAIdW3kSz%kh#d(l(;+4LdcmDA#OeHB!5iM)Z&t!W=$t$;whhGHBLa_)&!~2Elk-(0}@0tQ#bnP5K)s2lb zStrpx1v#dfVGm^gYX&_}t>j;}gzEi>3-miLc@u}3FlQvwm*)0VZhW(zjH>)U;L*9 zgkGz#$30Vi2On5b22>09C>lKvl|b&S1D!=YYRp)#1I_K0+*z;z@L5^mJ{)f}#fS2- zj*-oMaK*F14202__Z&x>6E~oNq>4+gb-}um8_L;fY&Z=MKFgiTQ7KBfdG$DC*oupk z6^{FEkI3?mMwsj0*M4{|z3WwbkrLrVbEm{qm%(RvtoR-dt-__-QMbFY@siPo=C^pt zNZmUOJ0SjrUh+^$$W-x~#= z=SN<<)HG>cM78MV3&$^zn$^*JMO7V(1qIIgbq#Z44Y9T{QC@(n*9{i9+d9(X-KZC9 z->-cntPeY4?bif;sK3U5P$Tun72JZ#v~D-D&*!%wJI$&~QpVr&q|8Ym5I)bzv*AcA zF&!gnk5ChS*5vC8{|YMBZ`D^*ehdZsX0}jVYd_d(=j2aG;X@Jw) zpsDArq4`}h9F`8&I9sVNVy30pY0O<15>z+!oj-0jz1SUWAC5xGu@qhIUgUVmZnF26 z9^Yh`$TkzTmx?I|-QukEdg(%sp7>4jI8PM_+y_BLF-D_O%rHQAOX-Xm;aK90Rtxj< zHY(ZU!4Y@heLdJItYT3f;B7qurKRM0l~XX&dr9p=P#qD(vxmng=vVqEhYlk?8(RK| z;p4R$Ep40*tZHCc`ie52&>Kg%6mNvj3E<02%K5<$MLRyVS4Ml6z&D+y0zb*?(%D*Z zm*F4U(+DNh=|QV^S7EX|#!17RIeHBol-2*t5)|F%7@3ZPhj-!gMP^I(=dGAJ`w#B# zKYkafh7)>l>)$Ot_{v)s5m$&_^mCiji`}PF@o1E@KyFg#_I*Euw8h(fU@@y6A)+fW zH}hzvEt*_Hjo@y5I5QhVa#=v_&zVr!nR)KnyH8M`{k6(7ogr|$^HZIY6wk*F2Pi>z zT|jSnmtRD0+BLkhz7MAwEtV5#9Y}dM^$YmSW(MrA%3G~yz0_gfkA=?+kkY_-V&HBk z74eh1fNYBsE@{4Cv)CS%e-F1kY>0S9Ym1^ucdYj^Lqu8HS8_8Z&2!gO=c4cg0-ZO-&XR;*i%3C_b4b>P9tNa&m=yQt2b zB)cNP%0_2ZZ^Lr!gykvD5Cgoe#6*^SsUHP0XmOwuZ~5=mdArB``hVE#-qgX~UN)~O z7nSwCzPYm|6gO8%5Yz}V9yJq%EYzHS=@wp)3vx^ZbllTP{|x(7cQIoCG5&uoDBx9a zLKmzp&nYqfGj>S7X?ZPJAo(^jLWKk6blgV{sspsXE2MN6rIePrL6HpQcqp-^Re2iP zOx0g-19eTLfRFWPuh)YGg6H?)bfT=h$3x*2CW+kL8bq(3`=u%;)OPr%XElrJ3E7nq zC+@5{ZI@;cPTBv<{jHo8l^f!;5r^Do+plC( zgGqf|rbrGp6RcS}_E!Da-iGGPkU;^R2O{mCz7*x!B>Nnmz`t!rE#kvE9fzG$%(Y=g z${q*eXU{RY=5!sEmg(WE4ATKWn1I>sx;ACu3%NnGcP7Z3o$nmo4;4GB(4h1xrNhY@ zXn>E98Hi18u;BK!z|SCBf9B`_tVfJ4S##qGy=nf3sP zGUQM_@Vxh1ATp+w?h+2=xEr?R z*UuT+Oc`qe;9nS_CQXi9__2WTziFTT=7SzB5iw=?vurH zGkGAFrSh-@kENrKep`u`HREy|_`78O=6=$BSCIQ+Wc5;WK=z*XclUTZW<<|2Z~VV4F&coP5Mc2!-PDI;6ZO_5@xH*qUJZ zhn)>YcUSiFPkdh8ktdFr#N{n-G?2aGY}Hv02M-)HEepH`PVDBAUCitm$d8FmMqgNbJSColE*`Q$X7zR0H!) zaY;d1JQ)V)_I4EE`aw{wfj%`zW^knw=t3Pw8;Dge-~%GSgcD!Giy@@U-q*CozNaFVyno%gP3 zC%cGpZFEgJDaSXxeNQ0nE|1};xjLh)YEs`*rJPWGOWZ>!AobUiOT=tTf(tVVl-Jkt zoo*ded{~gURet0wuDhG$V>$T=&0hSHA6Qw=(cNAG&Uz{=-diS8>)p!>vKWk$&&C{> zRIjwuC-AS+t4d_H|C@3r;$}>S*jq(d*XxqLnDRiJa;X|;c{S3TqFRJYpjFkAJ)=su z70ME9Hhj&n?R*C97tc*g5=1Nw0zfC!eSH!D(&Z#0N6o2G9^~~v+~W>Vb{$=oO*$$o2=Zh;w?ot zf8aaOHkHx*5%`&n!aIV+W&bt1b@7U-&|V6s>p}XG&4Yp*w@%6!>>%F8Vsua03~+vw z8M_abuT9BT1~nH=vmzq+0=te~fl%TplNB>`TV=?uNE*b>RfhtmUj|XmySUk1#TvoJ zJuTAyYgdpH=M+BI?9BCWSCJ`+Hu;TWhnruLV3na1^CA93RYw-80NV0my zDBZ{f_eMr<-{FhMp`4z+i!m9lmWbS_nNL7-{2}>+GV-AWUj=X;7|SV&pIE>2vP}8x zI+>Jb@gSl~mG#K>{-EP_Tc3{z!H@v_A$Ruz2QBS~p`DfE}pl1_X}oei$k8zQzx z8Zrw+o83^g=ePS2p#bhjO(3UpccPqKJLmBb4QSjS1v5dD-& z*w@x4!)M3hsu}nMfC*=Gd6CL5dUQQxDFX;uniQ@;iILg&zZODsev)PWUey5Wx zm=u`D{}rK$8HeS1l?|KO4tMV|qNSb5&4Azxp6zjF>R{WHpkjwV!`QWwcr5)tOGO3TkY4um5QVub{0(G&2auk-IA4 zCKwGwYb80l<|ODgZv61Dio`8Aex~z#Wv`Hd3b*e_%!T@%s z%4{!ZRd3E*gpk_Wc{8~XEj@;GVdE3KRgOR^($EWpW8j;dc^7g19pl`1_Y3QqzF9(W zuk>~zFlMRB?~ZXBmcrOvt2{~5_9n5xds*O}V0>iEUdF)HsB+Ga*IjsG-%vVnZc5_c zLTYa1=-fgq3spxNI?jLQ@@Qe%*QgK!36p;sAU4+*4}W54`)e^#?)2({Y~(tCQ7h(ahl=)do0v4A?Up`w(ZUV$8<37FTx&mFRzO7aNOjDlZVVi{qD!`L}Sa4JV@C5 zaSV^AgO3i{c{wdnJk`Es974q(>x4#i4M{gQiB+gzTCK_ zu))}m6sn%8bbqW1WMYWn*S0CuV1#TNs0e#gJ`RSbe9~12b#y{@B?MtL4Z;s}L z_57NyKjKDUr`I?}YntWSV8elt_z(WU5KeQ3grpS}u2eOLBKbR=II_KrQoArnK2+X;A#*pd`Oskcpw?qBcDBk#i z=iVPP>+5sqFmCw}M)*I#_Fp>AJ;r}*2-TjOb<|+@01qtyJz7+$AlQfy-Wa72DBhm7 zPO5T*YMeRRp#ofUe{oRr^B^N^k#ZnQQ=y5o$il^V`;PO!WBizy+S2IZg^$Px_3Bj2 zyEf<`Vf`(^LSv%~VtjI{w&WmByFqDDYrfPjv5aN)D zP7P*k%@`jtlZ;FH0#yVx{XVUB`w$wD<+N~qugnYZW~x+Vf!1j)c}weh9(lMCtsaa(>C~X?d_$kM+3R?nq>OisMC9%RKi84NI%*1B)V*WHE$i(Hhl*bNrh*4Nh@ddHRsI z{V@cgT*l1dEksF0Imfu7qDRUg2(h>1sv<;q!sPxjKdj2^D4cjI`6(-vF;uPo`D^Y1 zht<)cZR^foLde+!=jBibl5+FhAgPhsR!i^s!SgJ_0a#+Dv8I3RMFK1$Cd*u-IGlae zNOIifk=lq*k|EwOgs`#qIbF@(pOxe-dt^y4bKT%)9a_qxS-;T20FUBo^ zAwdDv3T-~p#h0gx8BJ9Hb(_)Mg`(y9p)2xOAb4>oc*)BM5y6BNTSkdHi{HKkrQ2Iu z>VBK&BHoc~+Lw**vO)_tYHH(A+|`X6pLDF^j&BNRy0cw*YS{8ejl#Vfvc(dxmz7&D zu?Gk;dKRNn-i&_X{)z5_Sxp-REOc9LR?h~mU` z3o(k((rTOwLzweKM;iV6l&i)i(wvoJSrzs!=XisB z&_FgoZcd27o+7I|o+suxFHYs7$p^ky=bEy#RKW+eP(hestCuMna6txq0(y*UQjsWc z{kf5}HOut#J%a`s#qIB(b}BPl6Xp?qQsWkTuhJ15Htvnv_aQ5icU^S`%-uBz56B?O z`)4NeRuwwDaB@XvpKT{};O4%Z9zDUQl_OEjQv0UUgJ}jn9_MvXwqKL}{kjIkz7z)l zBk?uP#KhMcs~?;0x*cB;0qC}tH$n0BgARH5SJFU{4f20=_H>DUP+Kz{O`|WOHByPC z4Hb?#k8wp1IH8!;!$d_&RP6c?gyK0iW^rhCdOrYRJMJx7M^h=d=n)7}m-O_0>=9)g zXA+2Je8T`kG?^D0>oS(ncYn;}DazZcYF_p^6PB0T((gJFgBbztShEj0u#?;!AAN4D z7M&qdrk!nxicTMQ6~`*qr$9OMy{!4oUOS|oZ4QY6!V3g|N5A}`w7?7@Ps>T)8t#Yp z&vJ^y_&_XUp(-x%6?VY){7)BbcejJz9eL1h>DOO&GSwpC|2@lO_lZS`f;MN)9~oY_ z(FH9a1jckw)8OjEFvB~s2ow}!DF+TT zj}m!Z)yr!9aYma##9|$?A2noO5yKB;dx&SlFAG`xgp+(1b!Q@Xf=z*B2U57WXH`8L z7Q*hhHZ4I*_4vJ0dBLN8ZR(jK@u88y6(Mbm0eWGH9tU564rGM!r0-taDk*~0OYi%8 zSlve(u;Owh^t9j#qenA>NpZS|3G?gbEtA=?oZT6bDKXGK8r?o<0?WVSqfBVUp=YJ> zfMPaF$Bu(v*`aX`1A`m+wjmpo?846{cYyC>zfg%dHxtf}L92MGz&SG^Dj$aw%*f&; zDrO=YrpYn)Jjzp;%lsrt&(cMv?7nkWQG#2AJ2<8|J5e8eXf76`TxI1u9MTNLf~jm) z1-_M>F=(CFUnXcVE&(ms#xx~hu~CRt8q__Lr4d92_QbDVwdM zw?%Y*?F0MYlKT80O-pT1qL98>F>z8TUY&7bukIxEdqzwM@JVnW1f%%# z#HmSJuEo7$-FR@vrv-VyYT8&9rT)2Q>4F#5gy>`U(yqD)>{^^s;R|*!7}dseCBFLj zb8RBF1FrFo1{xki4J5r|swkj#UXz#CzELb(qU%S^yn_&~t_@k*AA5pg;(G774imkD44yYMNsy6hw#htepS~>|))TaAGgYB;K z4j%#mbp?<~m-s1vi`x9WGg^ZU-lgE}P!vEMG?5EDBX+?Cyv0f8P)G?WTYk7G~ zS|O{U@!n&vIfz-Iol#?~lLqK?Qae+uYN6zTy?2uqPlazQ29xJ}Z`PxScC3l-}OThLp$gKzhd$TR%7N!|jro00n5BXDOQtF3A$dSoZ3I*dlx0794z>1@@l2=fcJ9=4v+1F2rc@?$%rmAs;DDB@Y4@@y-L^umRt zRQmB@f_Wx~EIA+FTfAnYUX5 zImFFpnU*W4;>CuvPsn<2Ue9|nZz}cuSz*zs#}=jsquee-#x=1V$F?gNsZRR!L^~Wm z=G=k!nSjbae8jyqB-1`$m)3Ap0-S|;SM_adH(T32kE2TECG?GjOxGKObj~%BDCtd2cM8R~(LuqZf6L~$&KYx&{MjlDJ>m{=PhcEvRXd2@G&)^vK zWaRhzg%SXr{uXu%E>ga_wnk7rvn~4*4rhVpA+A0ah}N0DU*=U;hihW(wa`Da{Dlb2 zk;)C10Nf7>L$rP6(T|M|+O>E_e=-k=LMK4oF>Yq~%S8P20o79}VDaPp831d;Uomq$ zVrFUfrRqHyD^`G5{QcAS^p~XB=UtK)`5zKMan+d4amL=zOr^EI=P#lj?AxC@E+|5e zDsp0r?;Q@jhjY+0!4vP=QValaV{<=@MC8)sXDxjlXh%DX=+`_`t8mT9Exwx>C%i}HoPMf5l!hV6jsh8o0bD3e? z5f9tT8fb$Tl3@a5B90p)b{eWJ@Xj?TE;-bH&w`hSvbldiAe=htGEAfL{hihJ>^jyFHG^iG64>r({E#H-|^Z?725$*PX&n{)UEt|3iI? zAU^OkAIHZILDkNx>ttkWF(qUp0ub8A3`e*h=&?-x^T-ek@fbd#fjKFo>{XGEzAPIc zt-R^~T05Eh$PSm$c2ui3!T2`#OS)Pl)xOCF!L5Nf+QgGlIB``W1SA!(m>1tJ5uq0koduH+rvL&4NP3tD~OT0ZG8Sl*pt>d2C#gYQ1DhN!y$ zgv|$XA3Mz}^)FP^GIXd+#LulLE5DCMDE=r8p|MJOLgz0^5z?2~Cai0VZm$6`U?W38 zUcv6ks|9)zNVXDPPJ7*X`WmSzcp-R!@#kk~PrvI*zJ@65qzs;+zlBbW47{Uzg4siP zS_q_1^}~4USkI!ef4|4}r0iUs_nUD<)soL=zkzyA7FU%QoOmucq@xIPEhGnE<5nO zQ5w)U7;}U+Zbi)9e<~u0pYvmTx!V6)dFSp`rH%^yU(y>F${4-<*7VW&sUU~_5&P(* zbg9Nj-tyydxo5q2_~a~72)j3$ReqvBa=$S=;Lc>~apJiH10^sxZDL^*uguEH?piEK zm{#z4_ji1dY?@^c zlBY3AaX9WB;NuQ&)=no>k<9~XKy1xzAa>{L;T0`^m4HobQ=Z4J1#NUkXb;0qA$Z}x z369fyicJCQ$L9LbC`W~8;>Ab|^JBzXT*%Q^JbHC{zV^_$X&z*zxIja1`jWg6rH(&# zrDjMVcF@!=jf%Tg%gd&uLG)7_w0gkajiy z$w(KX#+@Zu5ss9@zAKc)JDXWAq)9J^q|Ox^9cux@P%RFI^j)VBF`YsH(=RuanyJ66{7eABS@mSTeIx&zMn zE!)4afJ9~nT$X~3*WnNLWl(2`&~WGaAMztvw;tNO*9?~8CP zJ5xcQ1Kxe?MK9&v{fTI_*cko^|MQB&*rW~#NE*3|JcfhYUVj=LqN-vJ7(!K``-f{j zWA`#r?RD6Q9;$|b!y2l{-Q9}80~DnyUscCFDdz}UM?=HPS)?=kt`4+XKtuz1r{oJ# z)!kDUexVpv_L3#P{}qEKG>x{e5PaC*YrSJzK3*;+^-?8199&uhD9 z|K{SxK++RRm4L}~B%E{oio)=qLx(tQk@Kur>TL_EuHRG!@4tyOk*9RB?E|8^Gbxpw*1uXJME!0|mz}Ic!spT^i?dPa_ z$}T!Rp#3t01Kicy&03o||6HmkyqPRoNi5uG;59LmgN;<{q@-r*H2A z86_FkPXqpMpK^EeaUnoxCPzN+{-}Ck>g3udf%dYLgNzN> z?B!&5TXU7X!KR2pWvE>*R${c{v5Kdl-VgWS!C{X)E$_V5EMAe;`R8d08(5Fm^@NEw zu&ZH{X@c2*k0jv1aGqG0^l9Aafu$V3WY+d12UPXFC9M^4%=N=}0cZo}ThzlB??W?< z>wFb=v5Z|?9PTU--W3le2~n)A_m*ZQ_befJv$MuL07L0w_rX#{<41j>?+dTf^PX`_ zTVP4vz4P`rJETW!M!v8GA)A(2rlBst_RSnSO*o6l7Gj&yACts)?^S?l)4%J*6c>1vlB z7qhDBmtPLlXdqCTQ`&gHti8ECd@f^N3ub5vE!BeOP~2m>9-!bSb;-k)%GnD zeomfFY-5|bw*eW*!u{AyY%M7ttsBECcav$UJ2GP1-~l{4-sz`1B*^i|1L!Q4$jeos znc|%(^Jl2yo2PjBg?H9T-)!t8JYeA+3;@`R0J45kexZmhAPa6HGzfP+<#iS;8Mk&( z=DmXZb7L~>(}9x zo31a#;u@&`d2Ek|RwY4Gv*Cs~XwWM1uxJVNNxTL0IqoHsTfN<_hA+j{j?Oz)R|DIo z1r~^aeA|v4_P0vAHfG4+0=Dgs;wfH@Dz**|ExRpjlYF8J+^r2k$Qzf9XYPN!4W2n5 zsqJ@A@%GLL&&p+f4cYwZhyS%Y?t-tA_^t=3_K%l?9R>)1R$Ww$h}`NMUZuu`nc+Rn z>z6=p(r?_!j#1bF)ojptp&3CRnNMya>w9a0$JePQtK;06TGPjaB3L({b&-a+V5V7M zq2q*!V_7u4hj#>kF#|j}U8|ZF4xuwGt>zi8G>veryKzMw))4rpy{l&hNt9mSNxsWRQUd~o1%l_AnnYOI9lpG2mM$!~v!n}`$MLJQ-!*d1HD z8u zQ|%WpPC#ORdf1gSLCw0Li{M=0%rN_s%l+_Dck z`w)4vl6{ez9XW}#&hu79lRmIWi9O@^eX{#XCykW$25`3e%_l_=<)?6bj&Uvf+*;=m z)V`S3YW7Hx-;CmdYNCG<7+rM}jyt~@e)FjWI*ikxmw^fu|15eezWKyAaE9xQ)h)OT z3)UMZcr696UQ7~=TD6uw?zuJhh-7|$OG4P|<4%|~=KQ-eOM)87^0wn*(A@sf`PNXS z*qSSOrdvXTm=uXVK3o{m*I~G-^3-!!B zZ6Nkd#6bR}4hnY16zIp&Q2^Ku6;?DP)I&|ch8hy(RYmhJ!)W+o>D1RB6(r%I4R14} zU_%B}MKoNFK521ouLuezP1xchOiEJ>8Tfv|Ey2T&c`5X-^3L$I>)Nm7@9m2K0vW`y z3Kznk0O}0<?~uqE?f{JNH69B%Hq7WSF-sg0M)bKZJ)>e71J$(J<>cd{7a$+pT`VvI!7 zDB9oO7|s?03|&DVyp*EUybaS}+Z~F;RDas>5tzoJ1k$ORL@P<;1R)iBeK?BTdM#j> zr?+frtpE=!*Ee8JQ+#0pi! z{`~JjQ*Oqe>)~E%HM^T(3pq1?Su;1-a1-71d6@D$e931QuZ>VQ{SVW)U(g_SsTj2` zvu~tJa4mTX;sC`=1f>&!PTV$r-5bD}t~$0QzG1qh z^i@qZxEVTUXsoj^?}pD1zAzc!!*|xrJ!ACY2S^m}omn%vYMqNri>e|%LYAH&`5|D# zUkDkHVs7>lrTkatc-DgX*mnG=fCAZoj$FW+GI7P8%OaFVXMW19B&$#VIv$G&J9@%> zo%i9b#fWE{(D0m`nXwj$tL4cJKg9BFwUWp@qj#0lVs2g8q-i_LkbAJbgO6Bw=_MY2 zx)D}4|8#ly*f6z9Zqyhu5b_52^5$?b&9O*_Lb{~#cd*KWYM&jkY-??9DAYv#=VW5_ zq^F}3wuxj`su3skRTm9hZL#TX*^AqIfMszybk!Te|4xV*?kbyxtRP~nhx}b;weOps z;fbhFrQFnuHv-s#3G&0>{#;&%{wh9!$+q!_n!3XY6;mFpCLN4n`p;>8)oO8+(*1lnejF$5vh>BkbnZa= z1kfA#FF5#RJL-3LEcR~0k4=&ZbHDvl2a`TG2WZhH42Gk-QBJ4Rz%d_%#2+4%I=5Ea z4${2?A=wL?Y1Uk5+5!@n2oUJ5pk4VDidF{~7*V9@{||iozbx;M^}YG`8pVjp2FcaW zaQo6wRP=tHlp@)Acr?swdWaV3Y^IfDXG+=a{)5IR$wwlCtN5nW)?#Ex^0>F>us!{e zvJT-j(?H>d4EAq>RFEOr;YO*a13okxsy?t!fih~1N{-jwp$S~9pDf`VS>b=*&po1 z84*na3kP!^;1K(w(L1iZ$qwuu4mIdZeM$xpy z+_RDkDw^yBVWSo!vA!4`9}Q$^N$1s`5VZYL@JN5_cO0Ioa?VpYLXq1G^496sd6o01zB&M`MH$qjx%w*lB}e9cB&fB?0)J^D;Wx+Fu`^l^T`{ zu3+wot!FRcyf|f~|Ni1XzAd@)t+Nxl;HmGYca{(R zXKZ=K!xxVGz(73IPGf^dVu+&uHin_m0QM0d`+rr{npEuq*EEo&A9g_Jo9Q(Lem>CA z^?9wQG6hBQ_3m+O%(V~*46?A~xnneNBz%6zR)G4I`K zIbv8aVGF#N4~ zcWOehgILn6Yw>g}s73`k#_|R6vpOfAE#qH7fXZg3?0x4_Scm^LHjvr$ME6k4lJR|4 zXS=A7C)_teuw}>D^Ve^fV24}Kau@zuiE4r^YLNqgQz;s0Q#G8_` zX+Nz|gb2Uk2quPR)0rP8h+|kUd#&IKCuVALc7#rw$RmeXLDlz2>JN{H=lmsLMq-6^ z)hO9@dB+H*)oHsRls+1U)G-!mZ=v4zH?3LHeNUZ3N2N1enI^T(z@V#Dh0Jcqh*{sj!St zxjB%j?=*}q;9Z+I#!urU9OrndR*VMumpuUN2H!#fGWmC&4BDNqKTv7kw8-1{~B$Oubde#o34;BW#t1UTTISCei%e@DDgJ?7jsvQhTGA@|k=q zZ_%ylrhUhXfCMafB-^)CVD#EZutjthT%8GYopYFw@z8u`Q`2uuP97frQ&SBMQ&SD> zgEi0OjqzpZCnNQ-&8@?mjnY}Wy_WVOf-@jO*1Vg^r3{|+${)Df_`*i*QiS=K_?c0SQY5k?hQSndbM3#(0UZ>8 zVX8OaP_JE4-Z5w=Jydsg_TXAllA~G&_!uK`#gUnO0HL!Xfr1Mb1BtWN$q>I#UmT>j z*6weVHJYnr@WIh&XDV-Nz~arv1j>9-7Nuoi$s@68Q3@eM1mM+Me6G&CUkNc4MG8yr zze*CXFnkQfV^qnLj-iHrLC#AIg#MRC+FL5d&lIVWN&33@mT;B$nAKgA(?3A2?MBJZ z)&R}*u#aB&S01M=NKJ4KAZZ_pA6Zq^TA3ltX%pV!)onX(VPEJ*+R2Rq+I zjhcPA3sr}D4e0~SdJs$UNOdy4um*$zQFgD!I)|SAVd*aKJdj{-vE07dOwMBq73Hj< z@~=*h!D97~ktZUJc|%+U8s_zh)0cb17K7JGcI*`ahWspCK=1+6-{<}sQ}FMvf%0oR zLu&02876=RUm&sh{7>(?rqAVIJ%#POz=!IO&3puDx`so7f8B)+oZx81w<>k&>Aesn z*8CK#VyY+HN+%c|SbkVca~E}!PRYhtwJuHMX-=rtpI1T;7Ps9 z7*7TV@Q*V5dr4vaKj>DWF$kG@h@GgZlCWvIINy#J?Xx%8x+Hgd^U0l$y6JS5V(!iC zyG?$pf*YNm#h*nG;7orM@b{2Gl6f$MMz1;PysnlEJZ_~#G^X@iFgH_w*xYJ;Bp($O zm*4l^5s6L|#lM}d;brUjv%d-=EQ=puq9OTwQSXm2(COYY7c>wU^x z)n*K_X{99CA&v`^8+Xzasnp59DIsjFCxDw2{$vtikDSe)pK^k^#s@>0X5twy-BT8l zU2;X})Rd!i&ik>b*-c3hw@&-OLb&c}@GJ^eDqku?H}Bt|q)9VC$eUitGGBKomZ)Rw zVJKPM!sJ%I2Vfeh!oSt#o(rkjH6{j36ia!8Pb0=ld)~et5Y@He5+P!txg+$Xhu|^+ zNGS^E-2}XZ&$j%_3LX_B?P&I_pO>+VP;@HPJ|!~^s}0Hd#t%Vi(aC$I)JEzZn>=E0oUfm}(DH1ttyGu-pPaSIefs?~0ba5lq zezEjgoEK|Rf-TQ=&QfbVNzd$b!X>eU@^bz5xfpt1T#u`)E~B%Mn96p(u(&^c!Hp)O zi@K|Yr@a_}|2DUGpHD-l1 zYX}eT_&!Jdd~=8;PFC`4qo#k++-{5i6~_hEbq(Ny;2M6ssU6PHz=vDCYbE&H8UlZG zWJFH~frmY=@XG3=wYPX1y${nHOMCc`Ac6xo-I_ z%g^8E0C!9I&KutmKO&VrS1m@V=Qg$x1{=jQ+?aT)3cffR@<0CA*YbG$DCB>?3tHpf z*7<>Vo@-J!63O0?rHLlZZ4i)TUdeDk1Qz67p0X*27rAZhSTgN_k0 z0NK80oo7hH=)Gs9)Q7lF`6KMLfbKN+_BXSBP|W>e~uB5-m45VfC0 z8|T|Sr0dqKuv>k?`{wZVQ`hm$G0HIhtZoEkM=zZb*~og#L-(qGSB{OzO43{eYmc7+ z&9t6>akBEtABPy76YWrOE~7_GZ5k77Oa5QPf2G5NjbVWJI{VEnkpsy*z?00 zmTL(xoo^D5*!dzV^)-`a&u#GmUB9WG&I)CmljNoh zCggu^b4*sEyTTU&I7(G`@NPBTQ#}ku)ci6wu&~mdRG%GhVIL?TjRqJxm(u32k)*rd z({t}KX6jFjOcpqD+@J`X4_+~0eJF0D#KVi>HtT4tB!Z__X(RJqDLj1j8zwN%)LQlY zsB?2_4x9}oWL3@>tU9%%Y#+9E&VgBp!lc_Cs56p5${tX{O=k)DGx7YLAW5?Gecy!- z55UcV3D*6CvXscZ%P_w6x4+6zx1w&uY1;A2RKAeVR>WAM3u4}a)LB0vG{3~qQqBGq z=6k6d3_H(=A=Yg^;elPG@ z|E?&W?$No_Ct>IcqlZe7_fG`tRo!10Pnd8dzor-%z&Jd0G%Vn>6ns))%p8^lfj#qv z#DcA;n}Y%*2fiyUpn?BPI4$c*P-4pFbUT_HVYpuvFmg6|l&0?U)h&6;`j=-eAS$&u zkyh^hKmj{66U!c4d;9M(3~Dgr(;Wnv(l_JB^HM4eeQNNJ_qW9aI~0t$AUFtxpLDL3k?oL%zc(5&LaB3PD3Hio(nQ+POY8c*c6!FfWTrjO}_ZzG~_`2%eJ zQ?V&2`S}p-kwBPw5c*W`z45lDV>>RGV~j4VlWq%6r@Dg-pwNS+@3F`?o;yema!fgN_Sk7N1Fcz z<+M#i^(V^{q^aV9UuO7#YSvs4?(hV7HXChxWwf0>C4CCkarYMUiDc>zI2+*%v+*Cu zefl~S($?L6Q1=~ErL0#zr~7*ypFXJ?VaB`wX93ap`7iO@O5EtCdg>t{0Kl8~V{dmB zg6X^on!yV2QH{307~}r6OXnP)=sQw)pZ@a>1>atRR<4q;Q&h*bI`)OZ&sL;tgBuP@ z&7(z6p7m*f8D?S~EFB#pY-Juhiv@tc^XJ6acFoJMIH@1^EwXX*FSq zQ}ykoR18@~#$Tj7PRC!U*Y6T~@#VM`@Kof)pb1F<;|g~fj+@qJvzSfa?-{nkYgZ0f zjcOHXqi)feUsOmFY3x9Uh}7v0;|4P@cO871Nw8qi{u=czt3soLI$*ZnNd|8??+AU| zwfexLO?v=C<@opfa(J(`>uor4f{&1^TE_RvsMJ#l9eYxXr_*1!&Rd%FzfnrCP_hc? zUF)g~m~B>Z>?|bTldRqeg1_Sam=;pzT}G#@r!Sf}NRDCw)^i`bWlX3pB7D5m_u{J2 z@9D7N7*(E19DTWoc2J<*Ti!Q~A>G;Cfps~ZD8JirkS_EpGVe|@*HjNQ4JMIh=-aPC z-2JbNp;smVtVU?k-|+M3bm#JD%fxKzr2G~G=Jl1iOx{f}C<{Gok|6_MxPH{E9+8E< zpF;wyN$PEFqa8ft@Vy)gvqpQ^A4dy@nD@K|zPVo4AkMZuTy3{&qb;m{Q?c^rsdG7B1Br+A}B&D&>hRGytfQ%;0q*kn@3*;j8P zLodU$>mes{)3gSAb`s@xgqrzyg!uR}Kw_|mEKx!O?VLAFz_j|EaA4n}Q}oRA`!t=9 z-<8SlB>+HJqv{l4VW}jS1b)RFbk?o$E0-n~6NI($`#}I+c02WMkQ`vQNt}NUcG-?# zgWGF)I)}+A>oh9Dg_sM-C{V_<^eD4_RZ-Ik>ufb>SQWIm{owZ-D|+zu)-UgLdakmO z*-hVCVT>j5`kK$J4JQ95fVBrqkBoJp>==i+bsUY?6z3ZnARTEq6m`IBF6Ru{Uc zm~R7_MtfsRc17>!qLh&Fieyn_h{!_rcaw6j5lPe!#6_UHU0*K3UT?pNT&XGvB&3vi zWW+(#WT5y(Uq}!PdE=?A+5?%Tv zdrl30ZFTj+V0F@s_sSAGJvwgjbUR}DomVwm!zuR5< z;NzQfLQ#OX{-84gA7^(Tbl5o3bCv@2@Yx_%mDDLv&7`tsTfUMm4 z{ys*1Y9*9TSo_DU`_G9ue?AVb7-lB;Nx*9xsH+tG)rOh_lvUoiGozG+lA&n#q$86D zF)(P8HCi)?6)C-gsT1h=Zs_c_3v}8k9(5~=v>DX+Akp9*IC%cH%x~Q=7r2xkMUv3B z#sDJ?K77)$#UZQe8LSg$j8-NwQvXU>JyS%pU$X@^lkNQs--#*)e2J(Oj5?IMdM;7SesLA+BPSqw>* z$2YPUtHy{ev607ick*PC8Q?HD*jMkj`*RmH0>oo2bP&}I9JN~V*3g!;3t2tp>vIRw zOQvyW654fgg|^C2UjDYRmE!bgka#~2>de$~u@ZCJ1FGuC(&-dm3t}RQkfG-iTvr`& z$SQ$w&0$*F{9@#rlTBQBf2ZO=zu)wUy@oAKy*6!wJdz!}LJ!YS2aEN;CfE}3qo<-%#x-HJ5HvOBj)E5}_;9JY9gac=kT!en{9OK2wj_}RH-Md##*;9O( zIfcC|j`DdIHWZtyAgJ=64jDT}`bkRBUxu*tbfp8Umivx*i6hB0$oheOeAdloOb_4{ zgz4Ok{3cy}B^4e^i6{W=Yk{X^z9fATG*{p(7c8mFzU|N;Qa3v51_W=grW1gJ;6at*I;?xsHMG?}l2_8wVXtFqEy+ifa@+L9c?uLEI`K^%({Y zabmF6LkDiq`yHWEA~?C)LtI@M@w;L;gFvVr`lBwb0TazgmI`Ywwqez56MKP7{gCl| zJUnQr;jJ%^154@sc|kXiANrmz-~+8ymV&r0=159EpYu0i@QMMZ^70q(zY2}SSASdZ?1Z~-?<94$h1 z=!*P)odeX57b zp~;z+cZB{A?12C4`C9YSMP~C{f#-it6^X2?^z1Aoa^d$+TMv)jl^KUmhkkz+*V*)8 zMP2q>_@H)}hSVuiXN7g1qS`B+2n{jc$P_wNccNGt?IYHGcqoz^sB02j`tI$37fwzf z9tkp-2WBI!dri##WC#wNyVVk(O*HS|fB_`t)_ll2{|Qunyvo&;$)x|~&3eUls)$Jk zywJpH4q0%a1|ZSCD-YcDav*&UM(i}h=n`B=Ft!!|h}KL^In=6(Y1JGTpj4ucR+1hc zcLxIe!W0VRcg5KdE&Csg{P`;thYInAVsYi6Rqp!w+!l)(6NuVrA!?N0mLm|=dPGJS zx7bF@-72BPv5~<2N9Zp1bf&Kq^Zdr14Av~ilI3gsP*Hxqr@)R3F^kx&c`fK`WX>l_ zbzyuc_wy{J-2*VR6sg&cnmQn;I7|eLM_Hye zwiMJhfJ>aN4LxRYY%~;IkNduV9ODso<=6brs~2QV8C)^=)~z**Cr7J@8R#`60n*=x z{Vq=&JX`G*Gc+cOU;%)>iHNH?hb&d84;ff-JKr;$f=wm#tqMS-%t{P*#&NazU;rFENBqY!--^n z71J)PWdu9PL2`;QcPXF{X!CkpoWZN%?cWiEEq!cC{SRt4%<^d7e?=rGTWbac5@mji zfs{tS(P0!{n5~l`dk*t95u<~uXo2{>Vy0a(JW!xE{V_mgQ6_5q!?C4-`XVg)3z^$s zcT<3s0H)9y2pBkqf^mAYWEEMz7))bnS}A=a$zG5tCkQN&h8ZkFmkkoL;xEFh6u8G> zlTWI?neV+l;GG(i!56?%qJt+lEVAH#r>?ZuT#^cwA-VOAYP}YJXpQnaWfPgdgsxue zB;4U?Bau${m-OIOi=}E+#DB)L6Hk6qpds{!p)fD(tJ^d6AI2Xm1QB)soOt@nJ`9qN zOPBBKuOYD^D(W>jhSwp+`97fwyu5{0)Y-sLCwvfGn}#N5dqsQzN@=^mh6Xa*^;Dcf zNGMJ5-ngj4DAMeAFfh1?_#{&!#)hzXcNL1vV?s@@f|ohX_xD7YQ|1eoHob^FCSnK-;Us&drXg3-0^L5skNPMon zmYJzFr)Q6z1c(;iktb|V^Ke2R5?)rA!BLyuFeZqNr2`8x3J;g7FzV~t{ZDO3!4&3=pQ3x#vKt(RIuoM>JpuIa-AA( z@S`l!j{?%`Cxvn@4JAA^tg6#+Aev2JuiPN4r0=ZaQ|f9jHR5pT3KNc8h#g;0Wz!o; zt~-gcZf#Y_zV%1iJ4aKFjLj)Iqej)Zrn_!B4t1bbO7_nx5}1q()=+aVd_VCBB~^#3 zTiL>|3;Isx*t|)0|2;3hNUo0&vq>AM=s&Xk(bM80{nvK~QkvO95Y%;!B54`uV2&})OdF#ZeLVB!%B0DZ$C02Weq36>+drfNcL4%H{*!T zOfvx!sdBS_Rv>QIj4PM#n!C%trfDlii}+xJO=ugtc9PypgD7S5vM5qNPir!b-eoK1 z#Y%lN*lI541X8}PWOAGH9vE80z>4fZh1Js`RPzOZ|WJ{#!|3?Bcs?bD# z{->mKH2QT`TIq8Zp%DA-DD=b(a(9=bXIG6!NZ48xlJf`E&*qB|)3O*xIU7l`rqa=2 zS?eETSvo?H9FHvZg&Kx|Fj8lx_D5IAF~TdcOntbPQsGf{t^nZARNSn$&Z_-p&cn#k z;%y3Hy$LHSu+|nzNWB;m!oB(K;QTK4JRI`mVNF>4l5|hM;OBk?DzZRfiKD}`cCFW9OZU2&YRcW$ zJyf#S^QCcnIF(kzV2$BD|MSTu|Kl9it;a8t^gZp@0<})$tBs%NH%;fFwk@~3vqB`d zq5EOciMB|nnm;}t!{VqYjEnOnoT`AQQRpOu8@_mZEW6Ln=2;}@s=CbM8b=;im6h^b zs5?9*9BXgJk26(do5x--PlU>*r~z0`X1Cr0U)d3{TaAmKIKC!AX;P>@?!1~;0E=J0 ze6`fLs`^`wu+Z9k4VN)9Q}KPK&B+^?Dt5*HRc-`i9rucv8PDHW{mvpVLv)1aW9$7*aWaUnMLp<7NF6^KxV+FnpL!NGMbIGTLut6-`= z%9tyRp{CiV+(3t-0g_Z_gRdM(ecdXb#3!#$-fazjO&}e%IeodPUv=Pu^Rj|@$bWg_ zPuylmC6C4?o-SpD`|JpV6~sLm^T`uWUt`ya4i7&?qCF;x3|QZScVrz;s?P~0fCJyu z)mVy?GrMuCv)G6Uh_}pP1d6Ax_69Wm$^S-ZiD||@Jp?_8KC9`jkw4xgu)%t~{$15+ zDNw2x=?e>rTzeSX;`A?Uc%AtnVl^^SeFl?Q2cyZuV4lseuLk89O3=4%yQv>SFOo}) zP>`%SfV)L~mp4I$)`IEb$pEEA8GNUip;=48LSt9d>F3^n-Zs4)k!b2%^0N?AfGR-| zVlKYG(C>#FKH<~=Naa!RY}w-c)odkS zKs<~M>A)VVxP*RcN*)@J=fm>sOn$9+-koS+zisRYgTifVax1O=o*oJgRClBwpMZjW za1y_Kqy(26z;<$198{l)Rr2s7c9J9qQ4CQ`L>1+J9y-zRxA}E7pyWWxa-MAOcT(v8 z(ldV0t-7qu;InQ^(JVX-tcP`6p1TV@$*smrz;!ced`?RG1BDc(_1JPy9CkDTYRwSs5RAUJb{g?12wqX9Q9Q*j=YBm{rZHhm-lY!(EAA|J;Sr;9lx5iT>GUK6(vu3oBb zk74Zy;A?+Yv<2!_^=Mrc=3spMxcbW_;*CB#TItUwQZ}ci0uM;(F82!S;O^9ColCc< z&h$08zn0mdW1ALaZXZZ}&KpGhFvo8HbJEBJc|Q8>ruHYXL&sS`fWcw_Ogu-}Y@FG> z_Ep106MB6uve+NTeo`oqJ83M@KC!mwnDQ2|>4(F;LQOSoZ$e_d>6XdpMAh-=^Yn6B zZe$a$d@tF38}i0a`hQvgGCggzUv@?_uq$7n=Qq>{>`YGgO*((RSWis~q3(ld>yddp z{Po4#GLt8NPGQwTt+_zrY_g9(_^J$tq6HIeZ9_kvF_T4fIwVFSZ94d`411#TMyC65#a{;#RzFp!?D z!-T>UE>*Grv^sfWpexSTwf#q^Z!LZjHW2K5KiHLp4Hz``?^R}NxnL5kn7ckR#1McT zJY{JTTL0KmUn#O4HpCs-PI(2`SQ=UjybNOij>Uu!f796x4s%RQC?)Unc8S?*h0Mu` zn~r^rPc?waGg&gs0f3yTbnvtT0fRi2?O!c^U+j=ICb%Fn4-lQXn@?LmG3XR1@`2g%-nRnx8fcWuQB;SY5g{=tTP@IHc^9D4hnNm@6Qg zc8b$OmmvhDBYkactYpH#&2pP!JO+!KVX5F3T+Q~U!M+B*o}Zf^rEDf1lG&bC#$S%u z_ElO~4eTU=uO>UmyQh5{^50b3Z4ps&nl$V$%EgWIHp2srG2jf3k>@a;j>Ww%!@gU! z?YO!R9_;f`>gDRXl(gV1f2!v`T*hb!*HJ;1br&Tz|2DCaQP%%r{LEd>H_ILbDVrLe(&afqY*t}$6V z?)Q$gnKo#Ch|A}abkmUA&KjHoL%B%u z(c5@!KH~M+rX6hr*2m7ZKoQ(LV6okoM-pLx~f~u7q zg5*g_VGL_Z0dRDajg6#(Mr1%&t4Oi-=~-dow-@euXBua11UOr|v4Y6aI9@^! z*rAwSc2yT;HaQ8E->p!#+SATT%>PSP)!sG}UE|jb3GcTCi!kf<6o<5)_4RM%3kQjI zErRM@i2g*T>-mQty|D1Xsiax+&<|T@M(5ABW(`CGAFC_zAqsKtTAa8USb%&ndmDXG zOMe{pKL~&;bf@Askq*#t^l_Q5mu3O3!N49q(PG^jsD2Z_e%V5rAE)&7s#bUhDsDqD zJbG>Ay^A@O_z*tr^U>f|cs)3ZjY!s769dp$ zL7=>l=iiPwvIKR~5iIml1CGB)Aa4%g43p0RS^dJ*)n69&)7oEc;k7e=P1f&QY-;Y- ziV8LUIX2)5H-UDSC_X0SaFr)`5C`{hCCGjS--lQ$0aQxfbjBvuxGc)U?~$|A&f0Dc zG(6n3clwE|+0^c0oH23T(pYkqP&x(DxdH0okHHP;;ugk_Dxbls#SIt>Mx)%fJvY~o zLy)~nyKWd+u1uKBdrM}I0trAFOQk`^BQ8l0Ar5ooNa7+6_{O<5byel`x{t?39`E%u zk_mGb8TDkv63HlAnikxv82oGsIt6R!La?%e0NmJuiGPTk5#MSrU?-Zaug1ak?fap*C6$+7b&dJ<0|Jn)3b~FEY?H3GM{iHqp8@cH!er9bt}08=^l$m}T=_Hy1iWbYd-d%KY`uNt z)uV?3nWNR{6_q6Gn!C~E?lpz?HP-y&giwcyBgM+lmsylHN(*kmR9(2v%9C!-c~_?-2#M!D`HCHYml4#Jyqx(gyN@@k@#i{hn}*5%Htn+@haoSL=8 zlkh1oTbNErN=8+}XFZO6*-1IFn`o!tNSYx=vMRYQeonBpO+GKwJPI1AAWbzu^>T9f z&6U5W4u$<<#w&7hTrzmmk;E`uf7OvCk9gst&KBxI9SS_D=3Pnf;BBh0kWcqdWX@0KY1#~=MBG}h;$eiJ0uBI_$1nysIbS_@IxCC0|6WJbiC*bkVq zV*uoqHLz>KSFUdGIcF|hIuRk)%FoqAE>eLiDAh98S-q<&ev;#1{Fa$wc@!!Mq)gOO zr~?^U`kum+3>w4sn&GjSmTy|*ukadtJy&}usbSe5>$S>gP`#P|Uoa0-O1Y-w)8Fcq zEhnD0oNMVAl8pj<&991;)Us`5YXLr9AFt{ziW%Gvvo^*J-J_0A`YH`z@B%JZ@ORL-n~?f}sw2y$ zHe8m;tqK}>%Gbv@ptFhEq0Oqj8lBR@b{&<366G@qHd76Obl&Ij^^|;?l~3&s9|Gsg zlhJRC%qhUz>1g!`6BBUoG4|6cV*kLs_Nj&v*w9Gh)21saNjo*qCuqapDUSa`vn zvvF}-k%I5cWSFz{SoHZ0^3u539~dK+jn<>yxT7@OpVplO-^ll}g5p z&(P6ng;mGV&#U$(__Oh0Ofqd6rP*Fj4wU z#m4NO6_}hIVFpuii6P80|9-I|5`spr`!o3zL_6=W_XfyE>ykf?K2vX2y@I5cvP>$_ zV8{hmyP&j1R}E>%zysveH^BNgc>!pu-andm%K6sVZUtO*~<#-Dyz`LJCZBIxKB_;GLIeC4e zy8?c$+PT1x8 zln(oDR?ZnzWSz0u^NOVwY}=%s*TK3McGQ#w_Z9sn>MKIQJDyCOB$Y0LR&73s<;<Y(hBmCZYfkmQ!Uw9*}hEf!r zq7kff-)ED+$uW|mkB|JS1luR^$aZF7-f`yHqb(NK^A4ts*ZK!^zB842KcaT&c*BhT z%4{P?AFJ@;Ea9!3*XQ~4ohEqo=f2AOB;rNdD$%EU!FoCQW_h-@v1PkPtR>b zZqT}mPM5{w>pTG#r8TdAxS>-H?!6R$zUU69Y;eEv4|$cFP_IaxJQURo`po00lJe34 zdR`F>4198Qv|Nd)w)&V4+c8MTioaCxuHh$Tm>X+X>$P z&$7j)rk~luJ^*%aA`}dF-qufFiSW=U23Lvopdue#YKg)`{Oq z+TS|E=(UXMqX?g&{!u)FVu4`k?9hn{o&bNIDuI%*t?(&ftgKV8WmLGITm(0CZ{QO! zp8E;3r=OV+n7MI~v?@p3xtPs6-(|`2_d6m`d1g~1ThzW?WNT9_Mh;c7y%IQwhs6Trd=8yXciD-kiicVd?(i{`|`C1 zYQ*uFO(|>Zn>iVf6+1nWC36}5#J9SJNVjvQS)<)E(k@T+i=S__|1#)7UiC}>)4ks| ztNy{5#!0M2+5hl2lM)&RSzg|5Sjx6t$Ai&YEn8QfN*Tg+v^0kRf^}K_(`5N(%OSKJ z2k?6T^>NMnW!Q0;Qytu|n|k0A6Hp!WeNTTi8F_G(tawUe$Q|uJsN{LedK0oZSKnjw zm}In3;miLBD}uPlr!e!*J1{2I1)FkyRqf!%`nfKCpNVi~g?#tMb*a=x%ho_3*EjLA zl(}ncu7cg|IUCM(s_rAyzZyKe|EvcVg~7HSuv%O9In)JGj1$2y@EQ|%Qjkj@9B!}5 ze^)Zm3GEL(WJTc;cVRq`K5sm--433}shG*uhU_+9tk3EukRP*6x8l{(cbPJIr(aA} zUtKaSI6NAz7FL*)VEDbxSYEw7RRO)uL(%!T=kguOF?Xzs*SsoOjv-v;>tG{V=1R66 zYq%T(5*;nrd++Gy=N*gyJpB-UXw=HKG}mvpI*l5KaKPmQV-mp|Imt6Ets6G}&1~uc zM8rSfMv#Ufrmo}d|JaXCkWSpgsZlKN5+qn}K#T+s8#PefD1XZ7;vyoGwl>zWX6E{= zE{L({rVoT^UYLKHq{Mn=5>kw(G}we36;d%j#8sd%oV947k6{Og@6$(H5!}bp=4Sp) z@cj3^#i9t%RNu5Lv zMoK)NX6^2Hs1a2v`0BXm00W5(?bgTUDy5QSF>= z;sk_Pfg5V@7@}odGEm91A))t`da=3V<9s@3Kb55FNw&R{o3Eu;@Ha14FrrcZF{C%V zN7J}XHCfvz$O0sv6gZ&U-3UKJBg|m5UvL)?|V$Y()LTh$H^R+ zQdIkF6GIy|pj&qs^&f}J!G;4*S=`#{7(`M{2E@}1N;{B(@6JI!fP|sq2}~ych{DhR zk&xo`s{8zXBrTWcZ&A>h$lVqBKJef-i+meTfDHw5kcMpRds8MPNT}^|vy&gVGo;|i zNiSfdA3|t)tzd-PGycqSp8}C(+#DK+3_j%TxQ2H9u~%uk3q8@0_(RbA)MlRghu*Z$ zBG?s&wcVPgm!nl$bQX7LbZ**EhCsseP~>QNpRbUe_rok+BNNHjTZ)Mo(0!%MWaf zaSP_6#K#B~O;tW!Kl==PQVOoPAvm!yrt%6{Hj>2fx0bnXipfD+TpDggTB$t?a|B4m z3+`I|!;js9wgoP~fk(TzUck5KLFF`?V^OwR(l;Fm8{Rezx0Z4b1;}KULS53*u3w_( zH6TG(?{@FmF#WVX+0J@)Cw%|KR{B1_X0PhnY0kmRanV4R{a;J6hXWP#?YGU>k_b6J z5A5z=T@SxEJ?6AAIq#4B7%fJ@LX4p<7%TKr17~Lt27GP6kDo!9S^6}uI~2DM4cl@I zL87{YS!i6gFL^?gURt@gyb4SZP_abg=_-e{Hl@HIm{NJ{V0Dgl1wvCtn{8o4?gqyk zR-l39nX}Plrl+04VXo8}AY-WnLEjl1Q=uky2NX zhu0~lcfjQ3!xPJ)t5~4>%bN|+AUH}RkaKnws#IvsCJu9fq#q6|1PqGxjUyK00a{}8 z-&8*Nfywu$Vv{|=cIg)t&xh{yJJUWbXfi|&CLvzZZa?6A(@?NM%?~Ga=ACsYTYfLh zeorL6*SX4U$*epY`<$F2syr^ZGpZ^~aW{;+e2C!E)zDV0oJN&$7MSiWD+!!-OfSq! zjB+*PFpl^v!S$OgF|vq1Hs#)bm(@EWRQ<6pQooX7ZFEM9H@S)^U~#-}8makkN$W#~K7tbt?q@*%<8uyDLGDVgDmjnC% zd)mT++wzvKmM`-zuyQV{R@QvgR!jD&0dFHIun`GdlWq)4;v$Lr8WMy1yL9^9-E0Ge zWgwyHk48aPhfA-^9C+3~vJh8;$d6x}|5jiIja=YxcI?G4L&SF2IucO^Z+RC9Hg*>x z)C!^s4T;UN^7bX89yhRi+l%QVlms!~IidM)1Az8gEb#oNnnHSUVY+*5J*J1G_d}?&zWHM-nZF0c! zuxCy#@#wkw%o2pZLIt>Ouvv`aT$Kg;P<^qT&Q^g%E{fsF7*SDCEbRyy&sy1`H4f=7mkaHAhb*J!RFZptm!v+WSGAH)U5e#viS0r z33kBlFj$vkHQ;6xy#J}keE;?^v z|3L}dgWt{DmWa4%iWK#5;N8Whz|176(oc|;5Nn_%K^2=6d3G6KDZlBZ&s>cL8F-0b zvP?hVs|`dYKmy2!F7L2?a6~BF)YHN^yybugb-djxZjt*+f!c`&U60s=!2QKXRUKRU(?C(OK=?d znN0rpYb6=DjEzU{{ZkG{TJO3ib_R2&P8O>^D@Q*Gi;pISJ0C$lNbF^_<4=>C>1-T+ z_y95hW~7HK?}u=Nr5_q^XP^P2W=PJ|`T#%I=+}P2AnZ!2w93ihtnc>TAbr@^{>WH|RH zFJ}JtdHs(G;Z+)Dl&l{kTa-fE+g-0Kr&c)sVF~2PaGZ6eyU0*d3qVcN)WV>F!j+VG zF*td3Nv5$s7Z6y(8Ujs`$yWNO@QrEiSQZfRZZKCA&>I3n-{=x0`8^vyscYcV#_)z8 z>4d&Ig#OI}&=#M7a!lw|zVGe)8K2Qu0|ExM_Px@YFxlrd7Rbwusu2+u1TqY(rhgSn zxyRV$_U>z{heH}l6F~{kV37!yA3cAQu-2?R8xl7mJjMBWQS zeYU$CGB7hUjHrF1Q)IWOR~Y@pL^XOqu0J{f+}cZEN*8WuBw^3Lm;-kH2zD7Vhfmo; z=}r_9aype!2t8q9hpf}$9kxB4wI1<|4dGOrLXa%Gzfp~oZ2E1vUi!SIXTLOU{&?i^ z-fVQv8weyJRdvw%F70#D=^Vq+0mF+JdK$F_;{B$CwG&cx8K#rDeAVR-`LDkBrCq)pLx`O|%Mw{X;MKx=&a<^_$&<{bD~y-kxk1wj6Ev z+CH%sP57|i$mnM8x7l1KN1S(YXWQO4QGD}A1RNw%Ze82N*gbJ2G(sqw=D*66F`*HW z>%A3{5>b}JN0;xFEY#3T<=c0{i&xoC!;&A*O@im?8WbEd#kJ|Ylch*_w@+%)#?rk)Sy_muZ|{uv-*1Syt^TqWF) zhK1o$|9(}gYWEM#GscRKHrtdkFb7?Ngk(=zq`$=}`YsBc=tZ_i5_y=Z9do3)psbVdbuzG`Sk z0`Zg?Fe68nW>tJv^cdu_)Q>bAh8vYo67s0 zc^CHI`l{JH2g@H;|CR}m5ln!cejk7U_m8(QXfOQqu_I~}sZw_RkM|cd%VL)|bZ>c% z`e`Z>KA~ttCQZR!^WOhv2q*tB(c|AsKBDIwcqG8-W38aRo%4Us)*R!~m4YP^T1C<$ z!+9tYErQR?QRy?!bbIEp+HQ=YSDp{$r0dhzD(7q&=D>njeB7HYwc6Tj(u97Z_ePu{0402}Lwrb2=+Y zYjkkxh0I4qa@T11S#chkivspHIsbJ`coB*5pT#X(AOrg_rMS#FKQ-TR8WbI)Cg&tl z=w!LzZ&O7VFjn*@<+yhp=IX;#d(_SqDu&7*L%Ek zJg#O4yZ9$qAGH15g~l8yFD$@TRO1X ztDrbM8!m~kKa7Es$*846#rPB-bfI(HZNiq=7RlUt@Lz)U&iA)g?qdPB0 zirGTv+J$Krqa#NP%SCAptLKY+X&B~GDyCHxwuUs)H;3fZgj*r_dxyav59#4^$?x#7 zy1Q8maiNR9^9PP^-4t$XF6Ip-G4+x)qJy>sPbAgg!_bE#kvzxBR)OS`iFHom$UPxF zp~hUJfjq`UDF%l}5C{t)mRbT!{9%35KQd$t*+jso2Awe2c|4wpLla z#wo};a)T4JIIguzdy*S#SUsf^g@3l674R`(N2YxZ=3yX6ty{=YJfN!P$CmLwJ$Z@y zRTVcxYm@ST7pgas-V);7DwW*tCJ}(@wRxbG|BdUtzxdwNRvgkB|F#LGA^I;V@&Eb< zp_Koxl~$fJFPIk^4aawXKiRJty?d+577~qE&f8Jtpw{L=@u5D=WW>J_uOAtB2XCDf ziv3yWPeb%d-(SZjT*M5femt+2i864k0!xL+s5MkqlE@opp)IW>A+=Tt~ zHvsPfsvEaS2#(23+f5*=*^1#Xt%OK-6ZyEV2G_V>iMn{7qhsfj)x-Q5Lf-ugEgVD5 zfGhC+1MGravMW38NaDb%=XzH8>}@3u_W$&nWw14LfZ5#Mo?Jl>i&V1OD#mEqKUJzU zl@}wRt-4d7o)rY3puClc_FZaeBxjnt7OQkC<{4wm&({hzoT1cS%QH#E>;8qxv4wjd zZ4}5q;yH~}Yady3)4Oi62C{yLqI{ZoQ|Kf9SP~>BIKyK0C~o=n^2z(C58xFjNu@EB z=L1~GtDi`LEkfR_n*BS;MR;c6S;q=sk*tR=2`eZ~%c3s!^M#U?Rdhjl zO@TMBz>=B!t-WnLvVVErae2M9&>vIJj=tNBssh}x-3Sq?CaCof3XqW6ziU%bx=+EF z9G%^hlY1>4M!l$H|*9T&LQqM|$;I0W#-iPADqXylL!A03cQ4+ z%r4%m&wMc;3&+n!IHphywO@#jgc(o4G`+_kFs;-=yhyV&z-HlWDVCg<{#cwhAT#?{l&vqmH#0OJCxKs=?x`&LcfIXH5e3l{ze}q^i9BXk z5jUBGybmxx;JZap-)h58&`AlcK(rFx##2N@Ww6t8;r3?{2PzH`^s_s}LHLDI42B#{ z9LpCq8z?7bHgX=}r&pPyw?MUM*p~wg;5t9~Nl+&&==ocH({(H+3xk+SE=D;T$#=Ei zmwzm-b|3<9gMjwDL?yc*?zgL`DHh{^#%{E#Atu4&;HRk ziTvFW{e*TLh{%M!PxAaJW2iGFy#{``U!d7JAu z2W?0+os$JZZ%^n2d@j{4u-di~?MRuT70m!Y=C3IXi+0xt806nR`!F%Nt|nX!ROD2E z?DANFA}i!2zwI<1-H}EKen)H}5yj?IDl%%cx;0JLA5fWJ7)B#;<}%BSng()ciURAy zx8={HNMTmC2Pwa*<*z2UFr;fYq#oNKzAv;`aBvcIY|D$e;qC5qm{hLl{SvH$05}%F zlXBLZP4)TGHCcPVr^frIS-q*(bKM+cgXir$gx3o6Ri#-Yh46Y;xF0LZoGyuL2UdpLN{nk48;2(-EsfF>@-_%of845Obo85SBiyUcd;DYHXj zTd*O(tg3+ilp7v#!0Sd@&e7eBpCR2$_u?hK4y&$Bicioms$@V5cRsDz&x2OpB%zxT z*BuhdcwU2PG`ucP3%}TIknP50F|o<%MwSjQAJd|#G!xijef#U(Gc_Oj?LW7fI9@$$f!3?bHIT92@-6RU()k5dg@ism&9Dkv&4w{aaz zb!ppDg|ky*M^H6ASbhA;w%NJiyd(B;9TAFoxRI_F+{mtW z=`DDf;IY}_xYN(`nCZ2H+jaT)lFwd|E%e+PO4JGS=#?Zj981>cOq3Nx26?wZm@att zSMsRhan1J{x2p+Oh+8Z1v$k0&!tn2k>iJI{2H(7w2jSI9;CUJ#+U`E#tnS_M+H6Bx znpeVeg{%n%D|QgG3og33(Pd?rGae#+maqo)Zs4c=E5wg?Y+1yD-2kI|PW^S|@mbRP zT~QXHB`skSsac}XCinRW+2EWjrz)?NkuXys%yZZcX+Py=@%SUq&I4%u{TKyzfjAv?L++0`xlH#M(4mUxWWZLP^-L%@(Qu1$E6X

ce6NAt@ljSaiJX634u6cjY2qw!H0h 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 z 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 O1KR2aYPBkMVgC>9CR%m? literal 0 HcmV?d00001 diff --git a/dev/generated/howto/callbacks/index.html b/dev/generated/howto/callbacks/index.html index d4ab982..c090ed3 100644 --- a/dev/generated/howto/callbacks/index.html +++ b/dev/generated/howto/callbacks/index.html @@ -24,24 +24,24 @@ global idx += 1 end end

65536-element Vector{Float32}:
- 1.3395445f-18
- 2.2707473f-18
- 4.587327f-18
- 9.4164355f-18
- 1.8923826f-17
- 3.7065722f-17
- 6.92436f-17
- 1.2172425f-16
- 2.1890205f-16
- 4.555531f-16
+ 5.237242f-19
+ 9.61342f-19
+ 2.1285634f-18
+ 4.7978593f-18
+ 1.10133656f-17
+ 2.5765043f-17
+ 5.8808816f-17
+ 1.252725f-16
+ 2.455646f-16
+ 4.5494574f-16
  ⋮
- 5.26216f-16
- 2.5074618f-16
- 1.1923106f-16
- 5.605712f-17
- 2.562969f-17
- 1.1559917f-17
- 5.309755f-18
- 2.5478933f-18
- 1.452134f-18

In the callback we have to copy the solution, as the solver will update it in place. As is explained in the solver section, each features fields that are intended to be immutable during a solve! call and a state that is modified in each iteration. Depending on the solvers parameters and the measurement input, the state can differ in its fields and their type. Ideally, one tries to avoid accessing the state directly and uses the provided functions to access the state.

The resulting figure shows the reconstructed image after 0, 4, 8, 12, 16 and 20 iterations:

resize_to_layout!(fig)
-fig
Example block output

This page was generated using Literate.jl.

+ 3.3927081f-16 + 1.6841829f-16 + 8.212366f-17 + 3.8776325f-17 + 1.7394768f-17 + 7.472897f-18 + 3.2345316f-18 + 1.4965395f-18 + 8.473917f-19

In the callback we have to copy the solution, as the solver will update it in place. As is explained in the solver section, each features fields that are intended to be immutable during a solve! call and a state that is modified in each iteration. Depending on the solvers parameters and the measurement input, the state can differ in its fields and their type. Ideally, one tries to avoid accessing the state directly and uses the provided functions to access the state.

The resulting figure shows the reconstructed image after 0, 4, 8, 12, 16 and 20 iterations:

resize_to_layout!(fig)
+fig
Example block output

This page was generated using Literate.jl.

diff --git a/dev/generated/howto/efficient_kaczmarz/index.html b/dev/generated/howto/efficient_kaczmarz/index.html index 7727f60..c6dff14 100644 --- a/dev/generated/howto/efficient_kaczmarz/index.html +++ b/dev/generated/howto/efficient_kaczmarz/index.html @@ -5,44 +5,44 @@ b = A*x;

The dot_with_matrix_row function calculates the dot product between a row of A and the current approximate solution of x:

row = 1
 isapprox(RegularizedLeastSquares.dot_with_matrix_row(A, x, row), sum(A[row, :] .* x))
true

Since in Julia, dense arrays are stored in column-major order, such a row-based operation is quite inefficient. A workaround is to transpose the matrix then pass it to a Kaczmarz solver.

At = collect(transpose(A))
 A_eff = transpose(At)
256×256 transpose(::Matrix{Float64}) with eltype Float64:
- -0.833843   -0.446591    1.95904   …  -0.971519    0.937336    1.03061
-  0.214451    0.476693   -1.11859      -1.89836    -1.06377     0.078259
-  0.679967   -0.392655   -0.547967      0.114042    0.883773   -0.771914
-  0.36605    -0.847445    1.83063       0.316194    0.449842    0.938961
- -0.519502   -0.157082   -1.23943       0.356067    0.226452   -1.62795
-  0.955959   -1.31348    -0.639579  …  -0.343428   -0.431315   -1.87556
-  0.0401495  -0.461557    0.871555      0.388586    2.86311    -0.329764
- -0.634131   -0.538432    1.04536       0.524279    0.0496082  -0.669369
-  0.385215    1.40324    -0.765245      1.64382     1.12077     0.163061
- -1.26645    -2.37651     0.412359     -0.399202    0.966635   -0.0963301
-  ⋮                                 ⋱                           ⋮
-  1.05448    -0.306465    0.521981     -0.0769038  -0.992576   -0.172011
- -0.661873    0.0892155  -0.868629     -0.227159   -0.510807   -0.185506
-  0.909661    0.648055   -0.10962       0.474955    1.46412    -0.86389
- -0.349312    1.46133    -0.601529  …   0.273865   -1.17989     1.29904
- -0.990919    1.43603     1.18969      -0.798069    0.487757   -0.419157
- -0.902652    0.425434   -0.301977     -0.928797    0.696109   -0.363101
- -0.610555   -0.688722    0.43331       0.256582    1.64709    -0.234531
- -0.878338   -0.215431   -0.600092     -1.22417     0.871353    0.539884
-  0.541702    1.79816     0.315094  …   0.481882   -0.191007    0.284455

Note that the transpose function can return a lazy transpose object, so we first collect the transpose into a dense matrix. Then we transpose it again to get the efficient representation of the matrix.

We can compare the performance using the BenchmarkTools.jl package. First for the original matrix:

using BenchmarkTools
+  0.106854   1.22537    -1.1454      0.743486   …   0.0725274   1.0296
+ -1.30313    1.43359    -1.99682     0.272746      -0.627249    0.127349
+ -0.92729    0.123612   -0.832929    1.03672        1.1843      0.957832
+ -0.494683   0.828227   -2.41922    -0.905327       1.35307    -0.993605
+  0.505196   0.403707    1.33398     1.04099        0.512623   -0.605992
+  1.69076   -0.98978     0.120864   -0.128036   …   1.37181    -0.159977
+  0.165781   0.331871   -0.972717    0.900554       1.31971    -0.35667
+  0.857447   1.77839     0.906377   -0.180109      -0.373919   -1.95408
+  0.778901   0.117719   -0.239447   -0.286422       0.869302    0.817011
+ -1.13734    1.36812     0.0654497  -0.150715      -1.32041    -1.61403
+  ⋮                                             ⋱               ⋮
+ -0.396401  -0.19614     1.24157     0.502215       0.605562   -0.00308794
+  0.899615  -0.894255    0.32636    -2.20697        0.779424   -0.107496
+  0.5602     1.53417    -1.80441     0.621638      -0.719909    0.667826
+  0.108375   1.6762     -0.457332    0.321214   …   1.14838    -0.965305
+  0.306526   0.144806   -1.63878     0.0100219     -1.29696     0.32191
+ -0.952711  -0.103235    0.591622    1.23063        1.1349     -0.767582
+  0.990031   0.28623     1.04798     0.98858       -1.18254     1.03782
+  1.19308    0.701727   -0.514215    1.2662         1.12809    -0.0426664
+ -0.214882  -0.0740462  -1.6687     -0.684804   …  -0.517435   -0.600563

Note that the transpose function can return a lazy transpose object, so we first collect the transpose into a dense matrix. Then we transpose it again to get the efficient representation of the matrix.

We can compare the performance using the BenchmarkTools.jl package. First for the original matrix:

using BenchmarkTools
 solver = createLinearSolver(Kaczmarz, A; reg = L2Regularization(0.0001), iterations=100)
 @benchmark solve!(solver, b) samples = 100
BenchmarkTools.Trial: 100 samples with 1 evaluation.
- Range (minmax):  26.858 ms27.106 ms   GC (min … max): 0.00% … 0.00%
- Time  (median):     26.941 ms               GC (median):    0.00%
- Time  (mean ± σ):   26.945 ms ± 33.614 μs   GC (mean ± σ):  0.00% ± 0.00%
+ Range (minmax):  27.491 ms27.894 ms   GC (min … max): 0.00% … 0.00%
+ Time  (median):     27.773 ms               GC (median):    0.00%
+ Time  (mean ± σ):   27.769 ms ± 48.630 μs   GC (mean ± σ):  0.00% ± 0.00%
 
-                      ▃  █▃▃                                 
-  ▃▁▁▁▁▁▁▃▅▃▁▁▁▃▃▃▆▃▅██▆████▇█▆▃▁▁▁▃▃▁▁▃▃▅▁▁▁▁▁▁▁▁▁▁▁▃▁▁▃▁▃ ▃
-  26.9 ms         Histogram: frequency by time        27.1 ms <
+                                              ▁█▄ ▁          
+  ▃▁▁▁▁▁▁▃▁▁▁▁▁▁▁▁▁▃▁▁▁▁▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▄▇▃███▅█▄▄▃▁▁▁▄▃ ▃
+  27.5 ms         Histogram: frequency by time        27.8 ms <
 
  Memory estimate: 17.31 KiB, allocs estimate: 504.

And then for the efficient matrix:

solver_eff = createLinearSolver(Kaczmarz, A_eff; reg = L2Regularization(0.0001), iterations=100)
 @benchmark solve!(solver_eff, b) samples = 100
BenchmarkTools.Trial: 100 samples with 1 evaluation.
- Range (minmax):  1.848 ms 1.928 ms   GC (min … max): 0.00% … 0.00%
- Time  (median):     1.862 ms               GC (median):    0.00%
- Time  (mean ± σ):   1.867 ms ± 17.352 μs   GC (mean ± σ):  0.00% ± 0.00%
+ Range (minmax):  1.948 ms 2.059 ms   GC (min … max): 0.00% … 0.00%
+ Time  (median):     1.972 ms               GC (median):    0.00%
+ Time  (mean ± σ):   1.978 ms ± 20.459 μs   GC (mean ± σ):  0.00% ± 0.00%
 
-  ▁█  █▃ ▁▁▃   ▁▃                                        
-  ██▆▆██▆███▇▆▄▇█▄██▁▇▇▇▁▁▁▄▄▁▁▄▄▄▁▄▁▁▄▆▁▄▁▄▁▄▁▁▁▄▁▁▁▆▁▁▁▄ ▄
-  1.85 ms        Histogram: frequency by time        1.92 ms <
+      ▄▂  ▂ ▄▄▄▆█  ▂▂    ▂                                  
+  ▄▁▁▆█████▆█████████▄█▁▁█▁▁▄▆▁▆█▄▁▁▄▄▄▆▄▁▁▁▁▁▁▁▁▄▁▁▁▁▄▁▁▄ ▄
+  1.95 ms        Histogram: frequency by time        2.04 ms <
 
- Memory estimate: 17.34 KiB, allocs estimate: 506.

We can also combine the efficient matrix with a weighting matrix, as is shown in the Weighting example.

Custom operators need to implement the dot_with_matrix_row function to be used with the Kaczmarz solver. Ideally, such an implementation is allocation free.


This page was generated using Literate.jl.

+ Memory estimate: 17.34 KiB, allocs estimate: 506.

We can also combine the efficient matrix with a weighting matrix, as is shown in the Weighting example.

Custom operators need to implement the dot_with_matrix_row function to be used with the Kaczmarz solver. Ideally, such an implementation is allocation free.


This page was generated using Literate.jl.

diff --git a/dev/generated/howto/gpu_acceleration/1ddde821.png b/dev/generated/howto/gpu_acceleration/1ddde821.png new file mode 100644 index 0000000000000000000000000000000000000000..db5432efb2ce29805d4a483f84de9129eeafd84d GIT binary patch literal 15577 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 M;

Solvers adapt their states based on the type of the given measurement vector. This means that the solver will automatically switch to GPU acceleration if a GPU array is passed as the measurement vector.

solver = createLinearSolver(CGNR, A; reg = L2Regularization(0.0001), iterations=32);
 x_approx = solve!(solver, b)
16-element JLArrays.JLArray{Float32, 1}:
- 0.58974725
- 0.73969376
- 0.015459145
- 0.53007716
- 0.09761662
- 0.75303143
- 0.88292795
- 0.037307557
- 0.46172315
- 0.1712186
- 0.71143055
- 0.006434502
- 0.6263704
- 0.4439913
- 0.7746079
- 0.56623405

This adaption does not include the operator. So if we want to compare with CPU result, we need to construct a new solver with a CPU operator.

solver = createLinearSolver(CGNR, Array(A); reg = L2Regularization(0.0001), iterations=32);
+ 0.86811036
+ 0.31526038
+ 0.38444898
+ 0.63458365
+ 0.39675847
+ 0.8902049
+ 0.45867193
+ 0.58703333
+ 0.86853653
+ 0.3990398
+ 0.54507357
+ 0.056464076
+ 0.24334322
+ 0.7815787
+ 0.35098028
+ 0.4334554

This adaption does not include the operator. So if we want to compare with CPU result, we need to construct a new solver with a CPU operator.

solver = createLinearSolver(CGNR, Array(A); reg = L2Regularization(0.0001), iterations=32);
 x_cpu = solve!(solver, Array(b))
 isapprox(Array(x_approx), x_cpu)
true

Matrix-Free Operators

A special case is the usage of matrix-free operators. Since these operators do not have a concrete matrix representation, their GPU support depends on their implementation. Since not all multiplications within a solver approximation are in-place, the operator also needs to support the * operation and construct an appropriate result vector. For matrix-free operators based on LinearOperators.jl, this can be achieved by implementing the LinearOperators.storage_type method.

In the following, we will take another look at the CS example and execute it on the GPU. Note that for the JLArray example we chose a small phantom, since the JLArray implementation is not optimized for performance:

using ImagePhantoms, ImageGeoms
 N = 32
@@ -35,26 +35,26 @@
 reg = TVRegularization(0.01; shape=size(image))
 solver = createLinearSolver(FISTA, A; reg=reg, iterations=20)
 img_approx = solve!(solver,b);

To visualize the reconstructed image, we need to reshape the result vector to the correct shape and convert it to a CPU array:

img_approx = reshape(Array(img_approx),size(image))
32×32 Matrix{Float32}:
- 0.00125885  0.00127508  0.00139172  0.00163228  …  0.000828707  0.000790568
- 0.00150161  0.00154427  0.0016958   0.00196523     0.000901944  0.000835158
- 0.00198645  0.00206327  0.00226334  0.00260021     0.00103522   0.000932892
- 0.00277589  0.00286305  0.0031088   0.00359616     0.00124094   0.00110355
- 0.00398631  0.00407219  0.00440135  0.0051339      0.00159244   0.0013899
- 0.00566059  0.00582393  0.0063275   0.00722526  …  0.00225012   0.00189464
- 0.00755877  0.00815058  0.00866721  0.0093824      0.00340907   0.00280875
- 0.0108847   0.0108183   0.0106889   0.0111873      0.00506914   0.0043712
- 0.0138547   0.0131071   0.0116323   0.0120399      0.00694845   0.00654249
- 0.0168558   0.0148462   0.025235    0.0280806      0.00901083   0.00912052
- ⋮                                               ⋱  ⋮            
- 0.01093     0.0114882   0.0110311   0.0182192      0.00756706   0.0067902
- 0.00811898  0.00883295  0.00926203  0.00809161     0.00626245   0.00552272
- 0.00610862  0.006618    0.00738621  0.00770877  …  0.00511992   0.00456125
- 0.00480505  0.00506648  0.00565302  0.00641597     0.00403086   0.00371571
- 0.00399281  0.00413277  0.00447888  0.00504819     0.003093     0.00293022
- 0.0034413   0.00355579  0.00379588  0.0041462      0.0023614    0.00225731
- 0.00303429  0.00315307  0.00336581  0.00362357     0.00183862   0.00175991
- 0.00282224  0.00292535  0.00310514  0.00331119  …  0.00149367   0.0014381
- 0.00277154  0.0028497   0.00299082  0.00315615     0.0013162    0.00128073

We will again use CairoMakie for visualization:

using CairoMakie
+ 0.00136897   0.00143006   0.00154283   …  0.00191642  0.00175028  0.00165832
+ 0.00149895   0.0015616    0.00168655      0.00203566  0.00187065  0.00178527
+ 0.00176517   0.00182986   0.00198765      0.00229982  0.00210939  0.0020226
+ 0.0021586    0.00225948   0.00253508      0.00276872  0.00245691  0.00232587
+ 0.0026968    0.00294531   0.00351474      0.00351207  0.0029294   0.00267913
+ 0.00354422   0.00407039   0.0050149    …  0.00452646  0.00353149  0.0030808
+ 0.00491821   0.00573669   0.00683429      0.00577556  0.00433339  0.00361654
+ 0.00687983   0.00772079   0.0082276       0.00705288  0.00545316  0.00446968
+ 0.00916921   0.00936051   0.00866585      0.00797367  0.00679638  0.00570471
+ 0.0116095    0.0107678    0.0196336       0.00900653  0.00833821  0.00723873
+ ⋮                                      ⋱              ⋮           
+ 0.00646529   0.00699007   0.00730505      0.0194673   0.0114637   0.0121418
+ 0.00461473   0.00523157   0.00594627      0.0152584   0.0111042   0.0109938
+ 0.00329704   0.00378783   0.00460883   …  0.00901682  0.00952589  0.00896839
+ 0.00241713   0.0026834    0.00332338      0.00794567  0.00746586  0.00704636
+ 0.00180589   0.00189717   0.0022511       0.0060911   0.0057146   0.00551596
+ 0.00135348   0.00137343   0.0015322       0.00451978  0.00435863  0.00430837
+ 0.00100802   0.00101231   0.00109093      0.00344731  0.0034024   0.00338973
+ 0.000759207  0.00075723   0.000806526  …  0.00278299  0.00277267  0.00276846
+ 0.000627917  0.000620898  0.000654747     0.00244794  0.00244748  0.00245144

We will again use CairoMakie for visualization:

using CairoMakie
 function plot_image(figPos, img; title = "", width = 150, height = 150)
   ax = CairoMakie.Axis(figPos; yreversed=true, title, width, height)
   hidedecorations!(ax)
@@ -67,4 +67,4 @@
 plot_image(fig[1,2], image .* samplingMask, title = "Sampled Image")
 plot_image(fig[1,3], img_approx, title = "Reconstructed Image")
 resize_to_layout!(fig)
-fig
Example block output

This page was generated using Literate.jl.

+figExample block output

This page was generated using Literate.jl.

diff --git a/dev/generated/howto/multi_threading/index.html b/dev/generated/howto/multi_threading/index.html index bef6938..5098cac 100644 --- a/dev/generated/howto/multi_threading/index.html +++ b/dev/generated/howto/multi_threading/index.html @@ -10,7 +10,7 @@ xs_approx[i] = solve!(solver, bs[i]) end

Operator Based Multi-Threading

This type of multi-threading involves linear operators or proximal maps that can be implemnted in parallel. Examples of this include the proximal map of the TV regularization term, which is based on the multi-threaded GradientOp from LinearOperatorCollection. GPU acceleration also falls under this approach, see GPU Acceleration for more information.

Measurement Based Multi-Threading

This level of multi-threading applies the same solver (and its parameters) to multiple measurement vectors or rather a measurement matrix B. This is useful in the case of multiple measurements that can be solved in parallel and can reuse the same solver. This approach is not applicable if the operator is stateful.

To use this approach we first build a measurement matrix B and a corresponding solver:

A = first(As)
 B = mapreduce(x -> A*x, hcat, xs)
-solver = createLinearSolver(CGNR, A; iterations=32)
CGNR{Matrix{Float64}, Matrix{Float64}, L2Regularization{Float64}, Vector{Any}}([0.08738742375743858 0.29006270618604657 … 0.6312511004341781 0.8211043457009807; 0.6217012764704901 0.40013117346465765 … 0.99176726177215 0.3826917144063201; … ; 0.7589166471725711 0.9306966230737793 … 0.7497746380751567 0.7859261188072436; 0.13542548720409842 0.18381596295428493 … 0.2160294652478758 0.7626956785980866], [11.748371743140197 7.559301796801621 … 8.177859716477798 9.00873140393033; 7.559301796801621 9.305641182363653 … 7.740738374799199 8.795480384579363; … ; 8.177859716477798 7.740738374799199 … 10.893975558860143 8.523361496462421; 9.00873140393033 8.795480384579363 … 8.523361496462421 11.763175614374632], L2Regularization{Float64}(0.0), Any[], NoNormalization(), 32, RegularizedLeastSquares.CGNRState{Float64, Float64, Vector{Float64}}([3.5e-323, 5.0e-323, 9.4e-323, 1.1e-322, 1.2e-322, 1.24e-322, 1.43e-322, 1.5e-322, 1.53e-322, 1.73e-322, 1.8e-322, 1.9e-322, 1.93e-322, 2.0e-322, 2.1e-322, 2.17e-322], [3.5e-323, 5.0e-323, 9.4e-323, 1.1e-322, 1.2e-322, 1.24e-322, 1.43e-322, 1.5e-322, 1.53e-322, 1.73e-322, 1.8e-322, 1.9e-322, 1.93e-322, 2.0e-322, 2.1e-322, 2.17e-322], [4.4e-323, 6.0e-323, 1.04e-322, 1.2e-322, 1.3e-322, 1.33e-322, 1.53e-322, 1.6e-322, 1.63e-322, 1.83e-322, 1.9e-322, 2.0e-322, 2.03e-322, 2.08e-322, 2.2e-322, 2.27e-322], [4.0e-323, 5.4e-323, 1.0e-322, 1.14e-322, 1.24e-322, 1.3e-322, 1.5e-322, 1.53e-322, 1.6e-322, 1.8e-322, 1.83e-322, 1.93e-322, 2.0e-322, 2.03e-322, 2.17e-322, 2.2e-322], 0.0, 0.0, 0.0, 0, 2.220446049250313e-16, 0.0))

We can then simply pass the measurement matrix to the solver. The result will be the same as if we passed each colument of B seperately:

x_approx = solve!(solver, B)
+solver = createLinearSolver(CGNR, A; iterations=32)
CGNR{Matrix{Float64}, Matrix{Float64}, L2Regularization{Float64}, Vector{Any}}([0.44959354230923876 0.84765398196977 … 0.89137017679973 0.6372685860537851; 0.8649742354590712 0.5651844217550916 … 0.24773027638480383 0.24251820732092388; … ; 0.3328782545336384 0.1921629072660812 … 0.45358864694311374 0.6249989901071312; 0.6501163560342104 0.9298284493020831 … 0.4403283530625819 0.36264937882556125], [11.81944517618286 9.726915585582539 … 10.166357415090685 7.290863464248715; 9.726915585582539 13.187142485816453 … 11.197064029795863 9.048100500396314; … ; 10.166357415090685 11.197064029795863 … 12.797329072122073 8.849995011592084; 7.290863464248715 9.048100500396314 … 8.849995011592084 9.991938477022039], L2Regularization{Float64}(0.0), Any[], NoNormalization(), 32, RegularizedLeastSquares.CGNRState{Float64, Float64, Vector{Float64}}([5.0e-324, 1.0e-323, 6.91822113915875e-310, 6.9182211391619e-310, 1.5e-323, 1.5e-323, 6.91822113916507e-310, 6.91822113916823e-310, 2.0e-323, 4.0e-323, 6.9182211391714e-310, 6.91822113917456e-310, 4.4e-323, 6.0e-323, 6.9182211391777e-310, 6.9182211391809e-310], [5.0e-324, 1.0e-323, 6.91822113915875e-310, 6.9182211391619e-310, 1.5e-323, 1.5e-323, 6.91822113916507e-310, 6.91822113916823e-310, 2.0e-323, 4.0e-323, 6.9182211391714e-310, 6.91822113917456e-310, 4.4e-323, 6.0e-323, 6.9182211391777e-310, 6.9182211391809e-310], [6.9182613331326e-310, 0.0, 6.91826133310416e-310, 0.0, 6.9182613331334e-310, 0.0, 6.9182613331342e-310, 0.0, 6.918261333135e-310, 0.0, 6.9182613331358e-310, 0.0, 6.9182028794727e-310, 0.0, 6.9182897689093e-310, 0.0], [6.9182613331326e-310, 0.0, 6.91826133310416e-310, 0.0, 6.9182613331334e-310, 0.0, 6.9182613331342e-310, 0.0, 6.918261333135e-310, 0.0, 6.9182613331358e-310, 0.0, 6.9182028794727e-310, 0.0, 6.9182897689093e-310, 0.0], 0.0, 0.0, 0.0, 0, 2.220446049250313e-16, 0.0))

We can then simply pass the measurement matrix to the solver. The result will be the same as if we passed each colument of B seperately:

x_approx = solve!(solver, B)
 size(x_approx)
(16, 4)

The previous solve! call was still executed sequentially. To execute it in parallel, we have to specify a multi-threaded scheduler as a keyword-argument of the solve! call. RegularizedLeastSquares.jl provides a MultiThreadingState scheduler that can be used for this purpose. This scheduler is based on the Threads.@threads macro:

x_multi = solve!(solver, B; scheduler = MultiThreadingState)
 x_approx == x_multi
true

Custom Scheduling

It is possible to implement custom scheduling. The following code shows how to implement this for the Threads.@spawn macro. Usually one this to implement multi-threading with a package such as FLoop.jl or ThreadPools.jl for thread pinning:

Since most solver have conv. criteria, they can finish at different iteration numbers, which we track this information with flags.

 mutable struct SpawnState{S, ST <: AbstractSolverState{S}} <: RegularizedLeastSquares.AbstractMatrixSolverState{S}
    states::Vector{ST}
@@ -25,4 +25,4 @@
   end
   return state.active, state
 end

Now we can simply use the SpawnState scheduler in the solve! call:

x_custom = solve!(solver, B; scheduler = SpawnState)
-x_approx == x_multi
true

This page was generated using Literate.jl.

+x_approx == x_multi
true

This page was generated using Literate.jl.

diff --git a/dev/generated/howto/normal_operator/index.html b/dev/generated/howto/normal_operator/index.html index 6c273a4..5fe4959 100644 --- a/dev/generated/howto/normal_operator/index.html +++ b/dev/generated/howto/normal_operator/index.html @@ -14,22 +14,22 @@ solver = createLinearSolver(CGNR, A; AHA = adjoint(A) * A, reg = L2Regularization(0.0001), iterations=32); x_approx = solve!(solver, b)
16-element Vector{Float64}:
- -0.07159443778413728
-  1.2442958319437942
- -1.021295347659181
- -0.7227593802229989
-  0.5701736591131468
-  1.7000651979788393
- -0.03594255662420675
- -1.9139239330892601
-  1.5111555272722839
- -0.7805126463284169
- -1.3338122349211472
- -1.4452886499487336
- -1.2244921758635996
-  0.033749921357981987
- -0.7393022032861277
- -1.923626895497195

The normal operator can also be computed using the normalOperator function from LinearOperatorCollection.jl. This is useful if the normal operator is not directly available or shouldn't be stored in memory. This function is opinionated and attempts to optimize the resulting operator for iterative applications. Specifying a custom method for a custom operator allows one to control this optimization.

An example of such an optimization is a matrix-free weighting of $\mathbf{A}$ as shown in the Weighting example:

using LinearOperatorCollection
+ -0.9176309213358578
+  1.0626830759462977
+ -0.10053901832168194
+ -0.04941419159096891
+  1.4377985925922872
+  1.297378137820316
+ -0.997434239187583
+  1.1555890761020167
+ -0.6119899293518619
+ -0.7502265215264677
+ -0.5016460072844288
+  1.4477393539255954
+  1.6851638400860514
+  0.08037005179259255
+ -1.4324100484890594
+ -0.8745595690611795

The normal operator can also be computed using the normalOperator function from LinearOperatorCollection.jl. This is useful if the normal operator is not directly available or shouldn't be stored in memory. This function is opinionated and attempts to optimize the resulting operator for iterative applications. Specifying a custom method for a custom operator allows one to control this optimization.

An example of such an optimization is a matrix-free weighting of $\mathbf{A}$ as shown in the Weighting example:

using LinearOperatorCollection
 weights = rand(32)
 WA = ProdOp(WeightingOp(weights), A)
 AHA = LinearOperatorCollection.normalOperator(WA)
Linear operator
@@ -50,19 +50,19 @@
   \mathbf{A}^*\tilde{\mathbf{W}}\mathbf{A}
 \end{equation}\]

The optimized normal operator can then be passed to the solver:

solver = createLinearSolver(CGNR, WA; AHA = AHA, reg = L2Regularization(0.0001), iterations=32);
 x_approx2 = solve!(solver, weights .* b)
16-element Vector{Float64}:
- -0.07161546938893568
-  1.2442339469656587
- -1.0212682074858201
- -0.7227332642817055
-  0.570167271074179
-  1.6999836863291176
- -0.03593483995119651
- -1.9138802486083213
-  1.511036605169281
- -0.7805003436513653
- -1.3337332477625856
- -1.4451925571974404
- -1.224385439355738
-  0.03374572243324476
- -0.7393711858345144
- -1.9236099025579403

Of course it is also possible to optimize a normal operator with other means and pass it to the solver via the AHA keyword argument.

It is also possible to only supply the normal operator to these solvers, however on then needs to supply $\mathbf{A^*b}$ intead of $\mathbf{b}$.


This page was generated using Literate.jl.

+ -0.9176151521294158 + 1.0626748223593396 + -0.10052991760277367 + -0.049435157473404885 + 1.4377958084099705 + 1.2973694461492384 + -0.9974116914521253 + 1.1556055959559988 + -0.611978650834457 + -0.7502077890885653 + -0.5016342003162071 + 1.4477103533264153 + 1.685155667549789 + 0.08037759052377273 + -1.4323943789166873 + -0.8745481299247408

Of course it is also possible to optimize a normal operator with other means and pass it to the solver via the AHA keyword argument.

It is also possible to only supply the normal operator to these solvers, however on then needs to supply $\mathbf{A^*b}$ intead of $\mathbf{b}$.


This page was generated using Literate.jl.

diff --git a/dev/generated/howto/plug-and-play/index.html b/dev/generated/howto/plug-and-play/index.html index f5f3203..9f3dc42 100644 --- a/dev/generated/howto/plug-and-play/index.html +++ b/dev/generated/howto/plug-and-play/index.html @@ -5,19 +5,19 @@ b = A*x;

For the documentation we will just use the identity function as a placeholder for the PnP prior.

model = identity
identity (generic function with 1 method)

In practice, you would replace this with a neural network:

using Flux
 model = Flux.loadmodel!(model, ...)

The model can then be used together with the PnPRegularization term:

reg = PnPRegularization(1.0; model = model, shape = [16]);

Since models often expect a specific input range, we can use the MinMaxTransform to normalize the input:

reg = PnPRegularization(1.0; model = model, shape = [16], input_transform = RegularizedLeastSquares.MinMaxTransform);

Custom input transforms can be implemented by passing something callable as the input_transform keyword argument. For more details see the PnPRegularization documentation.

The regularization term can then be used in the solver:

solver = createLinearSolver(Kaczmarz, A; reg = reg, iterations = 32)
 x_approx = solve!(solver, b)
16-element Vector{Float64}:
- -2.289200924556522
-  0.427379244236632
-  0.35912929503841573
-  1.703029899916221
- -0.346960790532143
- -0.6112130086275078
-  1.626356474544742
-  1.1348473573924438
-  0.24385448506375296
- -0.31118681893618927
-  0.1353377255536592
- -0.9630979523703582
- -2.7927411611976445
-  1.3158484851818764
-  0.5848345311084269
-  1.5215449853790237

This page was generated using Literate.jl.

+ -0.25834448991964837 + 0.5605578958118881 + -0.19357904148233546 + -0.2829515075866492 + 0.6088478794864908 + 2.319867034482761 + -0.02788653011875375 + 0.8993969650987014 + 0.9601997933023462 + -0.6358188763582734 + -0.06027829541538665 + -0.3368544024967866 + 0.1825448056569292 + 1.738882434952734 + -0.3188915036759848 + 1.178830156048774

This page was generated using Literate.jl.

diff --git a/dev/generated/howto/weighting/index.html b/dev/generated/howto/weighting/index.html index 74eddd7..83e5496 100644 --- a/dev/generated/howto/weighting/index.html +++ b/dev/generated/howto/weighting/index.html @@ -12,4 +12,4 @@ P = ProdOp(W, A) solver = createLinearSolver(Kaczmarz, P; reg = L2Regularization(0.0001), iterations=10) x_approx2 = solve!(solver, W * b) -isapprox(x_approx, x_approx2)
true

This page was generated using Literate.jl.

+isapprox(x_approx, x_approx2)
true

This page was generated using Literate.jl.

diff --git a/dev/index.html b/dev/index.html index f024080..482824a 100644 --- a/dev/index.html +++ b/dev/index.html @@ -1,2 +1,2 @@ -Home · RegularizedLeastSquares.jl

RegularizedLeastSquares.jl

Solvers for Linear Inverse Problems using Regularization Techniques

Introduction

RegularizedLeastSquares.jl is a Julia package for solving large linear systems using various types of algorithms. Ill-conditioned problems arise in many areas of practical interest. Regularisation techniques and nonlinear problem formulations are often used to solve these problems. This package provides implementations for a variety of solvers used in areas such as MPI and MRI. In particular, this package serves as the optimization backend of the Julia packages MPIReco.jl and MRIReco.jl.

The implemented methods range from the $l^2_2$-regularized CGNR method to more general optimizers such as the Alternating Direction of Multipliers Method (ADMM) or the Split-Bregman method.

For convenience, implementations of popular regularizers, such as $l_1$-regularization and TV regularization, are provided. On the other hand, hand-crafted regularizers can be used quite easily.

Depending on the problem, it becomes unfeasible to store the full system matrix at hand. For this purpose, RegularizedLeastSquares.jl allows for the use of matrix-free operators. Such operators can be realized using the interface provided by the package LinearOperators.jl. Other interfaces can be used as well, as long as the product *(A,x) and the adjoint adjoint(A) are provided. A number of common matrix-free operators are provided by the package LinearOperatorColection.jl.

Features

  • Variety of optimization algorithms optimized for least squares problems
  • Support for matrix-free operators
  • GPU support

Usage

See also

Packages:

Organizations:

+Home · RegularizedLeastSquares.jl

RegularizedLeastSquares.jl

Solvers for Linear Inverse Problems using Regularization Techniques

Introduction

RegularizedLeastSquares.jl is a Julia package for solving large linear systems using various types of algorithms. Ill-conditioned problems arise in many areas of practical interest. Regularisation techniques and nonlinear problem formulations are often used to solve these problems. This package provides implementations for a variety of solvers used in areas such as MPI and MRI. In particular, this package serves as the optimization backend of the Julia packages MPIReco.jl and MRIReco.jl.

The implemented methods range from the $l^2_2$-regularized CGNR method to more general optimizers such as the Alternating Direction of Multipliers Method (ADMM) or the Split-Bregman method.

For convenience, implementations of popular regularizers, such as $l_1$-regularization and TV regularization, are provided. On the other hand, hand-crafted regularizers can be used quite easily.

Depending on the problem, it becomes unfeasible to store the full system matrix at hand. For this purpose, RegularizedLeastSquares.jl allows for the use of matrix-free operators. Such operators can be realized using the interface provided by the package LinearOperators.jl. Other interfaces can be used as well, as long as the product *(A,x) and the adjoint adjoint(A) are provided. A number of common matrix-free operators are provided by the package LinearOperatorColection.jl.

Features

  • Variety of optimization algorithms optimized for least squares problems
  • Support for matrix-free operators
  • GPU support

Usage

See also

Packages:

Organizations:

diff --git a/dev/search_index.js b/dev/search_index.js index 503557f..1563ea3 100644 --- a/dev/search_index.js +++ b/dev/search_index.js @@ -1,3 +1,3 @@ var documenterSearchIndex = {"docs": -[{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"EditURL = \"../../literate/examples/computed_tomography.jl\"","category":"page"},{"location":"generated/examples/computed_tomography/#Computed-Tomography-Example","page":"Computed Tomography","title":"Computed Tomography Example","text":"","category":"section"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"In this example we will go through a simple example from the field of Computed Tomography. In addtion to RegularizedLeastSquares.jl, we will need the packages LinearOperatorCollection.jl, ImagePhantoms.jl, ImageGeoms.jl and RadonKA.jl, as well as CairoMakie.jl for visualization. We can install them the same way we did RegularizedLeastSquares.jl.","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"RadonKA is a package for the computation of the Radon transform and its adjoint. It is implemented with KernelAbstractions.jl and supports GPU acceleration. See the GPU acceleration how-to for more information.","category":"page"},{"location":"generated/examples/computed_tomography/#Preparing-the-Inverse-Problem","page":"Computed Tomography","title":"Preparing the Inverse Problem","text":"","category":"section"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"To get started, let us generate a simple phantom using the ImagePhantoms and ImageGeom packages:","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"using ImagePhantoms, ImageGeoms\nN = 256\nimage = shepp_logan(N, SheppLoganToft())\nsize(image)","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"This produces a 256x256 image of a Shepp-Logan phantom.","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"using RadonKA, LinearOperatorCollection\nangles = collect(range(0, π, 256))\nsinogram = Array(RadonKA.radon(image, angles))","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"Afterwards we build a Radon operator implementing both the forward and adjoint Radon transform","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"A = RadonOp(eltype(image); angles, shape = size(image));\nnothing #hide","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"To visualize our image we can use CairoMakie:","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"using CairoMakie\nfunction plot_image(figPos, img; title = \"\", width = 150, height = 150)\n ax = CairoMakie.Axis(figPos[1, 1]; yreversed=true, title, width, height)\n hidedecorations!(ax)\n hm = heatmap!(ax, img)\n Colorbar(figPos[2, 1], hm, vertical = false, flipaxis = false)\nend\nfig = Figure()\nplot_image(fig[1,1], image, title = \"Image\")\nplot_image(fig[1,2], sinogram, title = \"Sinogram\")\nplot_image(fig[1,3], backproject(sinogram, angles), title = \"Backprojection\")\nresize_to_layout!(fig)\nfig","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"In the figure we can see our original image, the sinogram, and the backprojection of the sinogram. The goal of the inverse problem is to recover the original image from the sinogram.","category":"page"},{"location":"generated/examples/computed_tomography/#Solving-the-Inverse-Problem","page":"Computed Tomography","title":"Solving the Inverse Problem","text":"","category":"section"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"To recover the image from the measurement vector, we solve the l^2_2-regularized least squares problem","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"beginequation\n undersetmathbfxargmin frac12vertvert mathbfAmathbfx-mathbfb vertvert_2^2 + lambdavertvertmathbfxvertvert^2_2 \nendequation","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"For this purpose we build a l^2_2 with regularization parameter λ=0001","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"using RegularizedLeastSquares\nreg = L2Regularization(0.001);\nnothing #hide","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"To solve this inverse problem, the Conjugate Gradient Normal Residual (CGNR) algorithm can be used. This solver is based on the normal operator of the Radon operator and uses both the forward and adjoint Radon transform internally. We now build the corresponding solver","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"solver = createLinearSolver(CGNR, A; reg=reg, iterations=20);\nnothing #hide","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"and apply it to our measurement vector","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"img_approx = solve!(solver, vec(sinogram))","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"To visualize the reconstructed image, we need to reshape the result vector to the correct shape. Afterwards we can use CairoMakie again:","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"img_approx = reshape(img_approx,size(image));\nplot_image(fig[1,4], img_approx, title = \"Reconstructed Image\")\nresize_to_layout!(fig)\nfig","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"This page was generated using Literate.jl.","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"EditURL = \"../../literate/howto/efficient_kaczmarz.jl\"","category":"page"},{"location":"generated/howto/efficient_kaczmarz/#Efficient-Kaczmarz","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"","category":"section"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"Unlike many of the other solvers provided by RegularizedLeastSquares.jl, the Kaczmarz method does not utilize a matrix-vector product with the operator mathbfA nor the normal operator mathbfA*A. Instead, it uses the rows of mathbfA to update the solution iteratively. Efficient Kaczmarz implementation therefore require very efficient dot products with the rows of mathbfA. In RegularizedLeastSquares.jl, this is achieved with the dot_with_matrix_row function.","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"using RegularizedLeastSquares\nA = randn(256, 256)\nx = randn(256)\nb = A*x;\nnothing #hide","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"The dot_with_matrix_row function calculates the dot product between a row of A and the current approximate solution of x:","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"row = 1\nisapprox(RegularizedLeastSquares.dot_with_matrix_row(A, x, row), sum(A[row, :] .* x))","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"Since in Julia, dense arrays are stored in column-major order, such a row-based operation is quite inefficient. A workaround is to transpose the matrix then pass it to a Kaczmarz solver.","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"At = collect(transpose(A))\nA_eff = transpose(At)","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"Note that the transpose function can return a lazy transpose object, so we first collect the transpose into a dense matrix. Then we transpose it again to get the efficient representation of the matrix.","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"We can compare the performance using the BenchmarkTools.jl package. First for the original matrix:","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"using BenchmarkTools\nsolver = createLinearSolver(Kaczmarz, A; reg = L2Regularization(0.0001), iterations=100)\n@benchmark solve!(solver, b) samples = 100","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"And then for the efficient matrix:","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"solver_eff = createLinearSolver(Kaczmarz, A_eff; reg = L2Regularization(0.0001), iterations=100)\n@benchmark solve!(solver_eff, b) samples = 100","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"We can also combine the efficient matrix with a weighting matrix, as is shown in the Weighting example.","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"Custom operators need to implement the dot_with_matrix_row function to be used with the Kaczmarz solver. Ideally, such an implementation is allocation free.","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"This page was generated using Literate.jl.","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"EditURL = \"../../literate/howto/multi_threading.jl\"","category":"page"},{"location":"generated/howto/multi_threading/#Multi-Threading","page":"Multi-Threading","title":"Multi-Threading","text":"","category":"section"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"There are different ways multi-threading can be used with RegularizedLeastSquares.jl. To use multi-threading in Julia, one needs to start their session with multi-threads, see the Julia documentation for more information.","category":"page"},{"location":"generated/howto/multi_threading/#Solver-Based-Multi-Threading","page":"Multi-Threading","title":"Solver Based Multi-Threading","text":"","category":"section"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"This type of multi-threading is transparent to the solver and is applicable if the total solution is composed of individual solutions that can be solved in parallel. In particular, this approach also allows for using solvers with different parameters, such as their operator or regularization parameters.","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"using RegularizedLeastSquares\nAs = [rand(32, 16) for _ in 1:4]\nxs = [rand(16) for _ in 1:4]\nbs = [A*x for (A, x) in zip(As, xs)]\n\nxs_approx = similar(xs)\nThreads.@threads for i in 1:4\n solver = createLinearSolver(CGNR, As[i]; iterations=32)\n xs_approx[i] = solve!(solver, bs[i])\nend","category":"page"},{"location":"generated/howto/multi_threading/#Operator-Based-Multi-Threading","page":"Multi-Threading","title":"Operator Based Multi-Threading","text":"","category":"section"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"This type of multi-threading involves linear operators or proximal maps that can be implemnted in parallel. Examples of this include the proximal map of the TV regularization term, which is based on the multi-threaded GradientOp from LinearOperatorCollection. GPU acceleration also falls under this approach, see GPU Acceleration for more information.","category":"page"},{"location":"generated/howto/multi_threading/#Measurement-Based-Multi-Threading","page":"Multi-Threading","title":"Measurement Based Multi-Threading","text":"","category":"section"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"This level of multi-threading applies the same solver (and its parameters) to multiple measurement vectors or rather a measurement matrix B. This is useful in the case of multiple measurements that can be solved in parallel and can reuse the same solver. This approach is not applicable if the operator is stateful.","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"To use this approach we first build a measurement matrix B and a corresponding solver:","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"A = first(As)\nB = mapreduce(x -> A*x, hcat, xs)\nsolver = createLinearSolver(CGNR, A; iterations=32)","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"We can then simply pass the measurement matrix to the solver. The result will be the same as if we passed each colument of B seperately:","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"x_approx = solve!(solver, B)\nsize(x_approx)","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"The previous solve! call was still executed sequentially. To execute it in parallel, we have to specify a multi-threaded scheduler as a keyword-argument of the solve! call. RegularizedLeastSquares.jl provides a MultiThreadingState scheduler that can be used for this purpose. This scheduler is based on the Threads.@threads macro:","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"x_multi = solve!(solver, B; scheduler = MultiThreadingState)\nx_approx == x_multi","category":"page"},{"location":"generated/howto/multi_threading/#Custom-Scheduling","page":"Multi-Threading","title":"Custom Scheduling","text":"","category":"section"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"It is possible to implement custom scheduling. The following code shows how to implement this for the Threads.@spawn macro. Usually one this to implement multi-threading with a package such as FLoop.jl or ThreadPools.jl for thread pinning:","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"Since most solver have conv. criteria, they can finish at different iteration numbers, which we track this information with flags.","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":" mutable struct SpawnState{S, ST <: AbstractSolverState{S}} <: RegularizedLeastSquares.AbstractMatrixSolverState{S}\n states::Vector{ST}\n active::Vector{Bool}\n SpawnState(states::Vector{ST}) where {S, ST <: AbstractSolverState{S}} = new{S, ST}(states, fill(true, length(states)))\n end","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"To hook into the existing init! code we only have to supply a method that gets a copyable \"vector\" state. This will invoke our SpawnState constructor with copies of the given state.","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":" prepareMultiStates(solver::AbstractLinearSolver, state::SpawnState, b::AbstractMatrix) = prepareMultiStates(solver, first(state.states), b);\nnothing #hide","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"We specialise the iterate function which is called with the idx of still active states","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"function Base.iterate(solver::AbstractLinearSolver, state::SpawnState, activeIdx)\n @sync Threads.@spawn for i in activeIdx\n res = iterate(solver, state.states[i])\n if isnothing(res)\n state.active[i] = false\n end\n end\n return state.active, state\nend","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"Now we can simply use the SpawnState scheduler in the solve! call:","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"x_custom = solve!(solver, B; scheduler = SpawnState)\nx_approx == x_multi","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"This page was generated using Literate.jl.","category":"page"},{"location":"solvers/#Solvers","page":"Solvers","title":"Solvers","text":"","category":"section"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.jl provides a variety of solvers, which are used in fields such as MPI and MRI. The following is a non-exhaustive list of the implemented solvers:","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"Kaczmarz algorithm (Kaczmarz, also called Algebraic reconstruction technique)\nConjugate Gradients Normal Residual method (CGNR)\nFast Iterative Shrinkage Thresholding Algorithm (FISTA)\nAlternating Direction of Multipliers Method (ADMM)","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"The solvers are organized in a type-hierarchy and inherit from:","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"abstract type AbstractLinearSolver","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"The type hierarchy is further differentiated into solver categories such as AbstractRowAtionSolver, AbstractPrimalDualSolver or AbstractProximalGradientSolver. A list of all available solvers can be returned by the linearSolverList function.","category":"page"},{"location":"solvers/#Solver-Construction","page":"Solvers","title":"Solver Construction","text":"","category":"section"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"To create a solver, one can invoke the method createLinearSolver as in","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"solver = createLinearSolver(CGNR, A; reg=reg, kwargs...)","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"Here A denotes the operator and reg are the Regularization terms to be used by the solver. All further solver parameters can be passed as keyword arguments and are solver specific. To make things more compact, it can be usefull to collect all parameters in a Dict{Symbol,Any}. In this way, the code snippet above can be written as","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"params=Dict{Symbol,Any}()\nparams[:reg] = ...\n...\n\nsolver = createLinearSolver(CGNR, A; params...)","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"This notation can be convenient when a large number of parameters are set manually.","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"It is also possible to construct a solver directly with its specific keyword arguments:","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"solver = CGNR(A, reg = reg, ...)","category":"page"},{"location":"solvers/#Solver-Usage","page":"Solvers","title":"Solver Usage","text":"","category":"section"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"Once constructed, a solver can be used to approximate a solution to a given measurement vector:","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"x_approx = solve!(solver, b; kwargs...)","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"The keyword arguments can be used to supply an inital solution x0, one or more callbacks to interact and monitor the solvers state and more. See the How-To and the API for more information.","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"It is also possible to explicitly invoke the solvers iterations using Julias iterate interface:","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"init!(solver, b; kwargs...)\nfor (iteration, x_approx) in enumerate(solver)\n println(\"Iteration $iteration\")\nend","category":"page"},{"location":"solvers/#Solver-Internals","page":"Solvers","title":"Solver Internals","text":"","category":"section"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"The fields of a solver can be divided into two groups. The first group are intended to be immutable fields that do not change during iterations, the second group are mutable fields that do change. Examples of the first group are the operator itself and examples of the second group are the current solution or the number of the current iteration.","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"The second group is usually encapsulated in its own state struct:","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"mutable struct Solver{matT, ...}\n A::matT\n # Other \"static\" fields\n state::AbstractSolverState{<:Solver}\nend\n\nmutable struct SolverState{T, tempT} <: AbstractSolverState{Solver}\n x::tempT\n rho::T\n # ...\n iteration::Int64\nend","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"States are subtypes of the parametric AbstractSolverState{S} type. The state fields of solvers can be exchanged with different state belonging to the correct solver S. This means that the states can be used to realize custom variants of an existing solver:","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"mutable struct VariantState{T, tempT} <: AbstractSolverState{Solver}\n x::tempT\n other::tempT\n # ...\n iteration::Int64\nend\n\nSolverVariant(A; kwargs...) = Solver(A, VariantState(kwargs...))\n\nfunction iterate(solver::Solver, state::VarianteState)\n # Custom iteration\nend","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"EditURL = \"../../literate/howto/weighting.jl\"","category":"page"},{"location":"generated/howto/weighting/#Weighting","page":"Weighting","title":"Weighting","text":"","category":"section"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"Often time one wants to solve a weighted least squares problem of the form:","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"beginequation\n undersetmathbfxargmin frac12vertvert mathbfAmathbfx-mathbfb vertvert^2_mathbfW + mathbfR(x) \nendequation","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"where mathbfW is a symmetric, positive weighting matrix and vertvertmathbfyvertvert^2_mathbfW denotes the weighted Euclidean norm. An example of such a weighting matrix is a noise whitening matrix. Another example could be a scaling of the matrix rows by the reciprocal of their row energy.","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"In the following, we will solve a weighted least squares problem of the form:","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"beginequation\n undersetmathbfxargmin frac12vertvert mathbfAmathbfx-mathbfb vertvert_mathbfW^2 + lambdavertvertmathbfxvertvert^2_2 \nendequation","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"using RegularizedLeastSquares, LinearOperatorCollection, LinearAlgebra\nA = rand(32, 16)\nx = rand(16)\nb = A*x;\nnothing #hide","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"As a weighting matrix, we will use the reciprocal of the row energy of the matrix A.","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"weights = map(row -> 1/rownorm²(A, row), 1:size(A, 1));\nnothing #hide","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"First, let us solve the problem with matrices we manually weighted.","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"WA = diagm(weights) * A\nsolver = createLinearSolver(Kaczmarz, WA; reg = L2Regularization(0.0001), iterations=10)\nx_approx = solve!(solver, weights .* b);\nnothing #hide","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"The operator A is not always a dense matrix and the product between the operator and the weighting matrix is not always efficient or possible. The package LinearOperatorCollection.jl provides a matrix-free implementation of a diagonal weighting matrix, as well as a matrix free product between two matrices. This weighted operator has efficient implementations of the normal operator and also for the row-action operations of the Kaczmarz solver.","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"W = WeightingOp(weights)\nP = ProdOp(W, A)\nsolver = createLinearSolver(Kaczmarz, P; reg = L2Regularization(0.0001), iterations=10)\nx_approx2 = solve!(solver, W * b)\nisapprox(x_approx, x_approx2)","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"This page was generated using Literate.jl.","category":"page"},{"location":"API/regularization/#API-for-Regularizers","page":"Regularization Terms","title":"API for Regularizers","text":"","category":"section"},{"location":"API/regularization/","page":"Regularization Terms","title":"Regularization Terms","text":"This page contains documentation of the public API of the RegularizedLeastSquares. In the Julia REPL one can access this documentation by entering the help mode with ?","category":"page"},{"location":"API/regularization/","page":"Regularization Terms","title":"Regularization Terms","text":"RegularizedLeastSquares.L1Regularization\nRegularizedLeastSquares.L2Regularization\nRegularizedLeastSquares.L21Regularization\nRegularizedLeastSquares.LLRRegularization\nRegularizedLeastSquares.NuclearRegularization\nRegularizedLeastSquares.TVRegularization","category":"page"},{"location":"API/regularization/#RegularizedLeastSquares.L1Regularization","page":"Regularization Terms","title":"RegularizedLeastSquares.L1Regularization","text":"L1Regularization\n\nRegularization term implementing the proximal map for the Lasso problem.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.L2Regularization","page":"Regularization Terms","title":"RegularizedLeastSquares.L2Regularization","text":"L2Regularization\n\nRegularization term implementing the proximal map for Tikhonov regularization.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.L21Regularization","page":"Regularization Terms","title":"RegularizedLeastSquares.L21Regularization","text":"L21Regularization\n\nRegularization term implementing the proximal map for group-soft-thresholding.\n\nArguments\n\nλ - regularization paramter\n\nKeywords\n\nslices=1 - number of elements per group\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.LLRRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.LLRRegularization","text":"LLRRegularization\n\nRegularization term implementing the proximal map for locally low rank (LLR) regularization using singular-value-thresholding.\n\nArguments\n\nλ - regularization paramter\n\nKeywords\n\nshape::Tuple{Int} - dimensions of the image\nblockSize::Tuple{Int}=(2,2) - size of patches to perform singular value thresholding on\nrandshift::Bool=true - randomly shifts the patches to ensure translation invariance\nfullyOverlapping::Bool=false - choose between fully overlapping block or non-overlapping blocks\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.NuclearRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.NuclearRegularization","text":"NuclearRegularization\n\nRegularization term implementing the proximal map for singular value soft-thresholding.\n\nArguments:\n\nλ - regularization paramter\n\nKeywords\n\nsvtShape::NTuple - size of the underlying matrix\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.TVRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.TVRegularization","text":"TVRegularization\n\nRegularization term implementing the proximal map for TV regularization. Calculated with the Condat algorithm if the TV is calculated only along one real-valued dimension and with the Fast Gradient Projection algorithm otherwise.\n\nReference for the Condat algorithm: https://lcondat.github.io/publis/Condat-fast_TV-SPL-2013.pdf\n\nReference for the FGP algorithm: A. Beck and T. Teboulle, \"Fast Gradient-Based Algorithms for Constrained Total Variation Image Denoising and Deblurring Problems\", IEEE Trans. Image Process. 18(11), 2009\n\nArguments\n\nλ::T - regularization parameter\n\nKeywords\n\nshape::NTuple - size of the underlying image\ndims - Dimension to perform the TV along. If Integer, the Condat algorithm is called, and the FDG algorithm otherwise.\niterationsTV=20 - number of FGP iterations\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#Projection-Regularization","page":"Regularization Terms","title":"Projection Regularization","text":"","category":"section"},{"location":"API/regularization/","page":"Regularization Terms","title":"Regularization Terms","text":"RegularizedLeastSquares.PositiveRegularization\nRegularizedLeastSquares.RealRegularization","category":"page"},{"location":"API/regularization/#RegularizedLeastSquares.PositiveRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.PositiveRegularization","text":"PositiveRegularization\n\nRegularization term implementing a projection onto positive and real numbers.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.RealRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.RealRegularization","text":"RealRegularization\n\nRegularization term implementing a projection onto real numbers.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#Nested-Regularization","page":"Regularization Terms","title":"Nested Regularization","text":"","category":"section"},{"location":"API/regularization/","page":"Regularization Terms","title":"Regularization Terms","text":"RegularizedLeastSquares.innerreg(::AbstractNestedRegularization)\nRegularizedLeastSquares.sink(::AbstractNestedRegularization)\nRegularizedLeastSquares.sinktype(::AbstractNestedRegularization)","category":"page"},{"location":"API/regularization/#RegularizedLeastSquares.innerreg-Tuple{AbstractNestedRegularization}","page":"Regularization Terms","title":"RegularizedLeastSquares.innerreg","text":"innerreg(reg::AbstractNestedRegularization)\n\nreturn the inner regularization term of reg. Nested regularization terms also implement the iteration interface.\n\n\n\n\n\n","category":"method"},{"location":"API/regularization/#RegularizedLeastSquares.sink-Tuple{AbstractNestedRegularization}","page":"Regularization Terms","title":"RegularizedLeastSquares.sink","text":"sink(reg::AbstractNestedRegularization)\n\nreturn the innermost regularization term.\n\n\n\n\n\n","category":"method"},{"location":"API/regularization/#RegularizedLeastSquares.sinktype-Tuple{AbstractNestedRegularization}","page":"Regularization Terms","title":"RegularizedLeastSquares.sinktype","text":"sinktype(reg::AbstractNestedRegularization)\n\nreturn the type of the innermost regularization term.\n\nSee also sink.\n\n\n\n\n\n","category":"method"},{"location":"API/regularization/#Scaled-Regularization","page":"Regularization Terms","title":"Scaled Regularization","text":"","category":"section"},{"location":"API/regularization/","page":"Regularization Terms","title":"Regularization Terms","text":"RegularizedLeastSquares.AbstractScaledRegularization\nRegularizedLeastSquares.scalefactor\nRegularizedLeastSquares.NormalizedRegularization\nRegularizedLeastSquares.NoNormalization\nRegularizedLeastSquares.MeasurementBasedNormalization\nRegularizedLeastSquares.SystemMatrixBasedNormalization\nRegularizedLeastSquares.FixedParameterRegularization","category":"page"},{"location":"API/regularization/#RegularizedLeastSquares.AbstractScaledRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.AbstractScaledRegularization","text":"AbstractScaledRegularization\n\nNested regularization term that applies a scalefactor to the regularization parameter λ of its inner term.\n\nSee also scalefactor, λ, innerreg.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.scalefactor","page":"Regularization Terms","title":"RegularizedLeastSquares.scalefactor","text":"scalescalefactor(reg::AbstractScaledRegularization)\n\nreturn the scaling scalefactor for λ\n\n\n\n\n\n","category":"function"},{"location":"API/regularization/#RegularizedLeastSquares.NormalizedRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.NormalizedRegularization","text":"NormalizedRegularization\n\nNested regularization term that scales λ according to normalization scheme. This term is commonly applied by a solver based on a given normalization keyword\n\n#See also NoNormalization, MeasurementBasedNormalization, SystemMatrixBasedNormalization.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.NoNormalization","page":"Regularization Terms","title":"RegularizedLeastSquares.NoNormalization","text":"NoNormalization\n\nNo normalization to λ is applied.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.MeasurementBasedNormalization","page":"Regularization Terms","title":"RegularizedLeastSquares.MeasurementBasedNormalization","text":"MeasurementBasedNormalization\n\nλ is normalized by the 1-norm of b divided by its length.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.SystemMatrixBasedNormalization","page":"Regularization Terms","title":"RegularizedLeastSquares.SystemMatrixBasedNormalization","text":"SystemMatrixBasedNormalization\n\nλ is normalized by the energy of the system matrix rows.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.FixedParameterRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.FixedParameterRegularization","text":"FixedParameterRegularization\n\nNested regularization term that discards any λ passed to it and instead uses λ from its inner regularization term. This can be used to selectively disallow normalization.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#Misc.-Nested-Regularization","page":"Regularization Terms","title":"Misc. Nested Regularization","text":"","category":"section"},{"location":"API/regularization/","page":"Regularization Terms","title":"Regularization Terms","text":"RegularizedLeastSquares.MaskedRegularization\nRegularizedLeastSquares.TransformedRegularization\nRegularizedLeastSquares.PlugAndPlayRegularization","category":"page"},{"location":"API/regularization/#RegularizedLeastSquares.MaskedRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.MaskedRegularization","text":"MaskedRegularization\n\nNested regularization term that only applies prox! and norm to elements of x for which the mask is true.\n\nExamples\n\njulia> positive = PositiveRegularization();\n\njulia> masked = MaskedRegularization(reg, [true, false, true, false]);\n\njulia> prox!(masked, fill(-1, 4))\n4-element Vector{Float64}:\n 0.0\n -1.0\n 0.0\n -1.0\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.TransformedRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.TransformedRegularization","text":"TransformedRegularization(reg, trafo)\n\nNested regularization term that applies prox! or norm on z = trafo * x and returns (inplace) x = adjoint(trafo) * z.\n\nExample\n\njulia> core = L1Regularization(0.8)\nL1Regularization{Float64}(0.8)\n\njulia> wop = WaveletOp(Float32, shape = (32,32));\n\njulia> reg = TransformedRegularization(core, wop);\n\njulia> prox!(reg, randn(32*32)); # Apply soft-thresholding in Wavelet domain\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.PlugAndPlayRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.PlugAndPlayRegularization","text":" PlugAndPlayRegularization\n\nRegularization term implementing a given plug-and-play proximal mapping. The actual regularization term is indirectly defined by the learned proximal mapping and as such there is no norm implemented.\n\nArguments\n\nλ - regularization paramter\n\nKeywords\n\nmodel - model applied to the image\nshape - dimensions of the image\ninput_transform - transform of image before model\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#Miscellaneous-Functions","page":"Regularization Terms","title":"Miscellaneous Functions","text":"","category":"section"},{"location":"API/regularization/","page":"Regularization Terms","title":"Regularization Terms","text":"RegularizedLeastSquares.prox!(::AbstractParameterizedRegularization, ::AbstractArray)\nRegularizedLeastSquares.prox!(::Type{<:AbstractParameterizedRegularization}, ::Any, ::Any)\nRegularizedLeastSquares.norm(::AbstractParameterizedRegularization, ::AbstractArray)\nRegularizedLeastSquares.λ(::AbstractParameterizedRegularization)\nRegularizedLeastSquares.norm(::Type{<:AbstractParameterizedRegularization}, ::Any, ::Any)","category":"page"},{"location":"API/regularization/#RegularizedLeastSquares.prox!-Tuple{AbstractParameterizedRegularization, AbstractArray}","page":"Regularization Terms","title":"RegularizedLeastSquares.prox!","text":"prox!(reg::AbstractParameterizedRegularization, x)\n\nperform the proximal mapping defined by reg on x. Uses the regularization parameter defined for reg.\n\n\n\n\n\n","category":"method"},{"location":"API/regularization/#RegularizedLeastSquares.prox!-Tuple{Type{<:AbstractParameterizedRegularization}, Any, Any}","page":"Regularization Terms","title":"RegularizedLeastSquares.prox!","text":"prox!(regType::Type{<:AbstractParameterizedRegularization}, x, λ; kwargs...)\n\nconstruct a regularization term of type regType with given λ and kwargs and apply its prox! on x\n\n\n\n\n\n","category":"method"},{"location":"API/regularization/#LinearAlgebra.norm-Tuple{AbstractParameterizedRegularization, AbstractArray}","page":"Regularization Terms","title":"LinearAlgebra.norm","text":"norm(reg::AbstractParameterizedRegularization, x)\n\nreturns the value of the reg regularization term on x. Uses the regularization parameter defined for reg.\n\n\n\n\n\n","category":"method"},{"location":"API/regularization/#RegularizedLeastSquares.λ-Tuple{AbstractParameterizedRegularization}","page":"Regularization Terms","title":"RegularizedLeastSquares.λ","text":"λ(reg::AbstractParameterizedRegularization)\n\nreturn the regularization parameter λ of reg\n\n\n\n\n\n","category":"method"},{"location":"API/regularization/#LinearAlgebra.norm-Tuple{Type{<:AbstractParameterizedRegularization}, Any, Any}","page":"Regularization Terms","title":"LinearAlgebra.norm","text":"norm(regType::Type{<:AbstractParameterizedRegularization}, x, λ; kwargs...)\n\nconstruct a regularization term of type regType with given λ and kwargs and apply its norm on x\n\n\n\n\n\n","category":"method"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"EditURL = \"../../literate/howto/callbacks.jl\"","category":"page"},{"location":"generated/howto/callbacks/#Callbacks","page":"Callbacks","title":"Callbacks","text":"","category":"section"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"For certain optimization it is important to monitor the internal state of the solver. RegularizedLeastSquares.jl provides a callback mechanism to allow developres to access this state after each iteration. The package provides a variety of default callbacks, which for example store the solution after each iteration. More information can be found in the API reference for the solve! function.","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"In this example we will revist the compressed sensing compressed sensing example and implement a custom callback using the do-syntax of the solve! function. This allows us to implement our callback inline and access the solver state after each iteration.","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"We first recreate the operator A and the measurement vector b:","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"using ImagePhantoms, ImageGeoms\nN = 256\nimage = shepp_logan(N, SheppLoganToft())\nsize(image)\nusing Random, LinearOperatorCollection\nrandomIndices = shuffle(eachindex(image))\nsampledIndices = sort(randomIndices[1:div(end, 3)])\nA = SamplingOp(eltype(image), pattern = sampledIndices , shape = size(image));\nb = A*vec(image);\nnothing #hide","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"Next we prepare our visualization helper function:","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"using CairoMakie\nfunction plot_image(figPos, img; title = \"\", width = 150, height = 150, clim = extrema(img))\n ax = CairoMakie.Axis(figPos; yreversed=true, title, width, height)\n hidedecorations!(ax)\n heatmap!(ax, img, colorrange = clim)\nend","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"Now we construct the solver with the TV regularization term:","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"using RegularizedLeastSquares\nreg = TVRegularization(0.01; shape=size(image));\nsolver = createLinearSolver(FISTA, A; reg=reg, iterations=20);\nnothing #hide","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"We will now implement a callback that plots the solution every four iteration:","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"fig = Figure()\nidx = 1\nsolve!(solver, b) do solver, iteration\n if iteration % 4 == 0\n img_approx = copy(solversolution(solver))\n img_approx = reshape(img_approx, size(image))\n plot_image(fig[div(idx -1, 3) + 1, mod1(idx, 3)], img_approx, clim = extrema(image), title = \"$iteration\")\n global idx += 1\n end\nend","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"In the callback we have to copy the solution, as the solver will update it in place. As is explained in the solver section, each features fields that are intended to be immutable during a solve! call and a state that is modified in each iteration. Depending on the solvers parameters and the measurement input, the state can differ in its fields and their type. Ideally, one tries to avoid accessing the state directly and uses the provided functions to access the state.","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"The resulting figure shows the reconstructed image after 0, 4, 8, 12, 16 and 20 iterations:","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"resize_to_layout!(fig)\nfig","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"This page was generated using Literate.jl.","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"EditURL = \"../../literate/howto/normal_operator.jl\"","category":"page"},{"location":"generated/howto/normal_operator/#Normal-Operator","page":"Normal Operator","title":"Normal Operator","text":"","category":"section"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"Many solvers in RegularizedLeastSquares.jl are based on the normal operator mathbfA^*mathbfA of the linear operator mathbfA.","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"Solvers such as ADMM, FISTA and POGM generally solve optimization problems of the form:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"beginequation\n undersetmathbfxargmin mathbff(x)+ mathbfR(x)\nendequation","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"and require the gradient of the function mathbff(x). In this package we specialise the function mathbff(x) to the least squares norm:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"beginequation\n mathbff(x) = frac12vertvert mathbfAmathbfx-mathbfb vertvert^2_2\nendequation","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"The gradient of this function is:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"beginequation\n nabla mathbff(x) = mathbfA^*(mathbfAmathbfx-mathbfb) = mathbfA^*mathbfAx - mathbfA^*mathbfb\nendequation","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"Similarily, the conjugate gradient normal residual (CGNR) algorithm applies conjugate gradient algorithm to:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"beginequation\n mathbfA^*mathbfAmathbfx = mathbfA^*mathbfb\nendequation","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"The normal operator can be passed directly to these solvers, otherwise it is computed internally.","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"using RegularizedLeastSquares\nA = randn(32, 16)\nx = randn(16)\nb = A*x\n\nsolver = createLinearSolver(CGNR, A; AHA = adjoint(A) * A, reg = L2Regularization(0.0001), iterations=32);\nx_approx = solve!(solver, b)","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"The normal operator can also be computed using the normalOperator function from LinearOperatorCollection.jl. This is useful if the normal operator is not directly available or shouldn't be stored in memory. This function is opinionated and attempts to optimize the resulting operator for iterative applications. Specifying a custom method for a custom operator allows one to control this optimization.","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"An example of such an optimization is a matrix-free weighting of mathbfA as shown in the Weighting example:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"using LinearOperatorCollection\nweights = rand(32)\nWA = ProdOp(WeightingOp(weights), A)\nAHA = LinearOperatorCollection.normalOperator(WA)","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"Without an optimization a matrix-free product would apply the following operator each iteration:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"beginequation\n (mathbfWA)^*mathbfWA = mathbfA^*mathbfW^*mathbfWmathbfA\nendequation","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"This is not efficient and instead the normal operator can be optimized by initially computing the weights:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"beginequation\n tildemathbfW = mathbfW^*mathbfW\nendequation","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"and then applying the following each iteration:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"beginequation\n mathbfA^*tildemathbfWmathbfA\nendequation","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"The optimized normal operator can then be passed to the solver:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"solver = createLinearSolver(CGNR, WA; AHA = AHA, reg = L2Regularization(0.0001), iterations=32);\nx_approx2 = solve!(solver, weights .* b)","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"Of course it is also possible to optimize a normal operator with other means and pass it to the solver via the AHA keyword argument.","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"It is also possible to only supply the normal operator to these solvers, however on then needs to supply mathbfA^*b intead of mathbfb.","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"This page was generated using Literate.jl.","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"EditURL = \"../../literate/howto/plug-and-play.jl\"","category":"page"},{"location":"generated/howto/plug-and-play/#Plug-and-Play-Regularization","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"","category":"section"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"A group of regularization terms that can not be directly written down as function are learned plug-and-play (PnP) priors. These are terms based on deep neural networks, which are trainted to implement the proximal map corresponding to the regularization term. Such a PnP prior can be used in the same way as any other regularization term.","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"The following example shows how to use a PnP prior in the context of the Kaczmarz solver.","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"using RegularizedLeastSquares\nA = randn(32, 16)\nx = randn(16)\nb = A*x;\nnothing #hide","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"For the documentation we will just use the identity function as a placeholder for the PnP prior.","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"model = identity","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"In practice, you would replace this with a neural network:","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"using Flux\nmodel = Flux.loadmodel!(model, ...)","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"The model can then be used together with the PnPRegularization term:","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"reg = PnPRegularization(1.0; model = model, shape = [16]);\nnothing #hide","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"Since models often expect a specific input range, we can use the MinMaxTransform to normalize the input:","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"reg = PnPRegularization(1.0; model = model, shape = [16], input_transform = RegularizedLeastSquares.MinMaxTransform);\nnothing #hide","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"Custom input transforms can be implemented by passing something callable as the input_transform keyword argument. For more details see the PnPRegularization documentation.","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"The regularization term can then be used in the solver:","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"solver = createLinearSolver(Kaczmarz, A; reg = reg, iterations = 32)\nx_approx = solve!(solver, b)","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"This page was generated using Literate.jl.","category":"page"},{"location":"API/solvers/#API-for-Solvers","page":"Solvers","title":"API for Solvers","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"This page contains documentation of the public API of the RegularizedLeastSquares. In the Julia REPL one can access this documentation by entering the help mode with ?","category":"page"},{"location":"API/solvers/#solve!","page":"Solvers","title":"solve!","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.solve!(::AbstractLinearSolver, ::Any)\nRegularizedLeastSquares.init!(::AbstractLinearSolver, ::Any)\nRegularizedLeastSquares.init!(::AbstractLinearSolver, ::AbstractSolverState, ::AbstractMatrix)\n","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.solve!-Tuple{AbstractLinearSolver, Any}","page":"Solvers","title":"RegularizedLeastSquares.solve!","text":"solve!(solver::AbstractLinearSolver, b; x0 = 0, callbacks = (_, _) -> nothing)\n\nSolves an inverse problem for the data vector b using solver.\n\nRequired Arguments\n\nsolver::AbstractLinearSolver - linear solver (e.g., ADMM or FISTA), containing forward/normal operator and regularizer\nb::AbstractVector - data vector if A was supplied to the solver, back-projection of the data otherwise\n\nOptional Keyword Arguments\n\nx0::AbstractVector - initial guess for the solution; default is zero\ncallbacks - (optionally a vector of) function or callable struct that takes the two arguments callback(solver, iteration) and, e.g., stores, prints, or plots the intermediate solutions or convergence parameters. Be sure not to modify solver or iteration in the callback function as this would japaridze convergence. The default does nothing.\n\nExamples\n\nThe optimization problem\n\n\targmin_x Ax - b_2^2 + λ x_1\n\ncan be solved with the following lines of code:\n\njulia> using RegularizedLeastSquares\n\njulia> A = [0.831658 0.96717\n 0.383056 0.39043\n 0.820692 0.08118];\n\njulia> x = [0.5932234523399985; 0.2697534345340015];\n\njulia> b = A * x;\n\njulia> S = ADMM(A);\n\njulia> x_approx = solve!(S, b)\n2-element Vector{Float64}:\n 0.5932234523399984\n 0.26975343453400163\n\nHere, we use L1Regularization, which is default for ADMM. All regularization options can be found in API for Regularizers.\n\nThe following example solves the same problem, but stores the solution x of each interation in tr:\n\njulia> tr = Dict[]\nDict[]\n\njulia> store_trace!(tr, solver, iteration) = push!(tr, Dict(\"iteration\" => iteration, \"x\" => solver.x, \"beta\" => solver.β))\nstore_trace! (generic function with 1 method)\n\njulia> x_approx = solve!(S, b; callbacks=(solver, iteration) -> store_trace!(tr, solver, iteration))\n2-element Vector{Float64}:\n 0.5932234523399984\n 0.26975343453400163\n\njulia> tr[3]\nDict{String, Any} with 3 entries:\n \"iteration\" => 2\n \"x\" => [0.593223, 0.269753]\n \"beta\" => [1.23152, 0.927611]\n\nThe last example show demonstrates how to plot the solution at every 10th iteration and store the solvers convergence metrics:\n\njulia> using Plots\n\njulia> conv = StoreConvergenceCallback()\n\njulia> function plot_trace(solver, iteration)\n if iteration % 10 == 0\n display(scatter(solver.x))\n end\n end\nplot_trace (generic function with 1 method)\n\njulia> x_approx = solve!(S, b; callbacks = [conv, plot_trace]);\n\nThe keyword callbacks allows you to pass a (vector of) callable objects that takes the arguments solver and iteration and prints, stores, or plots intermediate result.\n\nSee also StoreSolutionCallback, StoreConvergenceCallback, CompareSolutionCallback for a number of provided callback options.\n\n\n\n\n\n","category":"method"},{"location":"API/solvers/#RegularizedLeastSquares.init!-Tuple{AbstractLinearSolver, Any}","page":"Solvers","title":"RegularizedLeastSquares.init!","text":"init!(solver::AbstractLinearSolver, b; kwargs...)\n\nPrepare the solver for iteration based on the given data vector b and kwargs.\n\n\n\n\n\n","category":"method"},{"location":"API/solvers/#RegularizedLeastSquares.init!-Tuple{AbstractLinearSolver, AbstractSolverState, AbstractMatrix}","page":"Solvers","title":"RegularizedLeastSquares.init!","text":"init!(solver::AbstractLinearSolver, state::AbstractSolverState, b::AbstractMatrix; scheduler = SequentialState, kwargs...)\n\nInitialize the solver with each column of b and pass the corresponding states to the scheduler.\n\n\n\n\n\n","category":"method"},{"location":"API/solvers/#ADMM","page":"Solvers","title":"ADMM","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.ADMM","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.ADMM","page":"Solvers","title":"RegularizedLeastSquares.ADMM","text":"ADMM(A; AHA = A'*A, precon = Identity(), reg = L1Regularization(zero(real(eltype(AHA)))), regTrafo = opEye(eltype(AHA), size(AHA,1)), normalizeReg = NoNormalization(), rho = 1e-1, vary_rho = :none, iterations = 10, iterationsCG = 10, absTol = eps(real(eltype(AHA))), relTol = eps(real(eltype(AHA))), tolInner = 1e-5, verbose = false)\nADMM( ; AHA = , precon = Identity(), reg = L1Regularization(zero(real(eltype(AHA)))), regTrafo = opEye(eltype(AHA), size(AHA,1)), normalizeReg = NoNormalization(), rho = 1e-1, vary_rho = :none, iterations = 10, iterationsCG = 10, absTol = eps(real(eltype(AHA))), relTol = eps(real(eltype(AHA))), tolInner = 1e-5, verbose = false)\n\nCreates an ADMM object for the forward operator A or normal operator AHA.\n\nRequired Arguments\n\nA - forward operator\n\nOR\n\nAHA - normal operator (as a keyword argument)\n\nOptional Keyword Arguments\n\nAHA - normal operator is optional if A is supplied\nprecon - preconditionner for the internal CG algorithm\nreg::AbstractParameterizedRegularization - regularization term; can also be a vector of regularization terms\nregTrafo - transformation to a space in which reg is applied; if reg is a vector, regTrafo has to be a vector of the same length. Use opEye(eltype(AHA), size(AHA,1)) if no transformation is desired.\nnormalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()\nrho::Real - penalty of the augmented Lagrangian\nvary_rho::Symbol - vary rho to balance primal and dual feasibility; options :none, :balance, :PnP\niterations::Int - maximum number of (outer) ADMM iterations\niterationsCG::Int - maximum number of (inner) CG iterations\nabsTol::Real - absolute tolerance for stopping criterion\nrelTol::Real - relative tolerance for stopping criterion\ntolInner::Real - relative tolerance for CG stopping criterion\nverbose::Bool - print residual in each iteration\n\nADMM differs from ISTA-type algorithms in the sense that the proximal operation is applied separately from the transformation to the space in which the penalty is applied. This is reflected by the interface which has reg and regTrafo as separate arguments. E.g., for a TV penalty, you should NOT set reg=TVRegularization, but instead use reg=L1Regularization(λ), regTrafo=RegularizedLeastSquares.GradientOp(Float64; shape=(Nx,Ny,Nz)).\n\nSee also createLinearSolver, solve!.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#CGNR","page":"Solvers","title":"CGNR","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.CGNR","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.CGNR","page":"Solvers","title":"RegularizedLeastSquares.CGNR","text":"CGNR(A; AHA = A' * A, reg = L2Regularization(zero(real(eltype(AHA)))), normalizeReg = NoNormalization(), iterations = 10, relTol = eps(real(eltype(AHA))))\nCGNR( ; AHA = , reg = L2Regularization(zero(real(eltype(AHA)))), normalizeReg = NoNormalization(), iterations = 10, relTol = eps(real(eltype(AHA))))\n\ncreates an CGNR object for the forward operator A or normal operator AHA.\n\nRequired Arguments\n\nA - forward operator\n\nOR\n\nAHA - normal operator (as a keyword argument)\n\nOptional Keyword Arguments\n\nAHA - normal operator is optional if A is supplied\nreg::AbstractParameterizedRegularization - regularization term; can also be a vector of regularization terms\nnormalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()\niterations::Int - maximum number of iterations\nrelTol::Real - tolerance for stopping criterion\n\nSee also createLinearSolver, solve!.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#Kaczmarz","page":"Solvers","title":"Kaczmarz","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.Kaczmarz","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.Kaczmarz","page":"Solvers","title":"RegularizedLeastSquares.Kaczmarz","text":"Kaczmarz(A; reg = L2Regularization(0), normalizeReg = NoNormalization(), randomized=false, subMatrixFraction=0.15, shuffleRows=false, seed=1234, iterations=10)\n\nCreates a Kaczmarz object for the forward operator A.\n\nRequired Arguments\n\nA - forward operator\n\nOptional Keyword Arguments\n\nreg::AbstractParameterizedRegularization - regularization term\nnormalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()\nrandomized::Bool - randomize Kacmarz algorithm\nsubMatrixFraction::Real - fraction of rows used in randomized Kaczmarz algorithm\nshuffleRows::Bool - randomize Kacmarz algorithm\nseed::Int - seed for randomized algorithm\niterations::Int - number of iterations\n\nSee also createLinearSolver, solve!.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#FISTA","page":"Solvers","title":"FISTA","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.FISTA","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.FISTA","page":"Solvers","title":"RegularizedLeastSquares.FISTA","text":"FISTA(A; AHA=A'*A, reg=L1Regularization(zero(real(eltype(AHA)))), normalizeReg=NoNormalization(), iterations=50, verbose = false, rho = 0.95 / power_iterations(AHA), theta=1, relTol=eps(real(eltype(AHA))), restart = :none)\nFISTA( ; AHA=, reg=L1Regularization(zero(real(eltype(AHA)))), normalizeReg=NoNormalization(), iterations=50, verbose = false, rho = 0.95 / power_iterations(AHA), theta=1, relTol=eps(real(eltype(AHA))), restart = :none)\n\ncreates a FISTA object for the forward operator A or normal operator AHA.\n\nRequired Arguments\n\nA - forward operator\n\nOR\n\nAHA - normal operator (as a keyword argument)\n\nOptional Keyword Arguments\n\nAHA - normal operator is optional if A is supplied\nprecon - preconditionner for the internal CG algorithm\nreg::AbstractParameterizedRegularization - regularization term; can also be a vector of regularization terms\nnormalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()\nrho::Real - step size for gradient step; the default is 0.95 / max_eigenvalue as determined with power iterations.\ntheta::Real - parameter for predictor-corrector step\nrelTol::Real - tolerance for stopping criterion\niterations::Int - maximum number of iterations\nrestart::Symbol - :none, :gradient options for restarting\nverbose::Bool - print residual in each iteration\n\nSee also createLinearSolver, solve!.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#OptISTA","page":"Solvers","title":"OptISTA","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.OptISTA","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.OptISTA","page":"Solvers","title":"RegularizedLeastSquares.OptISTA","text":"OptISTA(A; AHA=A'*A, reg=L1Regularization(zero(real(eltype(AHA)))), normalizeReg=NoNormalization(), iterations=50, verbose = false, rho=0.95 / power_iterations(AHA), theta=1, relTol=eps(real(eltype(AHA))))\nOptISTA( ; AHA=, reg=L1Regularization(zero(real(eltype(AHA)))), normalizeReg=NoNormalization(), iterations=50, verbose = false, rho=0.95 / power_iterations(AHA), theta=1, relTol=eps(real(eltype(AHA))))\n\ncreates a OptISTA object for the forward operator A or normal operator AHA. OptISTA has a 2x better worst-case bound than FISTA, but actual performance varies by application. It stores 2 extra intermediate variables the size of the image compared to FISTA.\n\nReference:\n\nUijeong Jang, Shuvomoy Das Gupta, Ernest K. Ryu, \"Computer-Assisted Design of Accelerated Composite Optimization Methods: OptISTA,\" arXiv:2305.15704, 2023, [https://arxiv.org/abs/2305.15704]\n\nRequired Arguments\n\nA - forward operator\n\nOR\n\nAHA - normal operator (as a keyword argument)\n\nOptional Keyword Arguments\n\nAHA - normal operator is optional if A is supplied\nreg::AbstractParameterizedRegularization - regularization term\nnormalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()\nrho::Real - step size for gradient step; the default is 0.95 / max_eigenvalue as determined with power iterations.\ntheta::Real - parameter for predictor-corrector step\nrelTol::Real - tolerance for stopping criterion\niterations::Int - maximum number of iterations\nverbose::Bool - print residual in each iteration\n\nSee also createLinearSolver, solve!.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#POGM","page":"Solvers","title":"POGM","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.POGM","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.POGM","page":"Solvers","title":"RegularizedLeastSquares.POGM","text":"POGM(A; AHA = A'*A, reg = L1Regularization(zero(real(eltype(AHA)))), normalizeReg = NoNormalization(), iterations = 50, verbose = false, rho = 0.95 / power_iterations(AHA), theta = 1, sigma_fac = 1, relTol = eps(real(eltype(AHA))), restart = :none)\nPOGM( ; AHA = , reg = L1Regularization(zero(real(eltype(AHA)))), normalizeReg = NoNormalization(), iterations = 50, verbose = false, rho = 0.95 / power_iterations(AHA), theta = 1, sigma_fac = 1, relTol = eps(real(eltype(AHA))), restart = :none)\n\nCreates a POGM object for the forward operator A or normal operator AHA. POGM has a 2x better worst-case bound than FISTA, but actual performance varies by application. It stores 3 extra intermediate variables the size of the image compared to FISTA. Only gradient restart scheme is implemented for now.\n\nReferences:\n\nA.B. Taylor, J.M. Hendrickx, F. Glineur, \"Exact worst-case performance of first-order algorithms for composite convex optimization,\" Arxiv:1512.07516, 2015, SIAM J. Opt. 2017 [http://doi.org/10.1137/16m108104x]\nKim, D., & Fessler, J. A. (2018). Adaptive Restart of the Optimized Gradient Method for Convex Optimization. Journal of Optimization Theory and Applications, 178(1), 240–263. [https://doi.org/10.1007/s10957-018-1287-4]\nRequired Arguments\nA - forward operator\nOR\nAHA - normal operator (as a keyword argument)\nOptional Keyword Arguments\nAHA - normal operator is optional if A is supplied\nreg::AbstractParameterizedRegularization - regularization term\nnormalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()\nrho::Real - step size for gradient step; the default is 0.95 / max_eigenvalue as determined with power iterations.\ntheta::Real - parameter for predictor-corrector step\nsigma_fac::Real - parameter for decreasing γ-momentum ∈ [0,1]\nrelTol::Real - tolerance for stopping criterion\niterations::Int - maximum number of iterations\nrestart::Symbol - :none, :gradient options for restarting\nverbose::Bool - print residual in each iteration\n\nSee also createLinearSolver, solve!.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#SplitBregman","page":"Solvers","title":"SplitBregman","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.SplitBregman","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.SplitBregman","page":"Solvers","title":"RegularizedLeastSquares.SplitBregman","text":"SplitBregman(A; AHA = A'*A, precon = Identity(), reg = L1Regularization(zero(real(eltype(AHA)))), regTrafo = opEye(eltype(AHA), size(AHA,1)), normalizeReg = NoNormalization(), rho = 1e-1, iterations = 10, iterationsInner = 10, iterationsCG = 10, absTol = eps(real(eltype(AHA))), relTol = eps(real(eltype(AHA))), tolInner = 1e-5, verbose = false)\nSplitBregman( ; AHA = , precon = Identity(), reg = L1Regularization(zero(real(eltype(AHA)))), regTrafo = opEye(eltype(AHA), size(AHA,1)), normalizeReg = NoNormalization(), rho = 1e-1, iterations = 10, iterationsInner = 10, iterationsCG = 10, absTol = eps(real(eltype(AHA))), relTol = eps(real(eltype(AHA))), tolInner = 1e-5, verbose = false)\n\nCreates a SplitBregman object for the forward operator A or normal operator AHA.\n\nRequired Arguments\n\nA - forward operator\n\nOR\n\nAHA - normal operator (as a keyword argument)\n\nOptional Keyword Arguments\n\nAHA - normal operator is optional if A is supplied\nprecon - preconditionner for the internal CG algorithm\nreg::AbstractParameterizedRegularization - regularization term; can also be a vector of regularization terms\nregTrafo - transformation to a space in which reg is applied; if reg is a vector, regTrafo has to be a vector of the same length. Use opEye(eltype(AHA), size(AHA,1)) if no transformation is desired.\nnormalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()\nrho::Real - weights for condition on regularized variables; can also be a vector for multiple regularization terms\niterations::Int - maximum number of outer iterations. Set to 1 for unconstraint split Bregman (equivalent to ADMM)\niterationsInner::Int - maximum number of inner iterations\niterationsCG::Int - maximum number of (inner) CG iterations\nabsTol::Real - absolute tolerance for stopping criterion\nrelTol::Real - relative tolerance for stopping criterion\ntolInner::Real - relative tolerance for CG stopping criterion\nverbose::Bool - print residual in each iteration\n\nThis algorithm solves the constraint problem (Eq. (4.7) in Tom Goldstein and Stanley Osher), i.e. ||R(x)||₁ such that ||Ax -b||₂² < σ². In order to solve the unconstraint problem (Eq. (4.8) in Tom Goldstein and Stanley Osher), i.e. ||Ax -b||₂² + λ ||R(x)||₁, you can either set iterations=1 or use ADMM instead, which is equivalent (iterations=1 in SplitBregman in implied in ADMM and the SplitBregman variable iterationsInner is simply called iterations in ADMM)\n\nLike ADMM, SplitBregman differs from ISTA-type algorithms in the sense that the proximal operation is applied separately from the transformation to the space in which the penalty is applied. This is reflected by the interface which has reg and regTrafo as separate arguments. E.g., for a TV penalty, you should NOT set reg=TVRegularization, but instead use reg=L1Regularization(λ), regTrafo=RegularizedLeastSquares.GradientOp(Float64; shape=(Nx,Ny,Nz)).\n\nSee also createLinearSolver, solve!.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#Miscellaneous","page":"Solvers","title":"Miscellaneous","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.solverstate\nRegularizedLeastSquares.solversolution\nRegularizedLeastSquares.solverconvergence\nRegularizedLeastSquares.StoreSolutionCallback\nRegularizedLeastSquares.StoreConvergenceCallback\nRegularizedLeastSquares.CompareSolutionCallback\nRegularizedLeastSquares.linearSolverList\nRegularizedLeastSquares.createLinearSolver\nRegularizedLeastSquares.applicableSolverList\nRegularizedLeastSquares.isapplicable","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.solverstate","page":"Solvers","title":"RegularizedLeastSquares.solverstate","text":"solverstate(solver::AbstractLinearSolver)\n\nReturn the current state of the solver\n\n\n\n\n\n","category":"function"},{"location":"API/solvers/#RegularizedLeastSquares.solversolution","page":"Solvers","title":"RegularizedLeastSquares.solversolution","text":"solversolution(solver::AbstractLinearSolver)\n\nReturn the current solution of the solver\n\n\n\n\n\nsolversolution(state::AbstractSolverState)\n\nReturn the current solution of the solver's state\n\n\n\n\n\n","category":"function"},{"location":"API/solvers/#RegularizedLeastSquares.solverconvergence","page":"Solvers","title":"RegularizedLeastSquares.solverconvergence","text":"solverconvergence(solver::AbstractLinearSolver)\n\nReturn a named tuple of the solvers current convergence metrics\n\n\n\n\n\n","category":"function"},{"location":"API/solvers/#RegularizedLeastSquares.StoreSolutionCallback","page":"Solvers","title":"RegularizedLeastSquares.StoreSolutionCallback","text":"StoreSolutionCallback(T)\n\nCallback that accumlates the solvers solution per iteration. Results are stored in the solutions field.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#RegularizedLeastSquares.StoreConvergenceCallback","page":"Solvers","title":"RegularizedLeastSquares.StoreConvergenceCallback","text":"StoreConvergenceCallback()\n\nCallback that accumlates the solvers convergence metrics per iteration. Results are stored in the convMeas field.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#RegularizedLeastSquares.CompareSolutionCallback","page":"Solvers","title":"RegularizedLeastSquares.CompareSolutionCallback","text":"CompareSolutionCallback(ref, cmp)\n\nCallback that compares the solvers current solution with the given reference via cmp(ref, solution) per iteration. Results are stored in the results field.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#RegularizedLeastSquares.linearSolverList","page":"Solvers","title":"RegularizedLeastSquares.linearSolverList","text":"Return a list of all available linear solvers\n\n\n\n\n\n","category":"function"},{"location":"API/solvers/#RegularizedLeastSquares.createLinearSolver","page":"Solvers","title":"RegularizedLeastSquares.createLinearSolver","text":"createLinearSolver(solver::AbstractLinearSolver, A; kargs...)\n\nThis method creates a solver. The supported solvers are methods typically used for solving regularized linear systems. All solvers return an approximate solution to Ax = b.\n\nTODO: give a hint what solvers are available\n\n\n\n\n\n","category":"function"},{"location":"API/solvers/#RegularizedLeastSquares.applicableSolverList","page":"Solvers","title":"RegularizedLeastSquares.applicableSolverList","text":"applicable(args...)\n\nlist all solvers that are applicable to the given arguments. Arguments are the same as for isapplicable without the solver type.\n\nSee also isapplicable, linearSolverList.\n\n\n\n\n\n","category":"function"},{"location":"API/solvers/#RegularizedLeastSquares.isapplicable","page":"Solvers","title":"RegularizedLeastSquares.isapplicable","text":"isapplicable(solverType::Type{<:AbstractLinearSolver}, A, x, reg)\n\nreturn true if a solver of type solverType is applicable to system matrix A, data x and regularization terms reg.\n\n\n\n\n\n","category":"function"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"EditURL = \"../../literate/howto/gpu_acceleration.jl\"","category":"page"},{"location":"generated/howto/gpu_acceleration/#GPU-Acceleration","page":"GPU Acceleration","title":"GPU Acceleration","text":"","category":"section"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"RegularizedLeastSquares.jl supports generic GPU acceleration. This means that the user can use any GPU array type that supports the GPUArrays interface. This includes CUDA.jl, AMDGPU.jl, and Metal.jl. In this example we will use the package JLArrays.jl which provides a reference implementation for GPUArrays, that can runs on CPUs.","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"using JLArrays\ngpu = JLArray;\nnothing #hide","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"To use the following examples on an actual GPU, load the appropraite package replace JLArray with the respective GPU array type, for example:","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"using CUDA\ngpu = CuArray","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"At first we will look at an example of dense GPU arrays.","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"using RegularizedLeastSquares\nA = gpu(rand(Float32, 32, 16))\nx = gpu(rand(Float32, 16))\nb = A*x;\nnothing #hide","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"Solvers adapt their states based on the type of the given measurement vector. This means that the solver will automatically switch to GPU acceleration if a GPU array is passed as the measurement vector.","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"solver = createLinearSolver(CGNR, A; reg = L2Regularization(0.0001), iterations=32);\nx_approx = solve!(solver, b)","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"This adaption does not include the operator. So if we want to compare with CPU result, we need to construct a new solver with a CPU operator.","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"solver = createLinearSolver(CGNR, Array(A); reg = L2Regularization(0.0001), iterations=32);\nx_cpu = solve!(solver, Array(b))\nisapprox(Array(x_approx), x_cpu)","category":"page"},{"location":"generated/howto/gpu_acceleration/#Matrix-Free-Operators","page":"GPU Acceleration","title":"Matrix-Free Operators","text":"","category":"section"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"A special case is the usage of matrix-free operators. Since these operators do not have a concrete matrix representation, their GPU support depends on their implementation. Since not all multiplications within a solver approximation are in-place, the operator also needs to support the * operation and construct an appropriate result vector. For matrix-free operators based on LinearOperators.jl, this can be achieved by implementing the LinearOperators.storage_type method.","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"In the following, we will take another look at the CS example and execute it on the GPU. Note that for the JLArray example we chose a small phantom, since the JLArray implementation is not optimized for performance:","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"using ImagePhantoms, ImageGeoms\nN = 32\nimage = shepp_logan(N, SheppLoganToft())\n\nusing Random, LinearOperatorCollection\nrandomIndices = shuffle(eachindex(image))\nsampledIndices = sort(randomIndices[1:div(end, 3)]);\nnothing #hide","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"To construct the operator, we need to convert the indices to a GPU array. We also need to specify the correct storage type. In both LinearOperators.jl and LinearOperatorCollection.jl this is done with the S keyword argument.","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"gpu_indices = gpu(sampledIndices)\nA = SamplingOp(eltype(image), pattern = gpu_indices, shape = size(image), S = typeof(b));\nnothing #hide","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"Let's inspect the storage type of the operator:","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"using LinearOperatorCollection.LinearOperators\nLinearOperators.storage_type(A)","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"Afterwards we can use the operator as usual:","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"b = A*vec(gpu(image));\nnothing #hide","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"And use it in the solver:","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"using RegularizedLeastSquares\nreg = TVRegularization(0.01; shape=size(image))\nsolver = createLinearSolver(FISTA, A; reg=reg, iterations=20)\nimg_approx = solve!(solver,b);\nnothing #hide","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"To visualize the reconstructed image, we need to reshape the result vector to the correct shape and convert it to a CPU array:","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"img_approx = reshape(Array(img_approx),size(image))","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"We will again use CairoMakie for visualization:","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"using CairoMakie\nfunction plot_image(figPos, img; title = \"\", width = 150, height = 150)\n ax = CairoMakie.Axis(figPos; yreversed=true, title, width, height)\n hidedecorations!(ax)\n heatmap!(ax, img)\nend\nfig = Figure()\nplot_image(fig[1,1], image, title = \"Image\")\nsamplingMask = fill(false, size(image))\nsamplingMask[sampledIndices] .= true\nplot_image(fig[1,2], image .* samplingMask, title = \"Sampled Image\")\nplot_image(fig[1,3], img_approx, title = \"Reconstructed Image\")\nresize_to_layout!(fig)\nfig","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"This page was generated using Literate.jl.","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"EditURL = \"../../literate/examples/compressed_sensing.jl\"","category":"page"},{"location":"generated/examples/compressed_sensing/#Compressed-Sensing-Example","page":"Compressed Sensing","title":"Compressed Sensing Example","text":"","category":"section"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"In this example we will go through a simple example from the field of Compressed Sensing. In addtion to RegularizedLeastSquares.jl, we will need the packages LinearOperatorCollection.jl, ImagePhantoms.jl, ImageGeoms.jl and Random.jl, as well as CairoMakie.jl for visualization. We can install them the same way we did RegularizedLeastSquares.jl.","category":"page"},{"location":"generated/examples/compressed_sensing/#Preparing-the-Inverse-Problem","page":"Compressed Sensing","title":"Preparing the Inverse Problem","text":"","category":"section"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"To get started, let us generate a simple phantom using the ImagePhantoms and ImageGeom packages:","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"using ImagePhantoms, ImageGeoms\nN = 256\nimage = shepp_logan(N, SheppLoganToft())\nsize(image)","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"This produces a 256x256 image of a Shepp-Logan phantom.","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"In this example, we consider a problem in which we randomly sample a third of the pixels in the image. Such a problem and the corresponding measurement can be constructed with the packages LinearOperatorCollection and Random:","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"We first randomly shuffle the indices of the image and then select the first third of the indices to sample.","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"using Random, LinearOperatorCollection\nrandomIndices = shuffle(eachindex(image))\nsampledIndices = sort(randomIndices[1:div(end, 3)])","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"Afterwards we build a sampling operator which samples the image at the selected indices.","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"A = SamplingOp(eltype(image), pattern = sampledIndices , shape = size(image));\nnothing #hide","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"Then we apply the sampling operator to the vectorized image to obtain the sampled measurement vector","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"b = A*vec(image);\nnothing #hide","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"To visualize our image we can use CairoMakie:","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"using CairoMakie\nfunction plot_image(figPos, img; title = \"\", width = 150, height = 150)\n ax = CairoMakie.Axis(figPos; yreversed=true, title, width, height)\n hidedecorations!(ax)\n heatmap!(ax, img)\nend\nfig = Figure()\nplot_image(fig[1,1], image, title = \"Image\")\nsamplingMask = fill(false, size(image))\nsamplingMask[sampledIndices] .= true\nplot_image(fig[1,2], image .* samplingMask, title = \"Sampled Image\")\nresize_to_layout!(fig)\nfig","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"As we can see in the right image, only a third of the pixels are sampled. The goal of the inverse problem is to recover the original image from this measurement vector.","category":"page"},{"location":"generated/examples/compressed_sensing/#Solving-the-Inverse-Problem","page":"Compressed Sensing","title":"Solving the Inverse Problem","text":"","category":"section"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"To recover the image from the measurement vector, we solve the TV-regularized least squares problem:","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"beginequation\n undersetmathbfxargmin frac12vertvert mathbfAmathbfx-mathbfb vertvert_2^2 + lambdavertvertmathbfxvertvert_textTV \nendequation","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"For this purpose we build a TV regularizer with regularization parameter λ=001","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"using RegularizedLeastSquares\nreg = TVRegularization(0.01; shape=size(image));\nnothing #hide","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"We will use the Fast Iterative Shrinkage-Thresholding Algorithm (FISTA) to solve our inverse problem. Thus, we build the corresponding solver","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"solver = createLinearSolver(FISTA, A; reg=reg, iterations=20);\nnothing #hide","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"and apply it to our measurement vector","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"img_approx = solve!(solver,b)","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"To visualize the reconstructed image, we need to reshape the result vector to the correct shape. Afterwards we can use CairoMakie again:","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"img_approx = reshape(img_approx,size(image));\nplot_image(fig[1,3], img_approx, title = \"Reconstructed Image\")\nresize_to_layout!(fig)\nfig","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"This page was generated using Literate.jl.","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"EditURL = \"../../literate/examples/getting_started.jl\"","category":"page"},{"location":"generated/examples/getting_started/#Getting-Started","page":"Getting Started","title":"Getting Started","text":"","category":"section"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"In this example we will go through a simple random inverse problem to get familiar with RegularizedLeastSquares.jl.","category":"page"},{"location":"generated/examples/getting_started/#Installation","page":"Getting Started","title":"Installation","text":"","category":"section"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"To install RegularizedLeastSquares.jl, you can use the Julia package manager. Open a Julia REPL and run the following command:","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"using Pkg\nPkg.add(\"RegularizedLeastSquares\")","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"This will download and install the RegularizedLeastSquares.jl package and its dependencies. To install a different version, please consult the Pkg documentation.","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"Once the installation is complete, you can import the package with the using keyword:","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"using RegularizedLeastSquares","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"RegularizedLeastSquares aims to solve inverse problems of the form:","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"beginequation\n undersetmathbfxargmin frac12vertvert mathbfAmathbfx-mathbfb vertvert_2^2 + mathbfR(x) \nendequation","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"where mathbfA is a linear operator, mathbfb is the measurement vector, and mathbfR(x) is an (optional) regularization term. The goal is to retrieve an approximation of the unknown vector mathbfx. In this first exampel we will just work with simple random arrays. For more advanced examples, please refer to the examples.","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"A = rand(32, 16)\nx = rand(16)\nb = A*x;\nnothing #hide","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"To approximate x from b, we can use the Conjugate Gradient Normal Residual (CGNR) algorithm. We first build the corresponding solver:","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"solver = createLinearSolver(CGNR, A; iterations=32);\nnothing #hide","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"and apply it to our measurement vector","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"x_approx = solve!(solver, b)\nisapprox(x, x_approx, rtol = 0.001)","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"Usually the inverse problems are ill-posed and require regularization. RegularizedLeastSquares.jl provides a variety of regularization terms. The CGNR algorithm can solve optimzation problems of the form:","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"beginequation\n undersetmathbfxargmin frac12vertvert mathbfAmathbfx-mathbfb vertvert_2^2 + lambdavertvertmathbfxvertvert^2_2 \nendequation","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"The corresponding solver can be built with the l^2_2-regularization term:","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"solver = createLinearSolver(CGNR, A; reg = L2Regularization(0.0001), iterations=32);\nx_approx = solve!(solver, b)\nisapprox(x, x_approx, rtol = 0.001)","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"This page was generated using Literate.jl.","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"EditURL = \"../../literate/explanations/regularization.jl\"","category":"page"},{"location":"generated/explanations/regularization/#Regularization","page":"Regularization","title":"Regularization","text":"","category":"section"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"When formulating inverse problems, a regulariser is formulated as an additional cost function which has to be minimised. Many algorithms deal with a regularizers g, by computing the proximal map:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"beginequation\n prox_g (mathbfx) = undersetmathbfuargmin frac12vertvert mathbfu-mathbfx vert vert^2 + g(mathbfx)\nendequation","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"For many regularizers, the proximal map can be computed efficiently in a closed form.","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"In order to implement these proximal mappings, RegularizedLeastSquares.jl defines the following type hierarchy:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"abstract type AbstractRegularization\nprox!(reg::AbstractRegularization, x)\nnorm(reg::AbstractRegularization, x)","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"Here prox!(reg, x) is an in-place function which computes the proximal map on the input-vector x. The function norm computes the value of the corresponding term in the inverse problem. RegularizedLeastSquares.jl provides AbstractParameterizedRegularization and AbstractProjectionRegularization as core regularization types.","category":"page"},{"location":"generated/explanations/regularization/#Parameterized-Regularization-Terms","page":"Regularization","title":"Parameterized Regularization Terms","text":"","category":"section"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"This group of regularization terms features a regularization parameter λ that is used during the prox! and normcomputations. Examples of this regulariztion group are L1, L2 or LLR (locally low rank) regularization terms.","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"These terms are constructed by supplying a λ and optionally term specific keyword arguments:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"using RegularizedLeastSquares\nl2 = L2Regularization(0.3)","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"Parameterized regularization terms implement:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"prox!(reg::AbstractParameterizedRegularization, x, λ)\nnorm(reg::AbstractParameterizedRegularization, x, λ)","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"where λ by default is filled with the value used during construction.","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"Invoking λ on a parameterized term retrieves its regularization parameter. This can be used in a solver to scale and overwrite the parameter as follows:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"prox!(l2, [1.0])","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"param = λ(l2)\nprox!(l2, [1.0], param*0.2)","category":"page"},{"location":"generated/explanations/regularization/#Projection-Regularization-Terms","page":"Regularization","title":"Projection Regularization Terms","text":"","category":"section"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"This group of regularization terms implement projections, such as a positivity constraint or a projection with a given convex projection function. These are essentially proximal maps where g(mathbfx) is the indicator function of a convex set.","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"positive = PositiveRegularization()\nprox!(positive, [2.0, -0.2])","category":"page"},{"location":"generated/explanations/regularization/#Nested-Regularization-Terms","page":"Regularization","title":"Nested Regularization Terms","text":"","category":"section"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"Nested regularization terms are terms that act as decorators to the core regularization terms. These terms can be nested around other terms and add functionality to a regularization term, such as scaling λ based on the provided operator or applying a transform, such as the Wavelet, to x. As an example, we can nest a L1 regularization term around a Wavelet operator.","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"First we generate an image and apply a wavelet operator to it:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"using Wavelets, LinearOperatorCollection, ImagePhantoms, ImageGeoms\nN = 256\nimage = shepp_logan(N, SheppLoganToft())\nwop = WaveletOp(Float32, shape = size(image))\n\nwavelet_image = reshape(wop*vec(image), size(image))\nwavelet_image = log.(abs.(wavelet_image) .+ 0.01)","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"We will use CairoMakie for visualization:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"using CairoMakie\nfunction plot_image(figPos, img; title = \"\", width = 150, height = 150)\n ax = CairoMakie.Axis(figPos; yreversed=true, title, width, height)\n hidedecorations!(ax)\n heatmap!(ax, img)\nend\nfig = Figure()\nplot_image(fig[1,1], image, title = \"Image\")\nplot_image(fig[1,2], wavelet_image, title = \"Wavelet Image\")\nresize_to_layout!(fig)\nfig","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"To apply soft-thresholding in the wavelet domain, we can nest a L1 regularization term around the Wavelet operator:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"core = L1Regularization(0.1)\nreg = TransformedRegularization(core, wop);\nnothing #hide","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"We can then apply the proximal map to the image or the image in the wavelet domain:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"img_prox_image = prox!(core, copy(vec(image)));\nimg_prox_wavelet = prox!(reg, copy(vec(image)));\nnothing #hide","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"We can visualize the result:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"img_prox_image = reshape(img_prox_image, size(image))\nimg_prox_wavelet = reshape(img_prox_wavelet, size(image))\nplot_image(fig[1,3], img_prox_image, title = \"Reg. Image Domain\")\nplot_image(fig[1,4], img_prox_wavelet, title = \"Reg. Wavelet Domain\")\nresize_to_layout!(fig)\nfig","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"Generally, regularization terms can be nested arbitrarly deep, adding new functionality with each layer. Each nested regularization term can return its inner regularization term. Furthermore, all regularization terms implement the iteration interface to iterate over the nesting. The innermost regularization term of a nested term must be a core regularization term and it can be returned by the sink function:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"RegularizedLeastSquares.innerreg(reg) == core","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"sink(reg) == core","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"foreach(r -> println(nameof(typeof(r))), reg)","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"This page was generated using Literate.jl.","category":"page"},{"location":"#RegularizedLeastSquares.jl","page":"Home","title":"RegularizedLeastSquares.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Solvers for Linear Inverse Problems using Regularization Techniques","category":"page"},{"location":"#Introduction","page":"Home","title":"Introduction","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"RegularizedLeastSquares.jl is a Julia package for solving large linear systems using various types of algorithms. Ill-conditioned problems arise in many areas of practical interest. Regularisation techniques and nonlinear problem formulations are often used to solve these problems. This package provides implementations for a variety of solvers used in areas such as MPI and MRI. In particular, this package serves as the optimization backend of the Julia packages MPIReco.jl and MRIReco.jl.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The implemented methods range from the l^2_2-regularized CGNR method to more general optimizers such as the Alternating Direction of Multipliers Method (ADMM) or the Split-Bregman method.","category":"page"},{"location":"","page":"Home","title":"Home","text":"For convenience, implementations of popular regularizers, such as l_1-regularization and TV regularization, are provided. On the other hand, hand-crafted regularizers can be used quite easily.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Depending on the problem, it becomes unfeasible to store the full system matrix at hand. For this purpose, RegularizedLeastSquares.jl allows for the use of matrix-free operators. Such operators can be realized using the interface provided by the package LinearOperators.jl. Other interfaces can be used as well, as long as the product *(A,x) and the adjoint adjoint(A) are provided. A number of common matrix-free operators are provided by the package LinearOperatorColection.jl.","category":"page"},{"location":"#Features","page":"Home","title":"Features","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Variety of optimization algorithms optimized for least squares problems\nSupport for matrix-free operators\nGPU support","category":"page"},{"location":"#Usage","page":"Home","title":"Usage","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"See Getting Started for an introduction to using the package","category":"page"},{"location":"#See-also","page":"Home","title":"See also","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Packages:","category":"page"},{"location":"","page":"Home","title":"Home","text":"ProximalAlgorithms.jl\nProximalOperators.jl\nKrylov.jl\nRegularizedOptimization.jl","category":"page"},{"location":"","page":"Home","title":"Home","text":"Organizations:","category":"page"},{"location":"","page":"Home","title":"Home","text":"JuliaNLSolvers\nJuliaSmoothOptimizers\nJuliaFirstOrder","category":"page"}] +[{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"EditURL = \"../../literate/examples/computed_tomography.jl\"","category":"page"},{"location":"generated/examples/computed_tomography/#Computed-Tomography-Example","page":"Computed Tomography","title":"Computed Tomography Example","text":"","category":"section"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"In this example we will go through a simple example from the field of Computed Tomography. In addtion to RegularizedLeastSquares.jl, we will need the packages LinearOperatorCollection.jl, ImagePhantoms.jl, ImageGeoms.jl and RadonKA.jl, as well as CairoMakie.jl for visualization. We can install them the same way we did RegularizedLeastSquares.jl.","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"RadonKA is a package for the computation of the Radon transform and its adjoint. It is implemented with KernelAbstractions.jl and supports GPU acceleration. See the GPU acceleration how-to for more information.","category":"page"},{"location":"generated/examples/computed_tomography/#Preparing-the-Inverse-Problem","page":"Computed Tomography","title":"Preparing the Inverse Problem","text":"","category":"section"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"To get started, let us generate a simple phantom using the ImagePhantoms and ImageGeom packages:","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"using ImagePhantoms, ImageGeoms\nN = 256\nimage = shepp_logan(N, SheppLoganToft())\nsize(image)","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"This produces a 256x256 image of a Shepp-Logan phantom.","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"using RadonKA, LinearOperatorCollection\nangles = collect(range(0, π, 256))\nsinogram = Array(RadonKA.radon(image, angles))","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"Afterwards we build a Radon operator implementing both the forward and adjoint Radon transform","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"A = RadonOp(eltype(image); angles, shape = size(image));\nnothing #hide","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"To visualize our image we can use CairoMakie:","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"using CairoMakie\nfunction plot_image(figPos, img; title = \"\", width = 150, height = 150)\n ax = CairoMakie.Axis(figPos[1, 1]; yreversed=true, title, width, height)\n hidedecorations!(ax)\n hm = heatmap!(ax, img)\n Colorbar(figPos[2, 1], hm, vertical = false, flipaxis = false)\nend\nfig = Figure()\nplot_image(fig[1,1], image, title = \"Image\")\nplot_image(fig[1,2], sinogram, title = \"Sinogram\")\nplot_image(fig[1,3], backproject(sinogram, angles), title = \"Backprojection\")\nresize_to_layout!(fig)\nfig","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"In the figure we can see our original image, the sinogram, and the backprojection of the sinogram. The goal of the inverse problem is to recover the original image from the sinogram.","category":"page"},{"location":"generated/examples/computed_tomography/#Solving-the-Inverse-Problem","page":"Computed Tomography","title":"Solving the Inverse Problem","text":"","category":"section"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"To recover the image from the measurement vector, we solve the l^2_2-regularized least squares problem","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"beginequation\n undersetmathbfxargmin frac12vertvert mathbfAmathbfx-mathbfb vertvert_2^2 + lambdavertvertmathbfxvertvert^2_2 \nendequation","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"For this purpose we build a l^2_2 with regularization parameter λ=0001","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"using RegularizedLeastSquares\nreg = L2Regularization(0.001);\nnothing #hide","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"To solve this inverse problem, the Conjugate Gradient Normal Residual (CGNR) algorithm can be used. This solver is based on the normal operator of the Radon operator and uses both the forward and adjoint Radon transform internally. We now build the corresponding solver","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"solver = createLinearSolver(CGNR, A; reg=reg, iterations=20);\nnothing #hide","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"and apply it to our measurement vector","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"img_approx = solve!(solver, vec(sinogram))","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"To visualize the reconstructed image, we need to reshape the result vector to the correct shape. Afterwards we can use CairoMakie again:","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"img_approx = reshape(img_approx,size(image));\nplot_image(fig[1,4], img_approx, title = \"Reconstructed Image\")\nresize_to_layout!(fig)\nfig","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"","category":"page"},{"location":"generated/examples/computed_tomography/","page":"Computed Tomography","title":"Computed Tomography","text":"This page was generated using Literate.jl.","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"EditURL = \"../../literate/howto/efficient_kaczmarz.jl\"","category":"page"},{"location":"generated/howto/efficient_kaczmarz/#Efficient-Kaczmarz","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"","category":"section"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"Unlike many of the other solvers provided by RegularizedLeastSquares.jl, the Kaczmarz method does not utilize a matrix-vector product with the operator mathbfA nor the normal operator mathbfA*A. Instead, it uses the rows of mathbfA to update the solution iteratively. Efficient Kaczmarz implementation therefore require very efficient dot products with the rows of mathbfA. In RegularizedLeastSquares.jl, this is achieved with the dot_with_matrix_row function.","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"using RegularizedLeastSquares\nA = randn(256, 256)\nx = randn(256)\nb = A*x;\nnothing #hide","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"The dot_with_matrix_row function calculates the dot product between a row of A and the current approximate solution of x:","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"row = 1\nisapprox(RegularizedLeastSquares.dot_with_matrix_row(A, x, row), sum(A[row, :] .* x))","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"Since in Julia, dense arrays are stored in column-major order, such a row-based operation is quite inefficient. A workaround is to transpose the matrix then pass it to a Kaczmarz solver.","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"At = collect(transpose(A))\nA_eff = transpose(At)","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"Note that the transpose function can return a lazy transpose object, so we first collect the transpose into a dense matrix. Then we transpose it again to get the efficient representation of the matrix.","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"We can compare the performance using the BenchmarkTools.jl package. First for the original matrix:","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"using BenchmarkTools\nsolver = createLinearSolver(Kaczmarz, A; reg = L2Regularization(0.0001), iterations=100)\n@benchmark solve!(solver, b) samples = 100","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"And then for the efficient matrix:","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"solver_eff = createLinearSolver(Kaczmarz, A_eff; reg = L2Regularization(0.0001), iterations=100)\n@benchmark solve!(solver_eff, b) samples = 100","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"We can also combine the efficient matrix with a weighting matrix, as is shown in the Weighting example.","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"Custom operators need to implement the dot_with_matrix_row function to be used with the Kaczmarz solver. Ideally, such an implementation is allocation free.","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"","category":"page"},{"location":"generated/howto/efficient_kaczmarz/","page":"Efficient Kaczmarz","title":"Efficient Kaczmarz","text":"This page was generated using Literate.jl.","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"EditURL = \"../../literate/howto/multi_threading.jl\"","category":"page"},{"location":"generated/howto/multi_threading/#Multi-Threading","page":"Multi-Threading","title":"Multi-Threading","text":"","category":"section"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"There are different ways multi-threading can be used with RegularizedLeastSquares.jl. To use multi-threading in Julia, one needs to start their session with multi-threads, see the Julia documentation for more information.","category":"page"},{"location":"generated/howto/multi_threading/#Solver-Based-Multi-Threading","page":"Multi-Threading","title":"Solver Based Multi-Threading","text":"","category":"section"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"This type of multi-threading is transparent to the solver and is applicable if the total solution is composed of individual solutions that can be solved in parallel. In particular, this approach also allows for using solvers with different parameters, such as their operator or regularization parameters.","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"using RegularizedLeastSquares\nAs = [rand(32, 16) for _ in 1:4]\nxs = [rand(16) for _ in 1:4]\nbs = [A*x for (A, x) in zip(As, xs)]\n\nxs_approx = similar(xs)\nThreads.@threads for i in 1:4\n solver = createLinearSolver(CGNR, As[i]; iterations=32)\n xs_approx[i] = solve!(solver, bs[i])\nend","category":"page"},{"location":"generated/howto/multi_threading/#Operator-Based-Multi-Threading","page":"Multi-Threading","title":"Operator Based Multi-Threading","text":"","category":"section"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"This type of multi-threading involves linear operators or proximal maps that can be implemnted in parallel. Examples of this include the proximal map of the TV regularization term, which is based on the multi-threaded GradientOp from LinearOperatorCollection. GPU acceleration also falls under this approach, see GPU Acceleration for more information.","category":"page"},{"location":"generated/howto/multi_threading/#Measurement-Based-Multi-Threading","page":"Multi-Threading","title":"Measurement Based Multi-Threading","text":"","category":"section"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"This level of multi-threading applies the same solver (and its parameters) to multiple measurement vectors or rather a measurement matrix B. This is useful in the case of multiple measurements that can be solved in parallel and can reuse the same solver. This approach is not applicable if the operator is stateful.","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"To use this approach we first build a measurement matrix B and a corresponding solver:","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"A = first(As)\nB = mapreduce(x -> A*x, hcat, xs)\nsolver = createLinearSolver(CGNR, A; iterations=32)","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"We can then simply pass the measurement matrix to the solver. The result will be the same as if we passed each colument of B seperately:","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"x_approx = solve!(solver, B)\nsize(x_approx)","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"The previous solve! call was still executed sequentially. To execute it in parallel, we have to specify a multi-threaded scheduler as a keyword-argument of the solve! call. RegularizedLeastSquares.jl provides a MultiThreadingState scheduler that can be used for this purpose. This scheduler is based on the Threads.@threads macro:","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"x_multi = solve!(solver, B; scheduler = MultiThreadingState)\nx_approx == x_multi","category":"page"},{"location":"generated/howto/multi_threading/#Custom-Scheduling","page":"Multi-Threading","title":"Custom Scheduling","text":"","category":"section"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"It is possible to implement custom scheduling. The following code shows how to implement this for the Threads.@spawn macro. Usually one this to implement multi-threading with a package such as FLoop.jl or ThreadPools.jl for thread pinning:","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"Since most solver have conv. criteria, they can finish at different iteration numbers, which we track this information with flags.","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":" mutable struct SpawnState{S, ST <: AbstractSolverState{S}} <: RegularizedLeastSquares.AbstractMatrixSolverState{S}\n states::Vector{ST}\n active::Vector{Bool}\n SpawnState(states::Vector{ST}) where {S, ST <: AbstractSolverState{S}} = new{S, ST}(states, fill(true, length(states)))\n end","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"To hook into the existing init! code we only have to supply a method that gets a copyable \"vector\" state. This will invoke our SpawnState constructor with copies of the given state.","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":" prepareMultiStates(solver::AbstractLinearSolver, state::SpawnState, b::AbstractMatrix) = prepareMultiStates(solver, first(state.states), b);\nnothing #hide","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"We specialise the iterate function which is called with the idx of still active states","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"function Base.iterate(solver::AbstractLinearSolver, state::SpawnState, activeIdx)\n @sync Threads.@spawn for i in activeIdx\n res = iterate(solver, state.states[i])\n if isnothing(res)\n state.active[i] = false\n end\n end\n return state.active, state\nend","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"Now we can simply use the SpawnState scheduler in the solve! call:","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"x_custom = solve!(solver, B; scheduler = SpawnState)\nx_approx == x_multi","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"","category":"page"},{"location":"generated/howto/multi_threading/","page":"Multi-Threading","title":"Multi-Threading","text":"This page was generated using Literate.jl.","category":"page"},{"location":"solvers/#Solvers","page":"Solvers","title":"Solvers","text":"","category":"section"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.jl provides a variety of solvers, which are used in fields such as MPI and MRI. The following gives an overview of implemented solvers and roughly which regularization terms are applicable for them:","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"Solver Regularization\nKaczmarz (Also called Algebraic reconstruction technique) l_2^2 and one additional term\nConjugate Gradients Normal Residual method (CGNR) l_2^2\nFast Iterative Shrinkage Thresholding Algorithm (FISTA) Any one term\nOptimal Iterative Shrinkage Thresholding Algorithm (OptISTA) Any one term\nProximal Optimized Gradient Method (POGM) Any one term\nAlternating Direction of Multipliers Method (ADMM) Several terms\nSplitBregman Several terms\nDirectSolver l_2^2\nPseudoInverse l_2^2","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"It is also possible to provide custom terms by implementing a proximal mapping. Generally, these algorithms are correct for regularization terms that are convex and possibly non-smooth. See Regularization, for more information on regularization terms. ","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"For convenience reasons, all solvers accept projection regularization terms, such as a constraint to the positive numbers. Depending on the solver, such a term is either considered during every iteration or just in the last iteration. ","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"A list of all available solvers can be returned by the linearSolverList function.","category":"page"},{"location":"solvers/#Solver-Construction","page":"Solvers","title":"Solver Construction","text":"","category":"section"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"To create a solver, one can invoke the method createLinearSolver as in","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"solver = createLinearSolver(CGNR, A; reg=reg, kwargs...)","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"Here A denotes the operator and reg are the Regularization terms to be used by the solver. All further solver parameters can be passed as keyword arguments and are solver specific. To make things more compact, it can be usefull to collect all parameters in a Dict{Symbol,Any}. In this way, the code snippet above can be written as","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"params=Dict{Symbol,Any}()\nparams[:reg] = ...\n...\n\nsolver = createLinearSolver(CGNR, A; params...)","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"This notation can be convenient when a large number of parameters are set manually.","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"It is also possible to construct a solver directly with its specific keyword arguments:","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"solver = CGNR(A, reg = reg, ...)","category":"page"},{"location":"solvers/#Solver-Usage","page":"Solvers","title":"Solver Usage","text":"","category":"section"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"Once constructed, a solver can be used to approximate a solution to a given measurement vector:","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"x_approx = solve!(solver, b; kwargs...)","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"The keyword arguments can be used to supply an inital solution x0, one or more callbacks to interact and monitor the solvers state and more. See the How-To and the API for more information.","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"It is also possible to explicitly invoke the solvers iterations using Julias iterate interface:","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"init!(solver, b; kwargs...)\nfor (iteration, x_approx) in enumerate(solver)\n println(\"Iteration $iteration\")\nend","category":"page"},{"location":"solvers/#Solver-Internals","page":"Solvers","title":"Solver Internals","text":"","category":"section"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"The solvers are organized in a type-hierarchy and inherit from:","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"abstract type AbstractLinearSolver","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"The type hierarchy is further differentiated into solver categories such as AbstractRowAtionSolver, AbstractPrimalDualSolver or AbstractProximalGradientSolver. ","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"The fields of a solver can be divided into two groups. The first group are intended to be immutable fields that do not change during iterations, the second group are mutable fields that do change. Examples of the first group are the operator itself and examples of the second group are the current solution or the number of the current iteration.","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"The second group is usually encapsulated in its own state struct:","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"mutable struct Solver{matT, ...}\n A::matT\n # Other \"static\" fields\n state::AbstractSolverState{<:Solver}\nend\n\nmutable struct SolverState{T, tempT} <: AbstractSolverState{Solver}\n x::tempT\n rho::T\n # ...\n iteration::Int64\nend","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"States are subtypes of the parametric AbstractSolverState{S} type. The state fields of solvers can be exchanged with different state belonging to the correct solver S. This means that the states can be used to realize custom variants of an existing solver:","category":"page"},{"location":"solvers/","page":"Solvers","title":"Solvers","text":"mutable struct VariantState{T, tempT} <: AbstractSolverState{Solver}\n x::tempT\n other::tempT\n # ...\n iteration::Int64\nend\n\nSolverVariant(A; kwargs...) = Solver(A, VariantState(kwargs...))\n\nfunction iterate(solver::Solver, state::VarianteState)\n # Custom iteration\nend","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"EditURL = \"../../literate/howto/weighting.jl\"","category":"page"},{"location":"generated/howto/weighting/#Weighting","page":"Weighting","title":"Weighting","text":"","category":"section"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"Often time one wants to solve a weighted least squares problem of the form:","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"beginequation\n undersetmathbfxargmin frac12vertvert mathbfAmathbfx-mathbfb vertvert^2_mathbfW + mathbfR(x) \nendequation","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"where mathbfW is a symmetric, positive weighting matrix and vertvertmathbfyvertvert^2_mathbfW denotes the weighted Euclidean norm. An example of such a weighting matrix is a noise whitening matrix. Another example could be a scaling of the matrix rows by the reciprocal of their row energy.","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"In the following, we will solve a weighted least squares problem of the form:","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"beginequation\n undersetmathbfxargmin frac12vertvert mathbfAmathbfx-mathbfb vertvert_mathbfW^2 + lambdavertvertmathbfxvertvert^2_2 \nendequation","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"using RegularizedLeastSquares, LinearOperatorCollection, LinearAlgebra\nA = rand(32, 16)\nx = rand(16)\nb = A*x;\nnothing #hide","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"As a weighting matrix, we will use the reciprocal of the row energy of the matrix A.","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"weights = map(row -> 1/rownorm²(A, row), 1:size(A, 1));\nnothing #hide","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"First, let us solve the problem with matrices we manually weighted.","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"WA = diagm(weights) * A\nsolver = createLinearSolver(Kaczmarz, WA; reg = L2Regularization(0.0001), iterations=10)\nx_approx = solve!(solver, weights .* b);\nnothing #hide","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"The operator A is not always a dense matrix and the product between the operator and the weighting matrix is not always efficient or possible. The package LinearOperatorCollection.jl provides a matrix-free implementation of a diagonal weighting matrix, as well as a matrix free product between two matrices. This weighted operator has efficient implementations of the normal operator and also for the row-action operations of the Kaczmarz solver.","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"W = WeightingOp(weights)\nP = ProdOp(W, A)\nsolver = createLinearSolver(Kaczmarz, P; reg = L2Regularization(0.0001), iterations=10)\nx_approx2 = solve!(solver, W * b)\nisapprox(x_approx, x_approx2)","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"","category":"page"},{"location":"generated/howto/weighting/","page":"Weighting","title":"Weighting","text":"This page was generated using Literate.jl.","category":"page"},{"location":"API/regularization/#API-for-Regularizers","page":"Regularization Terms","title":"API for Regularizers","text":"","category":"section"},{"location":"API/regularization/","page":"Regularization Terms","title":"Regularization Terms","text":"This page contains documentation of the public API of the RegularizedLeastSquares. In the Julia REPL one can access this documentation by entering the help mode with ?","category":"page"},{"location":"API/regularization/","page":"Regularization Terms","title":"Regularization Terms","text":"RegularizedLeastSquares.L1Regularization\nRegularizedLeastSquares.L2Regularization\nRegularizedLeastSquares.L21Regularization\nRegularizedLeastSquares.LLRRegularization\nRegularizedLeastSquares.NuclearRegularization\nRegularizedLeastSquares.TVRegularization","category":"page"},{"location":"API/regularization/#RegularizedLeastSquares.L1Regularization","page":"Regularization Terms","title":"RegularizedLeastSquares.L1Regularization","text":"L1Regularization\n\nRegularization term implementing the proximal map for the Lasso problem.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.L2Regularization","page":"Regularization Terms","title":"RegularizedLeastSquares.L2Regularization","text":"L2Regularization\n\nRegularization term implementing the proximal map for Tikhonov regularization.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.L21Regularization","page":"Regularization Terms","title":"RegularizedLeastSquares.L21Regularization","text":"L21Regularization\n\nRegularization term implementing the proximal map for group-soft-thresholding.\n\nArguments\n\nλ - regularization paramter\n\nKeywords\n\nslices=1 - number of elements per group\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.LLRRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.LLRRegularization","text":"LLRRegularization\n\nRegularization term implementing the proximal map for locally low rank (LLR) regularization using singular-value-thresholding.\n\nArguments\n\nλ - regularization paramter\n\nKeywords\n\nshape::Tuple{Int} - dimensions of the image\nblockSize::Tuple{Int}=(2,2) - size of patches to perform singular value thresholding on\nrandshift::Bool=true - randomly shifts the patches to ensure translation invariance\nfullyOverlapping::Bool=false - choose between fully overlapping block or non-overlapping blocks\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.NuclearRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.NuclearRegularization","text":"NuclearRegularization\n\nRegularization term implementing the proximal map for singular value soft-thresholding.\n\nArguments:\n\nλ - regularization paramter\n\nKeywords\n\nsvtShape::NTuple - size of the underlying matrix\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.TVRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.TVRegularization","text":"TVRegularization\n\nRegularization term implementing the proximal map for TV regularization. Calculated with the Condat algorithm if the TV is calculated only along one real-valued dimension and with the Fast Gradient Projection algorithm otherwise.\n\nReference for the Condat algorithm: https://lcondat.github.io/publis/Condat-fast_TV-SPL-2013.pdf\n\nReference for the FGP algorithm: A. Beck and T. Teboulle, \"Fast Gradient-Based Algorithms for Constrained Total Variation Image Denoising and Deblurring Problems\", IEEE Trans. Image Process. 18(11), 2009\n\nArguments\n\nλ::T - regularization parameter\n\nKeywords\n\nshape::NTuple - size of the underlying image\ndims - Dimension to perform the TV along. If Integer, the Condat algorithm is called, and the FDG algorithm otherwise.\niterationsTV=20 - number of FGP iterations\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#Projection-Regularization","page":"Regularization Terms","title":"Projection Regularization","text":"","category":"section"},{"location":"API/regularization/","page":"Regularization Terms","title":"Regularization Terms","text":"RegularizedLeastSquares.PositiveRegularization\nRegularizedLeastSquares.RealRegularization","category":"page"},{"location":"API/regularization/#RegularizedLeastSquares.PositiveRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.PositiveRegularization","text":"PositiveRegularization\n\nRegularization term implementing a projection onto positive and real numbers.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.RealRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.RealRegularization","text":"RealRegularization\n\nRegularization term implementing a projection onto real numbers.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#Nested-Regularization","page":"Regularization Terms","title":"Nested Regularization","text":"","category":"section"},{"location":"API/regularization/","page":"Regularization Terms","title":"Regularization Terms","text":"RegularizedLeastSquares.innerreg(::AbstractNestedRegularization)\nRegularizedLeastSquares.sink(::AbstractNestedRegularization)\nRegularizedLeastSquares.sinktype(::AbstractNestedRegularization)","category":"page"},{"location":"API/regularization/#RegularizedLeastSquares.innerreg-Tuple{AbstractNestedRegularization}","page":"Regularization Terms","title":"RegularizedLeastSquares.innerreg","text":"innerreg(reg::AbstractNestedRegularization)\n\nreturn the inner regularization term of reg. Nested regularization terms also implement the iteration interface.\n\n\n\n\n\n","category":"method"},{"location":"API/regularization/#RegularizedLeastSquares.sink-Tuple{AbstractNestedRegularization}","page":"Regularization Terms","title":"RegularizedLeastSquares.sink","text":"sink(reg::AbstractNestedRegularization)\n\nreturn the innermost regularization term.\n\n\n\n\n\n","category":"method"},{"location":"API/regularization/#RegularizedLeastSquares.sinktype-Tuple{AbstractNestedRegularization}","page":"Regularization Terms","title":"RegularizedLeastSquares.sinktype","text":"sinktype(reg::AbstractNestedRegularization)\n\nreturn the type of the innermost regularization term.\n\nSee also sink.\n\n\n\n\n\n","category":"method"},{"location":"API/regularization/#Scaled-Regularization","page":"Regularization Terms","title":"Scaled Regularization","text":"","category":"section"},{"location":"API/regularization/","page":"Regularization Terms","title":"Regularization Terms","text":"RegularizedLeastSquares.AbstractScaledRegularization\nRegularizedLeastSquares.scalefactor\nRegularizedLeastSquares.NormalizedRegularization\nRegularizedLeastSquares.NoNormalization\nRegularizedLeastSquares.MeasurementBasedNormalization\nRegularizedLeastSquares.SystemMatrixBasedNormalization\nRegularizedLeastSquares.FixedParameterRegularization","category":"page"},{"location":"API/regularization/#RegularizedLeastSquares.AbstractScaledRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.AbstractScaledRegularization","text":"AbstractScaledRegularization\n\nNested regularization term that applies a scalefactor to the regularization parameter λ of its inner term.\n\nSee also scalefactor, λ, innerreg.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.scalefactor","page":"Regularization Terms","title":"RegularizedLeastSquares.scalefactor","text":"scalescalefactor(reg::AbstractScaledRegularization)\n\nreturn the scaling scalefactor for λ\n\n\n\n\n\n","category":"function"},{"location":"API/regularization/#RegularizedLeastSquares.NormalizedRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.NormalizedRegularization","text":"NormalizedRegularization\n\nNested regularization term that scales λ according to normalization scheme. This term is commonly applied by a solver based on a given normalization keyword\n\n#See also NoNormalization, MeasurementBasedNormalization, SystemMatrixBasedNormalization.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.NoNormalization","page":"Regularization Terms","title":"RegularizedLeastSquares.NoNormalization","text":"NoNormalization\n\nNo normalization to λ is applied.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.MeasurementBasedNormalization","page":"Regularization Terms","title":"RegularizedLeastSquares.MeasurementBasedNormalization","text":"MeasurementBasedNormalization\n\nλ is normalized by the 1-norm of b divided by its length.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.SystemMatrixBasedNormalization","page":"Regularization Terms","title":"RegularizedLeastSquares.SystemMatrixBasedNormalization","text":"SystemMatrixBasedNormalization\n\nλ is normalized by the energy of the system matrix rows.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.FixedParameterRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.FixedParameterRegularization","text":"FixedParameterRegularization\n\nNested regularization term that discards any λ passed to it and instead uses λ from its inner regularization term. This can be used to selectively disallow normalization.\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#Misc.-Nested-Regularization","page":"Regularization Terms","title":"Misc. Nested Regularization","text":"","category":"section"},{"location":"API/regularization/","page":"Regularization Terms","title":"Regularization Terms","text":"RegularizedLeastSquares.MaskedRegularization\nRegularizedLeastSquares.TransformedRegularization\nRegularizedLeastSquares.PlugAndPlayRegularization","category":"page"},{"location":"API/regularization/#RegularizedLeastSquares.MaskedRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.MaskedRegularization","text":"MaskedRegularization\n\nNested regularization term that only applies prox! and norm to elements of x for which the mask is true.\n\nExamples\n\njulia> positive = PositiveRegularization();\n\njulia> masked = MaskedRegularization(reg, [true, false, true, false]);\n\njulia> prox!(masked, fill(-1, 4))\n4-element Vector{Float64}:\n 0.0\n -1.0\n 0.0\n -1.0\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.TransformedRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.TransformedRegularization","text":"TransformedRegularization(reg, trafo)\n\nNested regularization term that applies prox! or norm on z = trafo * x and returns (inplace) x = adjoint(trafo) * z.\n\nExample\n\njulia> core = L1Regularization(0.8)\nL1Regularization{Float64}(0.8)\n\njulia> wop = WaveletOp(Float32, shape = (32,32));\n\njulia> reg = TransformedRegularization(core, wop);\n\njulia> prox!(reg, randn(32*32)); # Apply soft-thresholding in Wavelet domain\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#RegularizedLeastSquares.PlugAndPlayRegularization","page":"Regularization Terms","title":"RegularizedLeastSquares.PlugAndPlayRegularization","text":" PlugAndPlayRegularization\n\nRegularization term implementing a given plug-and-play proximal mapping. The actual regularization term is indirectly defined by the learned proximal mapping and as such there is no norm implemented.\n\nArguments\n\nλ - regularization paramter\n\nKeywords\n\nmodel - model applied to the image\nshape - dimensions of the image\ninput_transform - transform of image before model\n\n\n\n\n\n","category":"type"},{"location":"API/regularization/#Miscellaneous-Functions","page":"Regularization Terms","title":"Miscellaneous Functions","text":"","category":"section"},{"location":"API/regularization/","page":"Regularization Terms","title":"Regularization Terms","text":"RegularizedLeastSquares.prox!(::AbstractParameterizedRegularization, ::AbstractArray)\nRegularizedLeastSquares.prox!(::Type{<:AbstractParameterizedRegularization}, ::Any, ::Any)\nRegularizedLeastSquares.norm(::AbstractParameterizedRegularization, ::AbstractArray)\nRegularizedLeastSquares.λ(::AbstractParameterizedRegularization)\nRegularizedLeastSquares.norm(::Type{<:AbstractParameterizedRegularization}, ::Any, ::Any)","category":"page"},{"location":"API/regularization/#RegularizedLeastSquares.prox!-Tuple{AbstractParameterizedRegularization, AbstractArray}","page":"Regularization Terms","title":"RegularizedLeastSquares.prox!","text":"prox!(reg::AbstractParameterizedRegularization, x)\n\nperform the proximal mapping defined by reg on x. Uses the regularization parameter defined for reg.\n\n\n\n\n\n","category":"method"},{"location":"API/regularization/#RegularizedLeastSquares.prox!-Tuple{Type{<:AbstractParameterizedRegularization}, Any, Any}","page":"Regularization Terms","title":"RegularizedLeastSquares.prox!","text":"prox!(regType::Type{<:AbstractParameterizedRegularization}, x, λ; kwargs...)\n\nconstruct a regularization term of type regType with given λ and kwargs and apply its prox! on x\n\n\n\n\n\n","category":"method"},{"location":"API/regularization/#LinearAlgebra.norm-Tuple{AbstractParameterizedRegularization, AbstractArray}","page":"Regularization Terms","title":"LinearAlgebra.norm","text":"norm(reg::AbstractParameterizedRegularization, x)\n\nreturns the value of the reg regularization term on x. Uses the regularization parameter defined for reg.\n\n\n\n\n\n","category":"method"},{"location":"API/regularization/#RegularizedLeastSquares.λ-Tuple{AbstractParameterizedRegularization}","page":"Regularization Terms","title":"RegularizedLeastSquares.λ","text":"λ(reg::AbstractParameterizedRegularization)\n\nreturn the regularization parameter λ of reg\n\n\n\n\n\n","category":"method"},{"location":"API/regularization/#LinearAlgebra.norm-Tuple{Type{<:AbstractParameterizedRegularization}, Any, Any}","page":"Regularization Terms","title":"LinearAlgebra.norm","text":"norm(regType::Type{<:AbstractParameterizedRegularization}, x, λ; kwargs...)\n\nconstruct a regularization term of type regType with given λ and kwargs and apply its norm on x\n\n\n\n\n\n","category":"method"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"EditURL = \"../../literate/howto/callbacks.jl\"","category":"page"},{"location":"generated/howto/callbacks/#Callbacks","page":"Callbacks","title":"Callbacks","text":"","category":"section"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"For certain optimization it is important to monitor the internal state of the solver. RegularizedLeastSquares.jl provides a callback mechanism to allow developres to access this state after each iteration. The package provides a variety of default callbacks, which for example store the solution after each iteration. More information can be found in the API reference for the solve! function.","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"In this example we will revist the compressed sensing compressed sensing example and implement a custom callback using the do-syntax of the solve! function. This allows us to implement our callback inline and access the solver state after each iteration.","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"We first recreate the operator A and the measurement vector b:","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"using ImagePhantoms, ImageGeoms\nN = 256\nimage = shepp_logan(N, SheppLoganToft())\nsize(image)\nusing Random, LinearOperatorCollection\nrandomIndices = shuffle(eachindex(image))\nsampledIndices = sort(randomIndices[1:div(end, 3)])\nA = SamplingOp(eltype(image), pattern = sampledIndices , shape = size(image));\nb = A*vec(image);\nnothing #hide","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"Next we prepare our visualization helper function:","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"using CairoMakie\nfunction plot_image(figPos, img; title = \"\", width = 150, height = 150, clim = extrema(img))\n ax = CairoMakie.Axis(figPos; yreversed=true, title, width, height)\n hidedecorations!(ax)\n heatmap!(ax, img, colorrange = clim)\nend","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"Now we construct the solver with the TV regularization term:","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"using RegularizedLeastSquares\nreg = TVRegularization(0.01; shape=size(image));\nsolver = createLinearSolver(FISTA, A; reg=reg, iterations=20);\nnothing #hide","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"We will now implement a callback that plots the solution every four iteration:","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"fig = Figure()\nidx = 1\nsolve!(solver, b) do solver, iteration\n if iteration % 4 == 0\n img_approx = copy(solversolution(solver))\n img_approx = reshape(img_approx, size(image))\n plot_image(fig[div(idx -1, 3) + 1, mod1(idx, 3)], img_approx, clim = extrema(image), title = \"$iteration\")\n global idx += 1\n end\nend","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"In the callback we have to copy the solution, as the solver will update it in place. As is explained in the solver section, each features fields that are intended to be immutable during a solve! call and a state that is modified in each iteration. Depending on the solvers parameters and the measurement input, the state can differ in its fields and their type. Ideally, one tries to avoid accessing the state directly and uses the provided functions to access the state.","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"The resulting figure shows the reconstructed image after 0, 4, 8, 12, 16 and 20 iterations:","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"resize_to_layout!(fig)\nfig","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"","category":"page"},{"location":"generated/howto/callbacks/","page":"Callbacks","title":"Callbacks","text":"This page was generated using Literate.jl.","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"EditURL = \"../../literate/howto/normal_operator.jl\"","category":"page"},{"location":"generated/howto/normal_operator/#Normal-Operator","page":"Normal Operator","title":"Normal Operator","text":"","category":"section"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"Many solvers in RegularizedLeastSquares.jl are based on the normal operator mathbfA^*mathbfA of the linear operator mathbfA.","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"Solvers such as ADMM, FISTA and POGM generally solve optimization problems of the form:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"beginequation\n undersetmathbfxargmin mathbff(x)+ mathbfR(x)\nendequation","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"and require the gradient of the function mathbff(x). In this package we specialise the function mathbff(x) to the least squares norm:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"beginequation\n mathbff(x) = frac12vertvert mathbfAmathbfx-mathbfb vertvert^2_2\nendequation","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"The gradient of this function is:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"beginequation\n nabla mathbff(x) = mathbfA^*(mathbfAmathbfx-mathbfb) = mathbfA^*mathbfAx - mathbfA^*mathbfb\nendequation","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"Similarily, the conjugate gradient normal residual (CGNR) algorithm applies conjugate gradient algorithm to:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"beginequation\n mathbfA^*mathbfAmathbfx = mathbfA^*mathbfb\nendequation","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"The normal operator can be passed directly to these solvers, otherwise it is computed internally.","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"using RegularizedLeastSquares\nA = randn(32, 16)\nx = randn(16)\nb = A*x\n\nsolver = createLinearSolver(CGNR, A; AHA = adjoint(A) * A, reg = L2Regularization(0.0001), iterations=32);\nx_approx = solve!(solver, b)","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"The normal operator can also be computed using the normalOperator function from LinearOperatorCollection.jl. This is useful if the normal operator is not directly available or shouldn't be stored in memory. This function is opinionated and attempts to optimize the resulting operator for iterative applications. Specifying a custom method for a custom operator allows one to control this optimization.","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"An example of such an optimization is a matrix-free weighting of mathbfA as shown in the Weighting example:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"using LinearOperatorCollection\nweights = rand(32)\nWA = ProdOp(WeightingOp(weights), A)\nAHA = LinearOperatorCollection.normalOperator(WA)","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"Without an optimization a matrix-free product would apply the following operator each iteration:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"beginequation\n (mathbfWA)^*mathbfWA = mathbfA^*mathbfW^*mathbfWmathbfA\nendequation","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"This is not efficient and instead the normal operator can be optimized by initially computing the weights:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"beginequation\n tildemathbfW = mathbfW^*mathbfW\nendequation","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"and then applying the following each iteration:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"beginequation\n mathbfA^*tildemathbfWmathbfA\nendequation","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"The optimized normal operator can then be passed to the solver:","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"solver = createLinearSolver(CGNR, WA; AHA = AHA, reg = L2Regularization(0.0001), iterations=32);\nx_approx2 = solve!(solver, weights .* b)","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"Of course it is also possible to optimize a normal operator with other means and pass it to the solver via the AHA keyword argument.","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"It is also possible to only supply the normal operator to these solvers, however on then needs to supply mathbfA^*b intead of mathbfb.","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"","category":"page"},{"location":"generated/howto/normal_operator/","page":"Normal Operator","title":"Normal Operator","text":"This page was generated using Literate.jl.","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"EditURL = \"../../literate/howto/plug-and-play.jl\"","category":"page"},{"location":"generated/howto/plug-and-play/#Plug-and-Play-Regularization","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"","category":"section"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"A group of regularization terms that can not be directly written down as function are learned plug-and-play (PnP) priors. These are terms based on deep neural networks, which are trainted to implement the proximal map corresponding to the regularization term. Such a PnP prior can be used in the same way as any other regularization term.","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"The following example shows how to use a PnP prior in the context of the Kaczmarz solver.","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"using RegularizedLeastSquares\nA = randn(32, 16)\nx = randn(16)\nb = A*x;\nnothing #hide","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"For the documentation we will just use the identity function as a placeholder for the PnP prior.","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"model = identity","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"In practice, you would replace this with a neural network:","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"using Flux\nmodel = Flux.loadmodel!(model, ...)","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"The model can then be used together with the PnPRegularization term:","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"reg = PnPRegularization(1.0; model = model, shape = [16]);\nnothing #hide","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"Since models often expect a specific input range, we can use the MinMaxTransform to normalize the input:","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"reg = PnPRegularization(1.0; model = model, shape = [16], input_transform = RegularizedLeastSquares.MinMaxTransform);\nnothing #hide","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"Custom input transforms can be implemented by passing something callable as the input_transform keyword argument. For more details see the PnPRegularization documentation.","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"The regularization term can then be used in the solver:","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"solver = createLinearSolver(Kaczmarz, A; reg = reg, iterations = 32)\nx_approx = solve!(solver, b)","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"","category":"page"},{"location":"generated/howto/plug-and-play/","page":"Plug-and-Play Regularization","title":"Plug-and-Play Regularization","text":"This page was generated using Literate.jl.","category":"page"},{"location":"API/solvers/#API-for-Solvers","page":"Solvers","title":"API for Solvers","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"This page contains documentation of the public API of the RegularizedLeastSquares. In the Julia REPL one can access this documentation by entering the help mode with ?","category":"page"},{"location":"API/solvers/#solve!","page":"Solvers","title":"solve!","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.solve!(::AbstractLinearSolver, ::Any)\nRegularizedLeastSquares.init!(::AbstractLinearSolver, ::Any)\nRegularizedLeastSquares.init!(::AbstractLinearSolver, ::AbstractSolverState, ::AbstractMatrix)\n","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.solve!-Tuple{AbstractLinearSolver, Any}","page":"Solvers","title":"RegularizedLeastSquares.solve!","text":"solve!(solver::AbstractLinearSolver, b; x0 = 0, callbacks = (_, _) -> nothing)\n\nSolves an inverse problem for the data vector b using solver.\n\nRequired Arguments\n\nsolver::AbstractLinearSolver - linear solver (e.g., ADMM or FISTA), containing forward/normal operator and regularizer\nb::AbstractVector - data vector if A was supplied to the solver, back-projection of the data otherwise\n\nOptional Keyword Arguments\n\nx0::AbstractVector - initial guess for the solution; default is zero\ncallbacks - (optionally a vector of) function or callable struct that takes the two arguments callback(solver, iteration) and, e.g., stores, prints, or plots the intermediate solutions or convergence parameters. Be sure not to modify solver or iteration in the callback function as this would japaridze convergence. The default does nothing.\n\nExamples\n\nThe optimization problem\n\n\targmin_x Ax - b_2^2 + λ x_1\n\ncan be solved with the following lines of code:\n\njulia> using RegularizedLeastSquares\n\njulia> A = [0.831658 0.96717\n 0.383056 0.39043\n 0.820692 0.08118];\n\njulia> x = [0.5932234523399985; 0.2697534345340015];\n\njulia> b = A * x;\n\njulia> S = ADMM(A, reg = L1Regularization(0.0001));\n\njulia> x_approx = solve!(S, b)\n2-element Vector{Float64}:\n 0.5932171509222105\n 0.26971370566079866\n\nHere, we use L1Regularization. All regularization options can be found in API for Regularizers.\n\nThe following example solves the same problem, but stores the solution x of each interation in tr:\n\njulia> tr = Dict[]\nDict[]\n\njulia> store_trace!(tr, solver, iteration) = push!(tr, Dict(\"iteration\" => iteration, \"x\" => solver.x, \"beta\" => solver.β))\nstore_trace! (generic function with 1 method)\n\njulia> x_approx = solve!(S, b; callbacks=(solver, iteration) -> store_trace!(tr, solver, iteration))\n2-element Vector{Float64}:\n 0.5932234523399984\n 0.26975343453400163\n\njulia> tr[3]\nDict{String, Any} with 3 entries:\n \"iteration\" => 2\n \"x\" => [0.593223, 0.269753]\n \"beta\" => [1.23152, 0.927611]\n\nThe last example show demonstrates how to plot the solution at every 10th iteration and store the solvers convergence metrics:\n\njulia> using Plots\n\njulia> conv = StoreConvergenceCallback()\n\njulia> function plot_trace(solver, iteration)\n if iteration % 10 == 0\n display(scatter(solver.x))\n end\n end\nplot_trace (generic function with 1 method)\n\njulia> x_approx = solve!(S, b; callbacks = [conv, plot_trace]);\n\nThe keyword callbacks allows you to pass a (vector of) callable objects that takes the arguments solver and iteration and prints, stores, or plots intermediate result.\n\nSee also StoreSolutionCallback, StoreConvergenceCallback, CompareSolutionCallback for a number of provided callback options.\n\n\n\n\n\n","category":"method"},{"location":"API/solvers/#RegularizedLeastSquares.init!-Tuple{AbstractLinearSolver, Any}","page":"Solvers","title":"RegularizedLeastSquares.init!","text":"init!(solver::AbstractLinearSolver, b; kwargs...)\n\nPrepare the solver for iteration based on the given data vector b and kwargs.\n\n\n\n\n\n","category":"method"},{"location":"API/solvers/#RegularizedLeastSquares.init!-Tuple{AbstractLinearSolver, AbstractSolverState, AbstractMatrix}","page":"Solvers","title":"RegularizedLeastSquares.init!","text":"init!(solver::AbstractLinearSolver, state::AbstractSolverState, b::AbstractMatrix; scheduler = SequentialState, kwargs...)\n\nInitialize the solver with each column of b and pass the corresponding states to the scheduler.\n\n\n\n\n\n","category":"method"},{"location":"API/solvers/#ADMM","page":"Solvers","title":"ADMM","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.ADMM","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.ADMM","page":"Solvers","title":"RegularizedLeastSquares.ADMM","text":"ADMM(A; AHA = A'*A, precon = Identity(), reg = L1Regularization(zero(real(eltype(AHA)))), regTrafo = opEye(eltype(AHA), size(AHA,1)), normalizeReg = NoNormalization(), rho = 1e-1, vary_rho = :none, iterations = 10, iterationsCG = 10, absTol = eps(real(eltype(AHA))), relTol = eps(real(eltype(AHA))), tolInner = 1e-5, verbose = false)\nADMM( ; AHA = , precon = Identity(), reg = L1Regularization(zero(real(eltype(AHA)))), regTrafo = opEye(eltype(AHA), size(AHA,1)), normalizeReg = NoNormalization(), rho = 1e-1, vary_rho = :none, iterations = 10, iterationsCG = 10, absTol = eps(real(eltype(AHA))), relTol = eps(real(eltype(AHA))), tolInner = 1e-5, verbose = false)\n\nCreates an ADMM object for the forward operator A or normal operator AHA.\n\nRequired Arguments\n\nA - forward operator\n\nOR\n\nAHA - normal operator (as a keyword argument)\n\nOptional Keyword Arguments\n\nAHA - normal operator is optional if A is supplied\nprecon - preconditionner for the internal CG algorithm\nreg::AbstractParameterizedRegularization - regularization term; can also be a vector of regularization terms\nregTrafo - transformation to a space in which reg is applied; if reg is a vector, regTrafo has to be a vector of the same length. Use opEye(eltype(AHA), size(AHA,1)) if no transformation is desired.\nnormalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()\nrho::Real - penalty of the augmented Lagrangian\nvary_rho::Symbol - vary rho to balance primal and dual feasibility; options :none, :balance, :PnP\niterations::Int - maximum number of (outer) ADMM iterations\niterationsCG::Int - maximum number of (inner) CG iterations\nabsTol::Real - absolute tolerance for stopping criterion\nrelTol::Real - relative tolerance for stopping criterion\ntolInner::Real - relative tolerance for CG stopping criterion\nverbose::Bool - print residual in each iteration\n\nADMM differs from ISTA-type algorithms in the sense that the proximal operation is applied separately from the transformation to the space in which the penalty is applied. This is reflected by the interface which has reg and regTrafo as separate arguments. E.g., for a TV penalty, you should NOT set reg=TVRegularization, but instead use reg=L1Regularization(λ), regTrafo=RegularizedLeastSquares.GradientOp(Float64; shape=(Nx,Ny,Nz)).\n\nSee also createLinearSolver, solve!.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#CGNR","page":"Solvers","title":"CGNR","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.CGNR","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.CGNR","page":"Solvers","title":"RegularizedLeastSquares.CGNR","text":"CGNR(A; AHA = A' * A, reg = L2Regularization(zero(real(eltype(AHA)))), normalizeReg = NoNormalization(), iterations = 10, relTol = eps(real(eltype(AHA))))\nCGNR( ; AHA = , reg = L2Regularization(zero(real(eltype(AHA)))), normalizeReg = NoNormalization(), iterations = 10, relTol = eps(real(eltype(AHA))))\n\ncreates an CGNR object for the forward operator A or normal operator AHA.\n\nRequired Arguments\n\nA - forward operator\n\nOR\n\nAHA - normal operator (as a keyword argument)\n\nOptional Keyword Arguments\n\nAHA - normal operator is optional if A is supplied\nreg::AbstractParameterizedRegularization - regularization term; can also be a vector of regularization terms\nnormalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()\niterations::Int - maximum number of iterations\nrelTol::Real - tolerance for stopping criterion\n\nSee also createLinearSolver, solve!.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#Kaczmarz","page":"Solvers","title":"Kaczmarz","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.Kaczmarz","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.Kaczmarz","page":"Solvers","title":"RegularizedLeastSquares.Kaczmarz","text":"Kaczmarz(A; reg = L2Regularization(0), normalizeReg = NoNormalization(), randomized=false, subMatrixFraction=0.15, shuffleRows=false, seed=1234, iterations=10)\n\nCreates a Kaczmarz object for the forward operator A.\n\nRequired Arguments\n\nA - forward operator\n\nOptional Keyword Arguments\n\nreg::AbstractParameterizedRegularization - regularization term\nnormalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()\nrandomized::Bool - randomize Kacmarz algorithm\nsubMatrixFraction::Real - fraction of rows used in randomized Kaczmarz algorithm\nshuffleRows::Bool - randomize Kacmarz algorithm\nseed::Int - seed for randomized algorithm\niterations::Int - number of iterations\n\nSee also createLinearSolver, solve!.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#FISTA","page":"Solvers","title":"FISTA","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.FISTA","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.FISTA","page":"Solvers","title":"RegularizedLeastSquares.FISTA","text":"FISTA(A; AHA=A'*A, reg=L1Regularization(zero(real(eltype(AHA)))), normalizeReg=NoNormalization(), iterations=50, verbose = false, rho = 0.95 / power_iterations(AHA), theta=1, relTol=eps(real(eltype(AHA))), restart = :none)\nFISTA( ; AHA=, reg=L1Regularization(zero(real(eltype(AHA)))), normalizeReg=NoNormalization(), iterations=50, verbose = false, rho = 0.95 / power_iterations(AHA), theta=1, relTol=eps(real(eltype(AHA))), restart = :none)\n\ncreates a FISTA object for the forward operator A or normal operator AHA.\n\nRequired Arguments\n\nA - forward operator\n\nOR\n\nAHA - normal operator (as a keyword argument)\n\nOptional Keyword Arguments\n\nAHA - normal operator is optional if A is supplied\nprecon - preconditionner for the internal CG algorithm\nreg::AbstractParameterizedRegularization - regularization term; can also be a vector of regularization terms\nnormalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()\nrho::Real - step size for gradient step; the default is 0.95 / max_eigenvalue as determined with power iterations.\ntheta::Real - parameter for predictor-corrector step\nrelTol::Real - tolerance for stopping criterion\niterations::Int - maximum number of iterations\nrestart::Symbol - :none, :gradient options for restarting\nverbose::Bool - print residual in each iteration\n\nSee also createLinearSolver, solve!.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#OptISTA","page":"Solvers","title":"OptISTA","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.OptISTA","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.OptISTA","page":"Solvers","title":"RegularizedLeastSquares.OptISTA","text":"OptISTA(A; AHA=A'*A, reg=L1Regularization(zero(real(eltype(AHA)))), normalizeReg=NoNormalization(), iterations=50, verbose = false, rho=0.95 / power_iterations(AHA), theta=1, relTol=eps(real(eltype(AHA))))\nOptISTA( ; AHA=, reg=L1Regularization(zero(real(eltype(AHA)))), normalizeReg=NoNormalization(), iterations=50, verbose = false, rho=0.95 / power_iterations(AHA), theta=1, relTol=eps(real(eltype(AHA))))\n\ncreates a OptISTA object for the forward operator A or normal operator AHA. OptISTA has a 2x better worst-case bound than FISTA, but actual performance varies by application. It stores 2 extra intermediate variables the size of the image compared to FISTA.\n\nReference:\n\nUijeong Jang, Shuvomoy Das Gupta, Ernest K. Ryu, \"Computer-Assisted Design of Accelerated Composite Optimization Methods: OptISTA,\" arXiv:2305.15704, 2023, [https://arxiv.org/abs/2305.15704]\n\nRequired Arguments\n\nA - forward operator\n\nOR\n\nAHA - normal operator (as a keyword argument)\n\nOptional Keyword Arguments\n\nAHA - normal operator is optional if A is supplied\nreg::AbstractParameterizedRegularization - regularization term\nnormalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()\nrho::Real - step size for gradient step; the default is 0.95 / max_eigenvalue as determined with power iterations.\ntheta::Real - parameter for predictor-corrector step\nrelTol::Real - tolerance for stopping criterion\niterations::Int - maximum number of iterations\nverbose::Bool - print residual in each iteration\n\nSee also createLinearSolver, solve!.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#POGM","page":"Solvers","title":"POGM","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.POGM","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.POGM","page":"Solvers","title":"RegularizedLeastSquares.POGM","text":"POGM(A; AHA = A'*A, reg = L1Regularization(zero(real(eltype(AHA)))), normalizeReg = NoNormalization(), iterations = 50, verbose = false, rho = 0.95 / power_iterations(AHA), theta = 1, sigma_fac = 1, relTol = eps(real(eltype(AHA))), restart = :none)\nPOGM( ; AHA = , reg = L1Regularization(zero(real(eltype(AHA)))), normalizeReg = NoNormalization(), iterations = 50, verbose = false, rho = 0.95 / power_iterations(AHA), theta = 1, sigma_fac = 1, relTol = eps(real(eltype(AHA))), restart = :none)\n\nCreates a POGM object for the forward operator A or normal operator AHA. POGM has a 2x better worst-case bound than FISTA, but actual performance varies by application. It stores 3 extra intermediate variables the size of the image compared to FISTA. Only gradient restart scheme is implemented for now.\n\nReferences:\n\nA.B. Taylor, J.M. Hendrickx, F. Glineur, \"Exact worst-case performance of first-order algorithms for composite convex optimization,\" Arxiv:1512.07516, 2015, SIAM J. Opt. 2017 [http://doi.org/10.1137/16m108104x]\nKim, D., & Fessler, J. A. (2018). Adaptive Restart of the Optimized Gradient Method for Convex Optimization. Journal of Optimization Theory and Applications, 178(1), 240–263. [https://doi.org/10.1007/s10957-018-1287-4]\nRequired Arguments\nA - forward operator\nOR\nAHA - normal operator (as a keyword argument)\nOptional Keyword Arguments\nAHA - normal operator is optional if A is supplied\nreg::AbstractParameterizedRegularization - regularization term\nnormalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()\nrho::Real - step size for gradient step; the default is 0.95 / max_eigenvalue as determined with power iterations.\ntheta::Real - parameter for predictor-corrector step\nsigma_fac::Real - parameter for decreasing γ-momentum ∈ [0,1]\nrelTol::Real - tolerance for stopping criterion\niterations::Int - maximum number of iterations\nrestart::Symbol - :none, :gradient options for restarting\nverbose::Bool - print residual in each iteration\n\nSee also createLinearSolver, solve!.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#SplitBregman","page":"Solvers","title":"SplitBregman","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.SplitBregman","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.SplitBregman","page":"Solvers","title":"RegularizedLeastSquares.SplitBregman","text":"SplitBregman(A; AHA = A'*A, precon = Identity(), reg = L1Regularization(zero(real(eltype(AHA)))), regTrafo = opEye(eltype(AHA), size(AHA,1)), normalizeReg = NoNormalization(), rho = 1e-1, iterations = 10, iterationsInner = 10, iterationsCG = 10, absTol = eps(real(eltype(AHA))), relTol = eps(real(eltype(AHA))), tolInner = 1e-5, verbose = false)\nSplitBregman( ; AHA = , precon = Identity(), reg = L1Regularization(zero(real(eltype(AHA)))), regTrafo = opEye(eltype(AHA), size(AHA,1)), normalizeReg = NoNormalization(), rho = 1e-1, iterations = 10, iterationsInner = 10, iterationsCG = 10, absTol = eps(real(eltype(AHA))), relTol = eps(real(eltype(AHA))), tolInner = 1e-5, verbose = false)\n\nCreates a SplitBregman object for the forward operator A or normal operator AHA.\n\nRequired Arguments\n\nA - forward operator\n\nOR\n\nAHA - normal operator (as a keyword argument)\n\nOptional Keyword Arguments\n\nAHA - normal operator is optional if A is supplied\nprecon - preconditionner for the internal CG algorithm\nreg::AbstractParameterizedRegularization - regularization term; can also be a vector of regularization terms\nregTrafo - transformation to a space in which reg is applied; if reg is a vector, regTrafo has to be a vector of the same length. Use opEye(eltype(AHA), size(AHA,1)) if no transformation is desired.\nnormalizeReg::AbstractRegularizationNormalization - regularization normalization scheme; options are NoNormalization(), MeasurementBasedNormalization(), SystemMatrixBasedNormalization()\nrho::Real - weights for condition on regularized variables; can also be a vector for multiple regularization terms\niterations::Int - maximum number of outer iterations. Set to 1 for unconstraint split Bregman (equivalent to ADMM)\niterationsInner::Int - maximum number of inner iterations\niterationsCG::Int - maximum number of (inner) CG iterations\nabsTol::Real - absolute tolerance for stopping criterion\nrelTol::Real - relative tolerance for stopping criterion\ntolInner::Real - relative tolerance for CG stopping criterion\nverbose::Bool - print residual in each iteration\n\nThis algorithm solves the constraint problem (Eq. (4.7) in Tom Goldstein and Stanley Osher), i.e. ||R(x)||₁ such that ||Ax -b||₂² < σ². In order to solve the unconstraint problem (Eq. (4.8) in Tom Goldstein and Stanley Osher), i.e. ||Ax -b||₂² + λ ||R(x)||₁, you can either set iterations=1 or use ADMM instead, which is equivalent (iterations=1 in SplitBregman in implied in ADMM and the SplitBregman variable iterationsInner is simply called iterations in ADMM)\n\nLike ADMM, SplitBregman differs from ISTA-type algorithms in the sense that the proximal operation is applied separately from the transformation to the space in which the penalty is applied. This is reflected by the interface which has reg and regTrafo as separate arguments. E.g., for a TV penalty, you should NOT set reg=TVRegularization, but instead use reg=L1Regularization(λ), regTrafo=RegularizedLeastSquares.GradientOp(Float64; shape=(Nx,Ny,Nz)).\n\nSee also createLinearSolver, solve!.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#Miscellaneous","page":"Solvers","title":"Miscellaneous","text":"","category":"section"},{"location":"API/solvers/","page":"Solvers","title":"Solvers","text":"RegularizedLeastSquares.solverstate\nRegularizedLeastSquares.solversolution\nRegularizedLeastSquares.solverconvergence\nRegularizedLeastSquares.StoreSolutionCallback\nRegularizedLeastSquares.StoreConvergenceCallback\nRegularizedLeastSquares.CompareSolutionCallback\nRegularizedLeastSquares.linearSolverList\nRegularizedLeastSquares.createLinearSolver\nRegularizedLeastSquares.applicableSolverList\nRegularizedLeastSquares.isapplicable","category":"page"},{"location":"API/solvers/#RegularizedLeastSquares.solverstate","page":"Solvers","title":"RegularizedLeastSquares.solverstate","text":"solverstate(solver::AbstractLinearSolver)\n\nReturn the current state of the solver\n\n\n\n\n\n","category":"function"},{"location":"API/solvers/#RegularizedLeastSquares.solversolution","page":"Solvers","title":"RegularizedLeastSquares.solversolution","text":"solversolution(solver::AbstractLinearSolver)\n\nReturn the current solution of the solver\n\n\n\n\n\nsolversolution(state::AbstractSolverState)\n\nReturn the current solution of the solver's state\n\n\n\n\n\n","category":"function"},{"location":"API/solvers/#RegularizedLeastSquares.solverconvergence","page":"Solvers","title":"RegularizedLeastSquares.solverconvergence","text":"solverconvergence(solver::AbstractLinearSolver)\n\nReturn a named tuple of the solvers current convergence metrics\n\n\n\n\n\n","category":"function"},{"location":"API/solvers/#RegularizedLeastSquares.StoreSolutionCallback","page":"Solvers","title":"RegularizedLeastSquares.StoreSolutionCallback","text":"StoreSolutionCallback(T)\n\nCallback that accumlates the solvers solution per iteration. Results are stored in the solutions field.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#RegularizedLeastSquares.StoreConvergenceCallback","page":"Solvers","title":"RegularizedLeastSquares.StoreConvergenceCallback","text":"StoreConvergenceCallback()\n\nCallback that accumlates the solvers convergence metrics per iteration. Results are stored in the convMeas field.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#RegularizedLeastSquares.CompareSolutionCallback","page":"Solvers","title":"RegularizedLeastSquares.CompareSolutionCallback","text":"CompareSolutionCallback(ref, cmp)\n\nCallback that compares the solvers current solution with the given reference via cmp(ref, solution) per iteration. Results are stored in the results field.\n\n\n\n\n\n","category":"type"},{"location":"API/solvers/#RegularizedLeastSquares.linearSolverList","page":"Solvers","title":"RegularizedLeastSquares.linearSolverList","text":"Return a list of all available linear solvers\n\n\n\n\n\n","category":"function"},{"location":"API/solvers/#RegularizedLeastSquares.createLinearSolver","page":"Solvers","title":"RegularizedLeastSquares.createLinearSolver","text":"createLinearSolver(solver::AbstractLinearSolver, A; kargs...)\n\nThis method creates a solver. The supported solvers are methods typically used for solving regularized linear systems. All solvers return an approximate solution to Ax = b.\n\nTODO: give a hint what solvers are available\n\n\n\n\n\n","category":"function"},{"location":"API/solvers/#RegularizedLeastSquares.applicableSolverList","page":"Solvers","title":"RegularizedLeastSquares.applicableSolverList","text":"applicable(args...)\n\nlist all solvers that are applicable to the given arguments. Arguments are the same as for isapplicable without the solver type.\n\nSee also isapplicable, linearSolverList.\n\n\n\n\n\n","category":"function"},{"location":"API/solvers/#RegularizedLeastSquares.isapplicable","page":"Solvers","title":"RegularizedLeastSquares.isapplicable","text":"isapplicable(solverType::Type{<:AbstractLinearSolver}, A, x, reg)\n\nreturn true if a solver of type solverType is applicable to system matrix A, data x and regularization terms reg.\n\n\n\n\n\n","category":"function"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"EditURL = \"../../literate/howto/gpu_acceleration.jl\"","category":"page"},{"location":"generated/howto/gpu_acceleration/#GPU-Acceleration","page":"GPU Acceleration","title":"GPU Acceleration","text":"","category":"section"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"RegularizedLeastSquares.jl supports generic GPU acceleration. This means that the user can use any GPU array type that supports the GPUArrays interface. This includes CUDA.jl, AMDGPU.jl, and Metal.jl. In this example we will use the package JLArrays.jl which provides a reference implementation for GPUArrays, that can runs on CPUs.","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"using JLArrays\ngpu = JLArray;\nnothing #hide","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"To use the following examples on an actual GPU, load the appropraite package replace JLArray with the respective GPU array type, for example:","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"using CUDA\ngpu = CuArray","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"At first we will look at an example of dense GPU arrays.","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"using RegularizedLeastSquares\nA = gpu(rand(Float32, 32, 16))\nx = gpu(rand(Float32, 16))\nb = A*x;\nnothing #hide","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"Solvers adapt their states based on the type of the given measurement vector. This means that the solver will automatically switch to GPU acceleration if a GPU array is passed as the measurement vector.","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"solver = createLinearSolver(CGNR, A; reg = L2Regularization(0.0001), iterations=32);\nx_approx = solve!(solver, b)","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"This adaption does not include the operator. So if we want to compare with CPU result, we need to construct a new solver with a CPU operator.","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"solver = createLinearSolver(CGNR, Array(A); reg = L2Regularization(0.0001), iterations=32);\nx_cpu = solve!(solver, Array(b))\nisapprox(Array(x_approx), x_cpu)","category":"page"},{"location":"generated/howto/gpu_acceleration/#Matrix-Free-Operators","page":"GPU Acceleration","title":"Matrix-Free Operators","text":"","category":"section"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"A special case is the usage of matrix-free operators. Since these operators do not have a concrete matrix representation, their GPU support depends on their implementation. Since not all multiplications within a solver approximation are in-place, the operator also needs to support the * operation and construct an appropriate result vector. For matrix-free operators based on LinearOperators.jl, this can be achieved by implementing the LinearOperators.storage_type method.","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"In the following, we will take another look at the CS example and execute it on the GPU. Note that for the JLArray example we chose a small phantom, since the JLArray implementation is not optimized for performance:","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"using ImagePhantoms, ImageGeoms\nN = 32\nimage = shepp_logan(N, SheppLoganToft())\n\nusing Random, LinearOperatorCollection\nrandomIndices = shuffle(eachindex(image))\nsampledIndices = sort(randomIndices[1:div(end, 3)]);\nnothing #hide","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"To construct the operator, we need to convert the indices to a GPU array. We also need to specify the correct storage type. In both LinearOperators.jl and LinearOperatorCollection.jl this is done with the S keyword argument.","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"gpu_indices = gpu(sampledIndices)\nA = SamplingOp(eltype(image), pattern = gpu_indices, shape = size(image), S = typeof(b));\nnothing #hide","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"Let's inspect the storage type of the operator:","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"using LinearOperatorCollection.LinearOperators\nLinearOperators.storage_type(A)","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"Afterwards we can use the operator as usual:","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"b = A*vec(gpu(image));\nnothing #hide","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"And use it in the solver:","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"using RegularizedLeastSquares\nreg = TVRegularization(0.01; shape=size(image))\nsolver = createLinearSolver(FISTA, A; reg=reg, iterations=20)\nimg_approx = solve!(solver,b);\nnothing #hide","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"To visualize the reconstructed image, we need to reshape the result vector to the correct shape and convert it to a CPU array:","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"img_approx = reshape(Array(img_approx),size(image))","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"We will again use CairoMakie for visualization:","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"using CairoMakie\nfunction plot_image(figPos, img; title = \"\", width = 150, height = 150)\n ax = CairoMakie.Axis(figPos; yreversed=true, title, width, height)\n hidedecorations!(ax)\n heatmap!(ax, img)\nend\nfig = Figure()\nplot_image(fig[1,1], image, title = \"Image\")\nsamplingMask = fill(false, size(image))\nsamplingMask[sampledIndices] .= true\nplot_image(fig[1,2], image .* samplingMask, title = \"Sampled Image\")\nplot_image(fig[1,3], img_approx, title = \"Reconstructed Image\")\nresize_to_layout!(fig)\nfig","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"","category":"page"},{"location":"generated/howto/gpu_acceleration/","page":"GPU Acceleration","title":"GPU Acceleration","text":"This page was generated using Literate.jl.","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"EditURL = \"../../literate/examples/compressed_sensing.jl\"","category":"page"},{"location":"generated/examples/compressed_sensing/#Compressed-Sensing-Example","page":"Compressed Sensing","title":"Compressed Sensing Example","text":"","category":"section"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"In this example we will go through a simple example from the field of Compressed Sensing. In addtion to RegularizedLeastSquares.jl, we will need the packages LinearOperatorCollection.jl, ImagePhantoms.jl, ImageGeoms.jl and Random.jl, as well as CairoMakie.jl for visualization. We can install them the same way we did RegularizedLeastSquares.jl.","category":"page"},{"location":"generated/examples/compressed_sensing/#Preparing-the-Inverse-Problem","page":"Compressed Sensing","title":"Preparing the Inverse Problem","text":"","category":"section"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"To get started, let us generate a simple phantom using the ImagePhantoms and ImageGeom packages:","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"using ImagePhantoms, ImageGeoms\nN = 256\nimage = shepp_logan(N, SheppLoganToft())\nsize(image)","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"This produces a 256x256 image of a Shepp-Logan phantom.","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"In this example, we consider a problem in which we randomly sample a third of the pixels in the image. Such a problem and the corresponding measurement can be constructed with the packages LinearOperatorCollection and Random:","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"We first randomly shuffle the indices of the image and then select the first third of the indices to sample.","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"using Random, LinearOperatorCollection\nrandomIndices = shuffle(eachindex(image))\nsampledIndices = sort(randomIndices[1:div(end, 3)])","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"Afterwards we build a sampling operator which samples the image at the selected indices.","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"A = SamplingOp(eltype(image), pattern = sampledIndices , shape = size(image));\nnothing #hide","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"Then we apply the sampling operator to the vectorized image to obtain the sampled measurement vector","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"b = A*vec(image);\nnothing #hide","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"To visualize our image we can use CairoMakie:","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"using CairoMakie\nfunction plot_image(figPos, img; title = \"\", width = 150, height = 150)\n ax = CairoMakie.Axis(figPos; yreversed=true, title, width, height)\n hidedecorations!(ax)\n heatmap!(ax, img)\nend\nfig = Figure()\nplot_image(fig[1,1], image, title = \"Image\")\nsamplingMask = fill(false, size(image))\nsamplingMask[sampledIndices] .= true\nplot_image(fig[1,2], image .* samplingMask, title = \"Sampled Image\")\nresize_to_layout!(fig)\nfig","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"As we can see in the right image, only a third of the pixels are sampled. The goal of the inverse problem is to recover the original image from this measurement vector.","category":"page"},{"location":"generated/examples/compressed_sensing/#Solving-the-Inverse-Problem","page":"Compressed Sensing","title":"Solving the Inverse Problem","text":"","category":"section"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"To recover the image from the measurement vector, we solve the TV-regularized least squares problem:","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"beginequation\n undersetmathbfxargmin frac12vertvert mathbfAmathbfx-mathbfb vertvert_2^2 + lambdavertvertmathbfxvertvert_textTV \nendequation","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"For this purpose we build a TV regularizer with regularization parameter λ=001","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"using RegularizedLeastSquares\nreg = TVRegularization(0.01; shape=size(image));\nnothing #hide","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"We will use the Fast Iterative Shrinkage-Thresholding Algorithm (FISTA) to solve our inverse problem. Thus, we build the corresponding solver","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"solver = createLinearSolver(FISTA, A; reg=reg, iterations=20);\nnothing #hide","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"and apply it to our measurement vector","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"img_approx = solve!(solver,b)","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"To visualize the reconstructed image, we need to reshape the result vector to the correct shape. Afterwards we can use CairoMakie again:","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"img_approx = reshape(img_approx,size(image));\nplot_image(fig[1,3], img_approx, title = \"Reconstructed Image\")\nresize_to_layout!(fig)\nfig","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"","category":"page"},{"location":"generated/examples/compressed_sensing/","page":"Compressed Sensing","title":"Compressed Sensing","text":"This page was generated using Literate.jl.","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"EditURL = \"../../literate/examples/getting_started.jl\"","category":"page"},{"location":"generated/examples/getting_started/#Getting-Started","page":"Getting Started","title":"Getting Started","text":"","category":"section"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"In this example we will go through a simple random inverse problem to get familiar with RegularizedLeastSquares.jl.","category":"page"},{"location":"generated/examples/getting_started/#Installation","page":"Getting Started","title":"Installation","text":"","category":"section"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"To install RegularizedLeastSquares.jl, you can use the Julia package manager. Open a Julia REPL and run the following command:","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"using Pkg\nPkg.add(\"RegularizedLeastSquares\")","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"This will download and install the RegularizedLeastSquares.jl package and its dependencies. To install a different version, please consult the Pkg documentation.","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"Once the installation is complete, you can import the package with the using keyword:","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"using RegularizedLeastSquares","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"RegularizedLeastSquares aims to solve inverse problems of the form:","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"beginequation\n undersetmathbfxargmin frac12vertvert mathbfAmathbfx-mathbfb vertvert_2^2 + mathbfR(x) \nendequation","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"where mathbfA is a linear operator, mathbfb is the measurement vector, and mathbfR(x) is an (optional) regularization term. The goal is to retrieve an approximation of the unknown vector mathbfx. In this first exampel we will just work with simple random arrays. For more advanced examples, please refer to the examples.","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"A = rand(32, 16)\nx = rand(16)\nb = A*x;\nnothing #hide","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"To approximate x from b, we can use the Conjugate Gradient Normal Residual (CGNR) algorithm. We first build the corresponding solver:","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"solver = createLinearSolver(CGNR, A; iterations=32);\nnothing #hide","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"and apply it to our measurement vector","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"x_approx = solve!(solver, b)\nisapprox(x, x_approx, rtol = 0.001)","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"Usually the inverse problems are ill-posed and require regularization. RegularizedLeastSquares.jl provides a variety of regularization terms. The CGNR algorithm can solve optimzation problems of the form:","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"beginequation\n undersetmathbfxargmin frac12vertvert mathbfAmathbfx-mathbfb vertvert_2^2 + lambdavertvertmathbfxvertvert^2_2 \nendequation","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"The corresponding solver can be built with the l^2_2-regularization term:","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"solver = createLinearSolver(CGNR, A; reg = L2Regularization(0.0001), iterations=32);\nx_approx = solve!(solver, b)\nisapprox(x, x_approx, rtol = 0.001)","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"","category":"page"},{"location":"generated/examples/getting_started/","page":"Getting Started","title":"Getting Started","text":"This page was generated using Literate.jl.","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"EditURL = \"../../literate/explanations/regularization.jl\"","category":"page"},{"location":"generated/explanations/regularization/#Regularization","page":"Regularization","title":"Regularization","text":"","category":"section"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"When formulating inverse problems, a regulariser is formulated as an additional cost function which has to be minimised. Many algorithms deal with a regularizers g, by computing the proximal map:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"beginequation\n prox_g (mathbfx) = undersetmathbfuargmin frac12vertvert mathbfu-mathbfx vert vert^2 + g(mathbfx)\nendequation","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"For many regularizers, the proximal map can be computed efficiently in a closed form.","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"In order to implement these proximal mappings, RegularizedLeastSquares.jl defines the following type hierarchy:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"abstract type AbstractRegularization\nprox!(reg::AbstractRegularization, x)\nnorm(reg::AbstractRegularization, x)","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"Here prox!(reg, x) is an in-place function which computes the proximal map on the input-vector x. The function norm computes the value of the corresponding term in the inverse problem. RegularizedLeastSquares.jl provides AbstractParameterizedRegularization and AbstractProjectionRegularization as core regularization types.","category":"page"},{"location":"generated/explanations/regularization/#Parameterized-Regularization-Terms","page":"Regularization","title":"Parameterized Regularization Terms","text":"","category":"section"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"This group of regularization terms features a regularization parameter λ that is used during the prox! and normcomputations. Examples of this regulariztion group are L1, L2 or LLR (locally low rank) regularization terms.","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"These terms are constructed by supplying a λ and optionally term specific keyword arguments:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"using RegularizedLeastSquares\nl2 = L2Regularization(0.3)","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"Parameterized regularization terms implement:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"prox!(reg::AbstractParameterizedRegularization, x, λ)\nnorm(reg::AbstractParameterizedRegularization, x, λ)","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"where λ by default is filled with the value used during construction.","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"Invoking λ on a parameterized term retrieves its regularization parameter. This can be used in a solver to scale and overwrite the parameter as follows:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"prox!(l2, [1.0])","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"param = λ(l2)\nprox!(l2, [1.0], param*0.2)","category":"page"},{"location":"generated/explanations/regularization/#Projection-Regularization-Terms","page":"Regularization","title":"Projection Regularization Terms","text":"","category":"section"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"This group of regularization terms implement projections, such as a positivity constraint or a projection with a given convex projection function. These are essentially proximal maps where g(mathbfx) is the indicator function of a convex set.","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"positive = PositiveRegularization()\nprox!(positive, [2.0, -0.2])","category":"page"},{"location":"generated/explanations/regularization/#Nested-Regularization-Terms","page":"Regularization","title":"Nested Regularization Terms","text":"","category":"section"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"Nested regularization terms are terms that act as decorators to the core regularization terms. These terms can be nested around other terms and add functionality to a regularization term, such as scaling λ based on the provided operator or applying a transform, such as the Wavelet, to x. As an example, we can nest a L1 regularization term around a Wavelet operator.","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"First we generate an image and apply a wavelet operator to it:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"using Wavelets, LinearOperatorCollection, ImagePhantoms, ImageGeoms\nN = 256\nimage = shepp_logan(N, SheppLoganToft())\nwop = WaveletOp(Float32, shape = size(image))\n\nwavelet_image = reshape(wop*vec(image), size(image))\nwavelet_image = log.(abs.(wavelet_image) .+ 0.01)","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"We will use CairoMakie for visualization:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"using CairoMakie\nfunction plot_image(figPos, img; title = \"\", width = 150, height = 150)\n ax = CairoMakie.Axis(figPos; yreversed=true, title, width, height)\n hidedecorations!(ax)\n heatmap!(ax, img)\nend\nfig = Figure()\nplot_image(fig[1,1], image, title = \"Image\")\nplot_image(fig[1,2], wavelet_image, title = \"Wavelet Image\")\nresize_to_layout!(fig)\nfig","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"To apply soft-thresholding in the wavelet domain, we can nest a L1 regularization term around the Wavelet operator:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"core = L1Regularization(0.1)\nreg = TransformedRegularization(core, wop);\nnothing #hide","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"We can then apply the proximal map to the image or the image in the wavelet domain:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"img_prox_image = prox!(core, copy(vec(image)));\nimg_prox_wavelet = prox!(reg, copy(vec(image)));\nnothing #hide","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"We can visualize the result:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"img_prox_image = reshape(img_prox_image, size(image))\nimg_prox_wavelet = reshape(img_prox_wavelet, size(image))\nplot_image(fig[1,3], img_prox_image, title = \"Reg. Image Domain\")\nplot_image(fig[1,4], img_prox_wavelet, title = \"Reg. Wavelet Domain\")\nresize_to_layout!(fig)\nfig","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"Generally, regularization terms can be nested arbitrarly deep, adding new functionality with each layer. Each nested regularization term can return its inner regularization term. Furthermore, all regularization terms implement the iteration interface to iterate over the nesting. The innermost regularization term of a nested term must be a core regularization term and it can be returned by the sink function:","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"RegularizedLeastSquares.innerreg(reg) == core","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"sink(reg) == core","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"foreach(r -> println(nameof(typeof(r))), reg)","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"","category":"page"},{"location":"generated/explanations/regularization/","page":"Regularization","title":"Regularization","text":"This page was generated using Literate.jl.","category":"page"},{"location":"#RegularizedLeastSquares.jl","page":"Home","title":"RegularizedLeastSquares.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Solvers for Linear Inverse Problems using Regularization Techniques","category":"page"},{"location":"#Introduction","page":"Home","title":"Introduction","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"RegularizedLeastSquares.jl is a Julia package for solving large linear systems using various types of algorithms. Ill-conditioned problems arise in many areas of practical interest. Regularisation techniques and nonlinear problem formulations are often used to solve these problems. This package provides implementations for a variety of solvers used in areas such as MPI and MRI. In particular, this package serves as the optimization backend of the Julia packages MPIReco.jl and MRIReco.jl.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The implemented methods range from the l^2_2-regularized CGNR method to more general optimizers such as the Alternating Direction of Multipliers Method (ADMM) or the Split-Bregman method.","category":"page"},{"location":"","page":"Home","title":"Home","text":"For convenience, implementations of popular regularizers, such as l_1-regularization and TV regularization, are provided. On the other hand, hand-crafted regularizers can be used quite easily.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Depending on the problem, it becomes unfeasible to store the full system matrix at hand. For this purpose, RegularizedLeastSquares.jl allows for the use of matrix-free operators. Such operators can be realized using the interface provided by the package LinearOperators.jl. Other interfaces can be used as well, as long as the product *(A,x) and the adjoint adjoint(A) are provided. A number of common matrix-free operators are provided by the package LinearOperatorColection.jl.","category":"page"},{"location":"#Features","page":"Home","title":"Features","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Variety of optimization algorithms optimized for least squares problems\nSupport for matrix-free operators\nGPU support","category":"page"},{"location":"#Usage","page":"Home","title":"Usage","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"See Getting Started for an introduction to using the package","category":"page"},{"location":"#See-also","page":"Home","title":"See also","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Packages:","category":"page"},{"location":"","page":"Home","title":"Home","text":"ProximalAlgorithms.jl\nProximalOperators.jl\nKrylov.jl\nRegularizedOptimization.jl","category":"page"},{"location":"","page":"Home","title":"Home","text":"Organizations:","category":"page"},{"location":"","page":"Home","title":"Home","text":"JuliaNLSolvers\nJuliaSmoothOptimizers\nJuliaFirstOrder","category":"page"}] } diff --git a/dev/solvers/index.html b/dev/solvers/index.html index 7e775c3..1ccd0fa 100644 --- a/dev/solvers/index.html +++ b/dev/solvers/index.html @@ -1,12 +1,12 @@ -Solvers · RegularizedLeastSquares.jl

Solvers

RegularizedLeastSquares.jl provides a variety of solvers, which are used in fields such as MPI and MRI. The following is a non-exhaustive list of the implemented solvers:

  • Kaczmarz algorithm (Kaczmarz, also called Algebraic reconstruction technique)
  • Conjugate Gradients Normal Residual method (CGNR)
  • Fast Iterative Shrinkage Thresholding Algorithm (FISTA)
  • Alternating Direction of Multipliers Method (ADMM)

The solvers are organized in a type-hierarchy and inherit from:

abstract type AbstractLinearSolver

The type hierarchy is further differentiated into solver categories such as AbstractRowAtionSolver, AbstractPrimalDualSolver or AbstractProximalGradientSolver. A list of all available solvers can be returned by the linearSolverList function.

Solver Construction

To create a solver, one can invoke the method createLinearSolver as in

solver = createLinearSolver(CGNR, A; reg=reg, kwargs...)

Here A denotes the operator and reg are the Regularization terms to be used by the solver. All further solver parameters can be passed as keyword arguments and are solver specific. To make things more compact, it can be usefull to collect all parameters in a Dict{Symbol,Any}. In this way, the code snippet above can be written as

params=Dict{Symbol,Any}()
+Solvers · RegularizedLeastSquares.jl

Solvers

RegularizedLeastSquares.jl provides a variety of solvers, which are used in fields such as MPI and MRI. The following gives an overview of implemented solvers and roughly which regularization terms are applicable for them:

SolverRegularization
Kaczmarz (Also called Algebraic reconstruction technique)$l_2^2$ and one additional term
Conjugate Gradients Normal Residual method (CGNR)$l_2^2$
Fast Iterative Shrinkage Thresholding Algorithm (FISTA)Any one term
Optimal Iterative Shrinkage Thresholding Algorithm (OptISTA)Any one term
Proximal Optimized Gradient Method (POGM)Any one term
Alternating Direction of Multipliers Method (ADMM)Several terms
SplitBregmanSeveral terms
DirectSolver$l_2^2$
PseudoInverse$l_2^2$

It is also possible to provide custom terms by implementing a proximal mapping. Generally, these algorithms are correct for regularization terms that are convex and possibly non-smooth. See Regularization, for more information on regularization terms.

For convenience reasons, all solvers accept projection regularization terms, such as a constraint to the positive numbers. Depending on the solver, such a term is either considered during every iteration or just in the last iteration.

A list of all available solvers can be returned by the linearSolverList function.

Solver Construction

To create a solver, one can invoke the method createLinearSolver as in

solver = createLinearSolver(CGNR, A; reg=reg, kwargs...)

Here A denotes the operator and reg are the Regularization terms to be used by the solver. All further solver parameters can be passed as keyword arguments and are solver specific. To make things more compact, it can be usefull to collect all parameters in a Dict{Symbol,Any}. In this way, the code snippet above can be written as

params=Dict{Symbol,Any}()
 params[:reg] = ...
 ...
 
 solver = createLinearSolver(CGNR, A; params...)

This notation can be convenient when a large number of parameters are set manually.

It is also possible to construct a solver directly with its specific keyword arguments:

solver = CGNR(A, reg = reg, ...)

Solver Usage

Once constructed, a solver can be used to approximate a solution to a given measurement vector:

x_approx = solve!(solver, b; kwargs...)

The keyword arguments can be used to supply an inital solution x0, one or more callbacks to interact and monitor the solvers state and more. See the How-To and the API for more information.

It is also possible to explicitly invoke the solvers iterations using Julias iterate interface:

init!(solver, b; kwargs...)
 for (iteration, x_approx) in enumerate(solver)
     println("Iteration $iteration")
-end

Solver Internals

The fields of a solver can be divided into two groups. The first group are intended to be immutable fields that do not change during iterations, the second group are mutable fields that do change. Examples of the first group are the operator itself and examples of the second group are the current solution or the number of the current iteration.

The second group is usually encapsulated in its own state struct:

mutable struct Solver{matT, ...}
+end

Solver Internals

The solvers are organized in a type-hierarchy and inherit from:

abstract type AbstractLinearSolver

The type hierarchy is further differentiated into solver categories such as AbstractRowAtionSolver, AbstractPrimalDualSolver or AbstractProximalGradientSolver.

The fields of a solver can be divided into two groups. The first group are intended to be immutable fields that do not change during iterations, the second group are mutable fields that do change. Examples of the first group are the operator itself and examples of the second group are the current solution or the number of the current iteration.

The second group is usually encapsulated in its own state struct:

mutable struct Solver{matT, ...}
   A::matT
   # Other "static" fields
   state::AbstractSolverState{<:Solver}
@@ -28,4 +28,4 @@
 
 function iterate(solver::Solver, state::VarianteState)
   # Custom iteration
-end
+end