Skip to content

Commit 83c9d89

Browse files
feat: add structural_simplify for optimization systems
1 parent daa717c commit 83c9d89

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

src/systems/systems.jl

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
149152
end
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+
151184
function __num_isdiag_noise(mat)
152185
for i in axes(mat, 1)
153186
nnz = 0

0 commit comments

Comments
 (0)