Skip to content

Commit fe37286

Browse files
committed
solving equations
1 parent b530595 commit fe37286

File tree

1 file changed

+34
-30
lines changed

1 file changed

+34
-30
lines changed

src/structural_transformation/symbolics_tearing.jl

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,18 @@ function check_diff_graph(var_to_diff, fullvars)
237237
end
238238
=#
239239

240+
function state_selection()
241+
242+
end
243+
244+
function create_new_deriv_variables()
245+
246+
end
247+
248+
function solve_solvable_equations()
249+
250+
end
251+
240252
function tearing_reassemble(state::TearingState, var_eq_matching,
241253
full_var_eq_matching = nothing; simplify = false, mm = nothing, cse_hack = true, array_hack = true)
242254
@unpack fullvars, sys, structure = state
@@ -323,6 +335,11 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
323335
is_solvable = let solvable_graph = solvable_graph
324336
(eq, iv) -> eq isa Int && iv isa Int && BipartiteEdge(eq, iv) in solvable_graph
325337
end
338+
idx_to_lowest_shift = Dict{Int, Int}(var => 0 for var in 1:length(fullvars))
339+
for (i,var) in enumerate(fullvars)
340+
key = operation(var) isa Shift ? only(arguments(var)) : var
341+
idx_to_lowest_shift[i] = get(lowest_shift, key, 0)
342+
end
326343

327344
# if var is like D(x)
328345
isdervar = let diff_to_var = diff_to_var
@@ -335,27 +352,11 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
335352
order += 1
336353
dv = dv′
337354
end
338-
println("Order")
339-
@show fullvars[dv]
340-
is_only_discrete(state.structure) && begin
341-
var = fullvars[dv]
342-
key = operation(var) isa Shift ? only(arguments(var)) : var
343-
order = -get(lowest_shift, key, 0) - order
344-
end
355+
is_only_discrete(state.structure) && (order = -idx_to_lowest_shift[dv] - order - 1)
345356
order, dv
346357
end
347358
end
348-
349359
lower_name = is_only_discrete(state.structure) ? lower_varname_withshift : lower_varname_with_unit
350-
# is_only_discrete(state.structure) && for v in 1:length(fullvars)
351-
# var = fullvars[v]
352-
# op = operation(var)
353-
# if op isa Shift
354-
# x = only(arguments(var))
355-
# lowest_shift_idxs[v]
356-
# op.steps == lowest_shift[x] && (fullvars[v] = lower_varname_withshift(var, iv, -op.steps))
357-
# end
358-
# end
359360

360361
#retear = BitSet()
361362
# There are three cases where we want to generate new variables to convert
@@ -408,9 +409,6 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
408409
Dict(reverse(en) for en in enumerate(mm.nzrows))
409410

410411
for v in 1:length(var_to_diff)
411-
println()
412-
@show fullvars
413-
@show diff_to_var
414412
is_highest_discrete = begin
415413
var = fullvars[v]
416414
op = operation(var)
@@ -425,7 +423,6 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
425423
end
426424
end
427425
dv = is_highest_discrete ? idx : var_to_diff[v]
428-
@show (v, fullvars[v], dv)
429426
dv isa Int || continue
430427

431428
solved = var_eq_matching[dv] isa Int
@@ -445,19 +442,17 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
445442
diff_to_var[v_t] === nothing)
446443
@assert dv in rvs
447444
dummy_eq = eq
448-
@show "FOUND DUMMY EQ"
449445
@goto FOUND_DUMMY_EQ
450446
end
451447
end
452448
dx = fullvars[dv]
453449
# add `x_t`
454-
@show order, lv = var_order(dv)
450+
order, lv = var_order(dv)
455451
x_t = lower_name(fullvars[lv], iv, order)
456452
push!(fullvars, simplify_shifts(x_t))
457453
v_t = length(fullvars)
458454
v_t_idx = add_vertex!(var_to_diff)
459455
add_vertex!(graph, DST)
460-
@show x_t, dx
461456
# TODO: do we care about solvable_graph? We don't use them after
462457
# `dummy_derivative_graph`.
463458
add_vertex!(solvable_graph, DST)
@@ -476,16 +471,12 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
476471
add_edge!(solvable_graph, dummy_eq, dv)
477472
@assert nsrcs(graph) == nsrcs(solvable_graph) == dummy_eq
478473
@label FOUND_DUMMY_EQ
479-
@show is_highest_discrete
480-
@show diff_to_var
481-
@show v_t, dv
482474
# If var = x with no shift, then
483-
is_highest_discrete && (lowest_shift[x_t] = lowest_shift[fullvars[v]])
475+
is_only_discrete(state.structure) && (idx_to_lowest_shift[v_t] = idx_to_lowest_shift[dv])
484476
var_to_diff[v_t] = var_to_diff[dv]
485477
var_eq_matching[dv] = unassigned
486478
eq_var_matching[dummy_eq] = dv
487479
end
488-
@show neweqs
489480

490481
# Will reorder equations and unknowns to be:
491482
# [diffeqs; ...]
@@ -501,9 +492,16 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
501492
subeqs = Equation[]
502493
solved_equations = Int[]
503494
solved_variables = Int[]
495+
504496
# Solve solvable equations
497+
println()
498+
println("SOLVING SOLVABLE EQUATIONS.")
499+
@show eq_var_matching
505500
toporder = topological_sort(DiCMOBiGraph{false}(graph, var_eq_matching))
506501
eqs = Iterators.reverse(toporder)
502+
@show eqs
503+
@show neweqs
504+
@show fullvars
507505
total_sub = Dict()
508506
idep = iv
509507
for ieq in eqs
@@ -516,12 +514,18 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
516514
isnothing(D) &&
517515
error("Differential found in a non-differential system. Likely this is a bug in the construction of an initialization system. Please report this issue with a reproducible example. Offending equation: $(equations(sys)[ieq])")
518516
order, lv = var_order(iv)
519-
dx = D(simplify_shifts(lower_varname_withshift(
517+
@show fullvars[iv]
518+
@show (order, lv)
519+
dx = D(simplify_shifts(lower_name(
520520
fullvars[lv], idep, order - 1)))
521+
@show dx
522+
@show neweqs[ieq]
521523
eq = dx ~ simplify_shifts(Symbolics.fixpoint_sub(
522524
Symbolics.symbolic_linear_solve(neweqs[ieq],
523525
fullvars[iv]),
524526
total_sub; operator = ModelingToolkit.Shift))
527+
@show total_sub
528+
@show eq
525529
for e in 𝑑neighbors(graph, iv)
526530
e == ieq && continue
527531
for v in 𝑠neighbors(graph, e)

0 commit comments

Comments
 (0)