Skip to content

Commit f0f412b

Browse files
Merge pull request #3779 from hersle/faster_init
Trivial optimization in generate_initializesystem
2 parents d52b735 + 26255ab commit f0f412b

File tree

2 files changed

+9
-10
lines changed

2 files changed

+9
-10
lines changed

src/systems/nonlinear/initializesystem.jl

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ end
4141
"""
4242
$(TYPEDSIGNATURES)
4343
44-
Generate `System` of nonlinear equations which initializes a problem from specified initial conditions of an `AbstractTimeDependentSystem`.
44+
Generate `System` of nonlinear equations which initializes a problem from specified initial conditions of a time-dependent `AbstractSystem`.
4545
"""
4646
function generate_initializesystem_timevarying(sys::AbstractSystem;
4747
op = Dict(),
@@ -71,7 +71,6 @@ function generate_initializesystem_timevarying(sys::AbstractSystem;
7171
eqs_ics = Equation[]
7272
defs = copy(defaults(sys)) # copy so we don't modify sys.defaults
7373
additional_guesses = anydict(guesses)
74-
additional_initialization_eqs = Vector{Equation}(initialization_eqs)
7574
guesses = merge(get_guesses(sys), additional_guesses)
7675
idxs_diff = isdiffeq.(eqs)
7776

@@ -190,11 +189,13 @@ function generate_initializesystem_timevarying(sys::AbstractSystem;
190189
push!(pars, get_iv(sys))
191190

192191
# 8) use observed equations for guesses of observed variables if not provided
192+
guessed = Set(keys(defs)) # x(t), D(x(t)), ...
193+
guessed = union(guessed, Set(default_toterm.(guessed))) # x(t), D(x(t)), xˍt(t), ...
193194
for eq in trueobs
194-
haskey(defs, eq.lhs) && continue
195-
any(x -> isequal(default_toterm(x), eq.lhs), keys(defs)) && continue
196-
197-
defs[eq.lhs] = eq.rhs
195+
if !(eq.lhs in guessed)
196+
defs[eq.lhs] = eq.rhs
197+
#push!(guessed, eq.lhs) # should not encounter eq.lhs twice, so don't need to track it
198+
end
198199
end
199200
append!(eqs_ics, trueobs)
200201

@@ -216,7 +217,7 @@ end
216217
"""
217218
$(TYPEDSIGNATURES)
218219
219-
Generate `System` of nonlinear equations which initializes a problem from specified initial conditions of an `AbstractTimeDependentSystem`.
220+
Generate `System` of nonlinear equations which initializes a problem from specified initial conditions of a time-independent `AbstractSystem`.
220221
"""
221222
function generate_initializesystem_timeindependent(sys::AbstractSystem;
222223
op = Dict(),
@@ -228,12 +229,10 @@ function generate_initializesystem_timeindependent(sys::AbstractSystem;
228229
eqs = equations(sys)
229230
trueobs, eqs = unhack_observed(observed(sys), eqs)
230231
vars = unique([unknowns(sys); getfield.(trueobs, :lhs)])
231-
vars_set = Set(vars) # for efficient in-lookup
232232

233233
eqs_ics = Equation[]
234234
defs = copy(defaults(sys)) # copy so we don't modify sys.defaults
235235
additional_guesses = anydict(guesses)
236-
additional_initialization_eqs = Vector{Equation}(initialization_eqs)
237236
guesses = merge(get_guesses(sys), additional_guesses)
238237

239238
# PREPROCESSING

src/systems/systemstructure.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ function TearingState(sys; quick_cancel = false, check = true, sort_eqs = true)
431431
if sort_eqs
432432
# sort equations lexicographically to reduce simplification issues
433433
# depending on order due to NP-completeness of tearing.
434-
sortidxs = Base.sortperm(eqs, by = string)
434+
sortidxs = Base.sortperm(string.(eqs)) # "by = string" creates more strings
435435
eqs = eqs[sortidxs]
436436
original_eqs = original_eqs[sortidxs]
437437
symbolic_incidence = symbolic_incidence[sortidxs]

0 commit comments

Comments
 (0)