@@ -20,7 +20,7 @@ struct OptimizationSystem <: AbstractSystem
2020 """ Vector of equations defining the system."""
2121 op:: Operation
2222 """ Unknown variables."""
23- states:: Vector{Expression }
23+ states:: Vector{Variable }
2424 """ Parameters."""
2525 ps:: Vector{Variable}
2626 """
@@ -30,42 +30,29 @@ struct OptimizationSystem <: AbstractSystem
3030 """
3131 systems: The internal systems
3232 """
33- systems:: Vector{NonlinearSystem }
33+ systems:: Vector{OptimizationSystem }
3434end
3535
36- function NonlinearSystem (eqs , states, ps;
37- name = gensym (:NonlinearSystem ),
38- systems = NonlinearSystem [])
39- NonlinearSystem (eqs, states, convert .(Variable,ps), name, systems)
36+ function OptimizationSystem (op , states, ps;
37+ name = gensym (:OptimizationSystem ),
38+ systems = OptimizationSystem [])
39+ OptimizationSystem (op, convert .(Variable, states) , convert .(Variable,ps), name, systems)
4040end
4141
42- function calculate_jacobian (sys:: NonlinearSystem )
43- rhs = [eq. rhs for eq in sys. eqs]
44- jac = expand_derivatives .(calculate_jacobian (rhs, sys. states))
45- return jac
42+ function calculate_hessian (sys:: OptimizationSystem )
43+ expand_derivatives .(hessian (equations (sys), [dv () for dv in states (sys)]))
4644end
4745
48- function generate_jacobian (sys:: NonlinearSystem , vs = sys . states, ps = sys. ps , expression = Val{true }; kwargs... )
49- jac = calculate_jacobian (sys)
50- return build_function (jac , convert .(Variable,vs), convert .(Variable,ps), (), NLSysToExpr (sys ))
46+ function generate_hessian (sys:: OptimizationSystem , vs = states (sys) , ps = parameters ( sys) , expression = Val{true }; kwargs... )
47+ hes = calculate_hessian (sys)
48+ return build_function (hes , convert .(Variable,vs), convert .(Variable,ps), (), x -> convert (Expr, x ))
5149end
5250
53- struct NLSysToExpr
54- sys:: NonlinearSystem
55- end
56- function (f:: NLSysToExpr )(O:: Operation )
57- any (isequal (O), f. sys. states) && return O. op. name # variables
58- if isa (O. op, Variable)
59- isempty (O. args) && return O. op. name # 0-ary parameters
60- return build_expr (:call , Any[O. op. name; f .(O. args)])
61- end
62- return build_expr (:call , Any[O. op; f .(O. args)])
63- end
64- (f:: NLSysToExpr )(x) = convert (Expr, x)
65-
66- function generate_function (sys:: NonlinearSystem , vs = sys. states, ps = sys. ps, expression = Val{true }; kwargs... )
67- rhss = [eq. rhs for eq ∈ sys. eqs]
51+ function generate_function (sys:: OptimizationSystem , vs = states (sys), ps = parameters (sys), expression = Val{true }; kwargs... )
6852 vs′ = convert .(Variable,vs)
6953 ps′ = convert .(Variable,ps)
70- return build_function (rhss , vs′, ps′, (), NLSysToExpr (sys ), expression; kwargs... )
54+ return build_function (equations (sys) , vs′, ps′, (), x -> convert (Expr, x ), expression; kwargs... )
7155end
56+
57+ equations (sys:: OptimizationSystem ) = isempty (sys. systems) ? sys. op : sys. op + reduce (+ ,namespace_operation .(sys. systems))
58+ namespace_operation (sys:: OptimizationSystem ) = namespace_operation (sys. op,sys. name,nothing )
0 commit comments