240240function tearing_reassemble (state:: TearingState , var_eq_matching,
241241 full_var_eq_matching = nothing ; simplify = false , mm = nothing , cse_hack = true , array_hack = true )
242242 @unpack fullvars, sys, structure = state
243- @unpack solvable_graph, var_to_diff, eq_to_diff, graph = structure
243+ @unpack solvable_graph, var_to_diff, eq_to_diff, graph, lowest_shift = structure
244244 extra_vars = Int[]
245245 if full_var_eq_matching != = nothing
246246 for v in 𝑑vertices (state. structure. graph)
@@ -279,6 +279,7 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
279279 iv = D = nothing
280280 end
281281 diff_to_var = invview (var_to_diff)
282+
282283 dummy_sub = Dict ()
283284 for var in 1 : length (fullvars)
284285 dv = var_to_diff[var]
@@ -310,7 +311,10 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
310311 diff_to_var[dv] = nothing
311312 end
312313 end
314+ @show neweqs
313315
316+ println (" Post state selection." )
317+
314318 # `SelectedState` information is no longer needed past here. State selection
315319 # is done. All non-differentiated variables are algebraic variables, and all
316320 # variables that appear differentiated are differential variables.
@@ -331,10 +335,28 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
331335 order += 1
332336 dv = dv′
333337 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
334345 order, dv
335346 end
336347 end
337348
349+ 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
359+
338360 # retear = BitSet()
339361 # There are three cases where we want to generate new variables to convert
340362 # the system into first order (semi-implicit) ODEs.
@@ -384,9 +406,28 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
384406 eq_var_matching = invview (var_eq_matching)
385407 linear_eqs = mm === nothing ? Dict {Int, Int} () :
386408 Dict (reverse (en) for en in enumerate (mm. nzrows))
409+
387410 for v in 1 : length (var_to_diff)
388- dv = var_to_diff[v]
411+ println ()
412+ @show fullvars
413+ @show diff_to_var
414+ is_highest_discrete = begin
415+ var = fullvars[v]
416+ op = operation (var)
417+ if (! is_only_discrete (state. structure) || op isa Shift)
418+ false
419+ elseif ! haskey (lowest_shift, var)
420+ false
421+ else
422+ low = lowest_shift[var]
423+ idx = findfirst (x -> isequal (x, Shift (iv, low)(var)), fullvars)
424+ true
425+ end
426+ end
427+ dv = is_highest_discrete ? idx : var_to_diff[v]
428+ @show (v, fullvars[v], dv)
389429 dv isa Int || continue
430+
390431 solved = var_eq_matching[dv] isa Int
391432 solved && continue
392433 # check if there's `D(x) = x_t` already
@@ -404,17 +445,19 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
404445 diff_to_var[v_t] === nothing )
405446 @assert dv in rvs
406447 dummy_eq = eq
448+ @show " FOUND DUMMY EQ"
407449 @goto FOUND_DUMMY_EQ
408450 end
409451 end
410452 dx = fullvars[dv]
411453 # add `x_t`
412- order, lv = var_order (dv)
413- x_t = lower_varname_withshift (fullvars[lv], iv, order)
454+ @show order, lv = var_order (dv)
455+ x_t = lower_name (fullvars[lv], iv, order)
414456 push! (fullvars, simplify_shifts (x_t))
415457 v_t = length (fullvars)
416458 v_t_idx = add_vertex! (var_to_diff)
417459 add_vertex! (graph, DST)
460+ @show x_t, dx
418461 # TODO : do we care about solvable_graph? We don't use them after
419462 # `dummy_derivative_graph`.
420463 add_vertex! (solvable_graph, DST)
@@ -433,10 +476,16 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
433476 add_edge! (solvable_graph, dummy_eq, dv)
434477 @assert nsrcs (graph) == nsrcs (solvable_graph) == dummy_eq
435478 @label FOUND_DUMMY_EQ
479+ @show is_highest_discrete
480+ @show diff_to_var
481+ @show v_t, dv
482+ # If var = x with no shift, then
483+ is_highest_discrete && (lowest_shift[x_t] = lowest_shift[fullvars[v]])
436484 var_to_diff[v_t] = var_to_diff[dv]
437485 var_eq_matching[dv] = unassigned
438486 eq_var_matching[dummy_eq] = dv
439487 end
488+ @show neweqs
440489
441490 # Will reorder equations and unknowns to be:
442491 # [diffeqs; ...]
@@ -537,6 +586,7 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
537586
538587 deps = Vector{Int}[i == 1 ? Int[] : collect (1 : (i - 1 ))
539588 for i in 1 : length (solved_equations)]
589+
540590 # Contract the vertices in the structure graph to make the structure match
541591 # the new reality of the system we've just created.
542592 graph = contract_variables (graph, var_eq_matching, varsperm, eqsperm,
0 commit comments