@@ -93,7 +93,7 @@ A steady state result for 1000 parameter points
93
93
"""
94
94
function get_steady_states (prob:: Problem , swept_parameters:: ParameterRange , fixed_parameters:: ParameterList ;
95
95
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 ... )
97
97
98
98
# set seed if provided
99
99
! isnothing (seed) && Random. seed! (seed)
@@ -108,8 +108,9 @@ function get_steady_states(prob::Problem, swept_parameters::ParameterRange, fixe
108
108
109
109
input_array = _prepare_input_params (prob, swept_parameters, unique_fixed)
110
110
# 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... )
113
114
114
115
# extract all the information we need from results
115
116
# rounded_solutions = unique_points.(HomotopyContinuation.solutions.(getindex.(raw, 1)); metric = EuclideanNorm(), atol=1E-14, rtol=1E-8)
@@ -249,20 +250,20 @@ end
249
250
" A random warmup solution is computed to use as `start_parameters` in the homotopy."
250
251
function _solve_warmup (problem:: Problem , params_1D, sweep; threading, show_progress)
251
252
# 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]
253
254
real_pert = ones (length (params_1D[1 ]))
254
255
warmup_parameters = params_1D[end ÷ 2 ] .* (real_pert + complex_pert)
255
256
256
257
warmup_solution =
257
- HC. solve (problem. system;
258
+ HC. solve (problem. system; start_system = :total_degree ,
258
259
target_parameters= warmup_parameters, threading= threading, show_progress= show_progress
259
260
)
260
261
return warmup_parameters, warmup_solution
261
262
end
262
263
263
264
" Uses HomotopyContinuation to solve `problem` at specified `parameter_values`."
264
265
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 ... )
266
267
# HomotopyContinuation accepts 1D arrays of parameter sets
267
268
params_1D = reshape (parameter_values, :, 1 )
268
269
@@ -274,18 +275,18 @@ function _get_raw_solution(problem::Problem, parameter_values;
274
275
HC. solve (
275
276
problem. system, HC. solutions (warmup_solution);
276
277
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 ...
278
279
)
279
- elseif method== :total_degree
280
+ elseif method== :total_degree || method == :polyhedral
280
281
result_full = Array {Vector{Any}, 1} (undef, length (parameter_values))
281
282
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 )
283
284
end
284
285
for i in eachindex (parameter_values) # do NOT thread this
285
286
p = parameter_values[i]
286
287
show_progress ? next! (bar) : nothing
287
288
result_full[i] = [
288
- HC. solve (problem. system; start_system= :total_degree ,
289
+ HC. solve (problem. system; start_system= method ,
289
290
target_parameters= p, threading= threading, show_progress= false , seed= seed), p]
290
291
end
291
292
else
0 commit comments