Skip to content

Commit 90a52c9

Browse files
Implement SolverCore.reset!(solver) function (#293)
* add _reset_power_norm function * add LinearOperators.reset! to reset! quasi-Newton approximations * fix _reset_power_method to correct output * implement SolverCore.reset!(solver) functions * add condition on B before resetting
1 parent b630a18 commit 90a52c9

5 files changed

Lines changed: 34 additions & 0 deletions

File tree

src/R2DH.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@ function R2DHSolver(
8181
)
8282
end
8383

84+
function SolverCore.reset!(solver::R2DHSolver)
85+
LinearOperators.reset!(solver.D)
86+
end
87+
88+
SolverCore.reset!(solver::R2DHSolver, model) = SolverCore.reset!(solver)
89+
8490
"""
8591
R2DH(reg_nlp; kwargs…)
8692

src/R2N.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,14 @@ function R2NSolver(
9696
)
9797
end
9898

99+
function SolverCore.reset!(solver::R2NSolver)
100+
_reset_power_method!(solver.v0)
101+
B = solver.subpb.model.B
102+
isa(B, AbstractLinearOperator) && LinearOperators.reset!(B)
103+
end
104+
105+
SolverCore.reset!(solver::R2NSolver, model) = SolverCore.reset!(solver)
106+
99107
"""
100108
R2N(reg_nlp; kwargs…)
101109

src/TRDH_alg.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@ function TRDHSolver(
9090
)
9191
end
9292

93+
function SolverCore.reset!(solver::TRDHSolver)
94+
LinearOperators.reset!(solver.D)
95+
end
96+
97+
SolverCore.reset!(solver::TRDHSolver, model) = SolverCore.reset!(solver)
98+
9399
"""
94100
TRDH(reg_nlp; kwargs…)
95101
TRDH(nlp, h, χ, options; kwargs...)

src/TR_alg.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,15 @@ function TRSolver(
9595
)
9696
end
9797

98+
function SolverCore.reset!(solver::TRSolver)
99+
_reset_power_method!(solver.v0)
100+
reset_data!(solver.subpb.model)
101+
LinearOperators.reset!(solver.subpb.model)
102+
end
103+
104+
SolverCore.reset!(solver::TRSolver, model) = SolverCore.reset!(solver)
105+
106+
98107
"""
99108
TR(reg_nlp; kwargs…)
100109
TR(nlp, h, χ, options; kwargs...)

src/utils.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ export RegularizedExecutionStats
22

33
import SolverCore.GenericExecutionStats
44

5+
# Reset the initial vector for the power method to [1/sqrt(n), -1/sqrt(n), 1/sqrt(n), ...].
6+
function _reset_power_method!(v0::AbstractVector)
7+
v0 .= (isodd.(eachindex(v0)) .* 2 .- 1) ./ sqrt(length(v0))
8+
end
9+
510
function power_method!(B::M, v₀::S, v₁::S, max_iter::Int = 1) where {M, S}
611
@assert max_iter >= 1 "max_iter must be at least 1."
712
mul!(v₁, B, v₀)

0 commit comments

Comments
 (0)