@@ -237,6 +237,18 @@ function check_diff_graph(var_to_diff, fullvars)
237237end
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+
240252function 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