Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using NLPModels
- using SolverTools
- function coordinate_search3(nlp :: AbstractNLPModel;
- tol :: Real = 1e-12,
- α :: Float64 = 1.0,
- x :: AbstractVector = nlp.meta.x0,
- max_time :: Float64 = 3.0,
- max_eval :: Int = -1,
- β :: Real = 2.0,
- greedy :: Bool = true)
- k = 0
- el_time = 0.0
- start_time = time()
- tired = neval_obj(nlp) > max_eval >= 0 || el_time > max_time
- optimal = α < tol
- T = eltype(x)
- status =:unknown
- @info log_header([:iter, :f, :H],[Int, T, T], hdr_override=Dict(:f=>"f(x)", :H=>"α"))
- f = obj(nlp,x)
- best_f = f
- best_i = 0
- while !(optimal || tired)
- @info log_row(Any[k, f, α])
- xt = copy(x)
- success = false
- done = false
- i = 1
- while !(done || i > nlp.meta.nvar)
- for s in [-1,1]
- xt[i] = x[i] + α * s
- f_xt = obj(nlp,xt)
- if (f_xt < best_f)
- success = true
- best_f = f_xt
- best_i = i * s
- if greedy
- done = true
- break
- end
- end
- xt[i] = x[i]
- end
- i += 1
- end
- if success
- x[abs(best_i)] = x[abs(best_i)] + sign(best_i) * α
- f = obj(nlp,x)
- else
- α /= β
- end
- k += 1
- el_time = time() - start_time
- tired = neval_obj(nlp) > max_eval >= 0 || el_time > max_time
- optimal = α <= tol
- end
- if (optimal)
- status =:unknown
- elseif (tired)
- if (neval_obj(nlp) > max_eval && max_eval >= 0)
- status =:max_eval
- elseif (el_time >= max_time)
- status =:max_time
- end
- end
- return GenericExecutionStats(status, nlp, solution=x, objective=f,
- iter = k, elapsed_time = el_time)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement