Skip to content

Commit 659dd36

Browse files
authored
Play with warmup method and add polyhedral method (#140)
* deacrease perturbation in random_warmup * add `:polyhedral` method * add kwargs options for homotopy solver * all parameter complex in warmup homotopy
1 parent b90ad5e commit 659dd36

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

src/solve_homotopy.jl

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ A steady state result for 1000 parameter points
9393
"""
9494
function get_steady_states(prob::Problem, swept_parameters::ParameterRange, fixed_parameters::ParameterList;
9595
method=:warmup, threading = Threads.nthreads() > 1, show_progress=true,
96-
sorting="nearest", classify_default=true, seed=nothing)
96+
sorting="nearest", classify_default=true, seed=nothing, kwargs...)
9797

9898
# set seed if provided
9999
!isnothing(seed) && Random.seed!(seed)
@@ -108,8 +108,9 @@ function get_steady_states(prob::Problem, swept_parameters::ParameterRange, fixe
108108

109109
input_array = _prepare_input_params(prob, swept_parameters, unique_fixed)
110110
# feed the array into HomotopyContinuation, get back an similar array of solutions
111-
raw = _get_raw_solution(prob, input_array;
112-
sweep=swept_parameters, method=method, threading=threading, show_progress=show_progress, seed=seed)
111+
raw = _get_raw_solution(
112+
prob, input_array; sweep=swept_parameters, method=method, threading=threading,
113+
show_progress=show_progress, seed=seed, kwargs...)
113114

114115
# extract all the information we need from results
115116
#rounded_solutions = unique_points.(HomotopyContinuation.solutions.(getindex.(raw, 1)); metric = EuclideanNorm(), atol=1E-14, rtol=1E-8)
@@ -249,20 +250,20 @@ end
249250
"A random warmup solution is computed to use as `start_parameters` in the homotopy."
250251
function _solve_warmup(problem::Problem, params_1D, sweep; threading, show_progress)
251252
# complex perturbation of the warmup parameters
252-
complex_pert = [1e-2 * issubset(p, keys(sweep)) * randn(ComplexF64) for p in problem.parameters]
253+
complex_pert = [1e-5 * randn(ComplexF64) for p in problem.parameters]
253254
real_pert = ones(length(params_1D[1]))
254255
warmup_parameters = params_1D[end÷2] .* (real_pert + complex_pert)
255256

256257
warmup_solution =
257-
HC.solve(problem.system;
258+
HC.solve(problem.system; start_system=:total_degree,
258259
target_parameters=warmup_parameters, threading=threading, show_progress=show_progress
259260
)
260261
return warmup_parameters, warmup_solution
261262
end
262263

263264
"Uses HomotopyContinuation to solve `problem` at specified `parameter_values`."
264265
function _get_raw_solution(problem::Problem, parameter_values;
265-
sweep=ParameterRange(), method=:warmup, threading=false, show_progress=true, seed=nothing)
266+
sweep=ParameterRange(), method=:warmup, threading=false, show_progress=true, seed=nothing, kwargs...)
266267
# HomotopyContinuation accepts 1D arrays of parameter sets
267268
params_1D = reshape(parameter_values, :, 1)
268269

@@ -274,18 +275,18 @@ function _get_raw_solution(problem::Problem, parameter_values;
274275
HC.solve(
275276
problem.system, HC.solutions(warmup_solution);
276277
start_parameters=warmup_parameters, target_parameters=parameter_values,
277-
threading=threading, show_progress=show_progress, seed=seed
278+
threading=threading, show_progress=show_progress, seed=seed, kwargs...
278279
)
279-
elseif method==:total_degree
280+
elseif method==:total_degree || method==:polyhedral
280281
result_full = Array{Vector{Any}, 1}(undef, length(parameter_values))
281282
if show_progress
282-
bar = Progress(length(parameter_values), 1, "Solving via total degree homotopy ...", 50)
283+
bar = Progress(length(parameter_values), 1, "Solving via $method homotopy ...", 50)
283284
end
284285
for i in eachindex(parameter_values) # do NOT thread this
285286
p = parameter_values[i]
286287
show_progress ? next!(bar) : nothing
287288
result_full[i] = [
288-
HC.solve(problem.system; start_system=:total_degree,
289+
HC.solve(problem.system; start_system=method,
289290
target_parameters=p, threading=threading, show_progress=false, seed=seed), p]
290291
end
291292
else

0 commit comments

Comments
 (0)