@@ -57,6 +57,9 @@ function __structural_simplify(
5757 if has_noise_eqs (sys) && get_noise_eqs (sys) != = nothing
5858 throw (ArgumentError (" Cannot simplify systems with `noise_eqs`" ))
5959 end
60+ if isempty (equations (sys)) && ! is_time_dependent (sys) && ! _iszero (cost (sys))
61+ return simplify_optimization_system (sys; kwargs... , sort_eqs, simplify)
62+ end
6063
6164 sys = expand_connections (sys)
6265 state = TearingState (sys; sort_eqs)
@@ -148,6 +151,36 @@ function __structural_simplify(
148151 end
149152end
150153
154+ function simplify_optimization_system (sys:: System ; split = true , kwargs... )
155+ sys = flatten (sys)
156+ cons = constraints (sys)
157+ econs = Equation[]
158+ icons = similar (cons, 0 )
159+ for e in cons
160+ if e isa Equation
161+ push! (econs, e)
162+ else
163+ push! (icons, e)
164+ end
165+ end
166+ nlsys = System (econs, unknowns (sys), parameters (sys); name = :___tmp_nlsystem )
167+ snlsys = structural_simplify (nlsys; fully_determined = nothing , kwargs... )
168+ obs = observed (snlsys)
169+ subs = Dict (eq. lhs => eq. rhs for eq in observed (snlsys))
170+ seqs = equations (snlsys)
171+ cons_simplified = similar (cons, length (icons) + length (seqs))
172+ for (i, eq) in enumerate (Iterators. flatten ((seqs, icons)))
173+ cons_simplified[i] = fixpoint_sub (eq, subs)
174+ end
175+ newsts = setdiff (unknowns (sys), keys (subs))
176+ @set! sys. constraints = cons_simplified
177+ @set! sys. observed = [observed (sys); obs]
178+ newcost = fixpoint_sub .(get_costs (sys), (subs,))
179+ @set! sys. costs = newcost
180+ @set! sys. unknowns = newsts
181+ return sys
182+ end
183+
151184function __num_isdiag_noise (mat)
152185 for i in axes (mat, 1 )
153186 nnz = 0
0 commit comments