@@ -8,6 +8,8 @@ using HomotopyContinuation
88using ModelingToolkit: iscomplete, parameters, has_index_cache, get_index_cache, get_u0,
99 get_u0_p, check_eqs_u0, CommonSolve
1010
11+ const MTK = ModelingToolkit
12+
1113function contains_variable (x, wrt)
1214 any (isequal (x), wrt) && return true
1315 istree (x) || return false
@@ -19,6 +21,7 @@ function is_polynomial(x, wrt)
1921 symbolic_type (x) == NotSymbolic () && return true
2022 istree (x) || return true
2123 contains_variable (x, wrt) || return true
24+ any (isequal (x), wrt) && return true
2225
2326 if operation (x) in (* , + , - )
2427 return all (y -> is_polynomial (y, wrt), arguments (x))
@@ -69,8 +72,10 @@ function ModelKit.evaluate_and_jacobian!(u, U, sys::MTKHomotopySystem, x, p = no
6972 sys. jac (U, x, sys. p)
7073end
7174
72- function ModelingToolkit. HomotopyContinuationProblem (
73- sys:: NonlinearSystem , u0map, parammap; compile = :all , kwargs... )
75+ SymbolicIndexingInterface. parameter_values (s:: MTKHomotopySystem ) = s. p
76+
77+ function MTK. HomotopyContinuationProblem (
78+ sys:: NonlinearSystem , u0map, parammap; compile = :all , eval_expression = false , eval_module = ModelingToolkit, kwargs... )
7479 if ! iscomplete (sys)
7580 error (" A completed `NonlinearSystem` is required. Call `complete` or `structural_simplify` on the system before creating a `HomotopyContinuationProblem`" )
7681 end
@@ -85,24 +90,29 @@ function ModelingToolkit.HomotopyContinuationProblem(
8590 end
8691 end
8792
88- nlfn = NonlinearFunction (sys; jac = true )
93+ nlfn = NonlinearFunction (sys; jac = true , eval_expression, eval_module )
8994 hvars = symbolics_to_hc .(dvs)
9095
96+ u0map = MTK. todict (u0map)
97+ parammap = MTK. todict (parammap)
98+
9199 if has_index_cache (sys) && get_index_cache (sys) != = nothing
92100 u0, defs = get_u0 (sys, u0map, parammap)
93101 check_eqs_u0 (eqs, dvs, u0; kwargs... )
94102 p = MTKParameters (sys, parammap, u0map)
95103 else
96- u0, p, defs = get_u0_p (sys, u0map, parammap; tofloat, use_union )
104+ u0, p, defs = get_u0_p (sys, u0map, parammap)
97105 check_eqs_u0 (eqs, dvs, u0; kwargs... )
98106 end
99107
100108 mtkhsys = MTKHomotopySystem (nlfn. f, p, nlfn. jac, hvars, length (eqs))
101109
102- return ModelingToolkit. HomotopyContinuationProblem (u0, mtkhsys, sys)
110+ obsfn = MTK. ObservedFunctionCache (sys; eval_expression, eval_module)
111+
112+ return MTK. HomotopyContinuationProblem (u0, mtkhsys, sys, obsfn)
103113end
104114
105- function CommonSolve. solve (prob:: ModelingToolkit .HomotopyContinuationProblem ; kwargs... )
115+ function CommonSolve. solve (prob:: MTK .HomotopyContinuationProblem ; kwargs... )
106116 sol = HomotopyContinuation. solve (prob. homotopy_continuation_system; kwargs... )
107117 realsols = HomotopyContinuation. results (sol; only_real = true )
108118 if isempty (realsols)
@@ -118,7 +128,7 @@ function CommonSolve.solve(prob::ModelingToolkit.HomotopyContinuationProblem; kw
118128 retcode = SciMLBase. ReturnCode. Success
119129 end
120130
121- return SciMLBase. build_solution (prob, :HomotopyContinuation , u, resid; retcode)
131+ return SciMLBase. build_solution (prob, :HomotopyContinuation , u, resid; retcode, original = sol )
122132end
123133
124134end
0 commit comments