@@ -237,6 +237,18 @@ function check_diff_graph(var_to_diff, fullvars)
237
237
end
238
238
=#
239
239
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
+
240
252
function tearing_reassemble (state:: TearingState , var_eq_matching,
241
253
full_var_eq_matching = nothing ; simplify = false , mm = nothing , cse_hack = true , array_hack = true )
242
254
@unpack fullvars, sys, structure = state
@@ -323,6 +335,11 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
323
335
is_solvable = let solvable_graph = solvable_graph
324
336
(eq, iv) -> eq isa Int && iv isa Int && BipartiteEdge (eq, iv) in solvable_graph
325
337
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
326
343
327
344
# if var is like D(x)
328
345
isdervar = let diff_to_var = diff_to_var
@@ -335,27 +352,11 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
335
352
order += 1
336
353
dv = dv′
337
354
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 )
345
356
order, dv
346
357
end
347
358
end
348
-
349
359
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
360
360
361
# retear = BitSet()
361
362
# 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,
408
409
Dict (reverse (en) for en in enumerate (mm. nzrows))
409
410
410
411
for v in 1 : length (var_to_diff)
411
- println ()
412
- @show fullvars
413
- @show diff_to_var
414
412
is_highest_discrete = begin
415
413
var = fullvars[v]
416
414
op = operation (var)
@@ -425,7 +423,6 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
425
423
end
426
424
end
427
425
dv = is_highest_discrete ? idx : var_to_diff[v]
428
- @show (v, fullvars[v], dv)
429
426
dv isa Int || continue
430
427
431
428
solved = var_eq_matching[dv] isa Int
@@ -445,19 +442,17 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
445
442
diff_to_var[v_t] === nothing )
446
443
@assert dv in rvs
447
444
dummy_eq = eq
448
- @show " FOUND DUMMY EQ"
449
445
@goto FOUND_DUMMY_EQ
450
446
end
451
447
end
452
448
dx = fullvars[dv]
453
449
# add `x_t`
454
- @show order, lv = var_order (dv)
450
+ order, lv = var_order (dv)
455
451
x_t = lower_name (fullvars[lv], iv, order)
456
452
push! (fullvars, simplify_shifts (x_t))
457
453
v_t = length (fullvars)
458
454
v_t_idx = add_vertex! (var_to_diff)
459
455
add_vertex! (graph, DST)
460
- @show x_t, dx
461
456
# TODO : do we care about solvable_graph? We don't use them after
462
457
# `dummy_derivative_graph`.
463
458
add_vertex! (solvable_graph, DST)
@@ -476,16 +471,12 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
476
471
add_edge! (solvable_graph, dummy_eq, dv)
477
472
@assert nsrcs (graph) == nsrcs (solvable_graph) == dummy_eq
478
473
@label FOUND_DUMMY_EQ
479
- @show is_highest_discrete
480
- @show diff_to_var
481
- @show v_t, dv
482
474
# 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 ])
484
476
var_to_diff[v_t] = var_to_diff[dv]
485
477
var_eq_matching[dv] = unassigned
486
478
eq_var_matching[dummy_eq] = dv
487
479
end
488
- @show neweqs
489
480
490
481
# Will reorder equations and unknowns to be:
491
482
# [diffeqs; ...]
@@ -501,9 +492,16 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
501
492
subeqs = Equation[]
502
493
solved_equations = Int[]
503
494
solved_variables = Int[]
495
+
504
496
# Solve solvable equations
497
+ println ()
498
+ println (" SOLVING SOLVABLE EQUATIONS." )
499
+ @show eq_var_matching
505
500
toporder = topological_sort (DiCMOBiGraph {false} (graph, var_eq_matching))
506
501
eqs = Iterators. reverse (toporder)
502
+ @show eqs
503
+ @show neweqs
504
+ @show fullvars
507
505
total_sub = Dict ()
508
506
idep = iv
509
507
for ieq in eqs
@@ -516,12 +514,18 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
516
514
isnothing (D) &&
517
515
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]) " )
518
516
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 (
520
520
fullvars[lv], idep, order - 1 )))
521
+ @show dx
522
+ @show neweqs[ieq]
521
523
eq = dx ~ simplify_shifts (Symbolics. fixpoint_sub (
522
524
Symbolics. symbolic_linear_solve (neweqs[ieq],
523
525
fullvars[iv]),
524
526
total_sub; operator = ModelingToolkit. Shift))
527
+ @show total_sub
528
+ @show eq
525
529
for e in 𝑑neighbors (graph, iv)
526
530
e == ieq && continue
527
531
for v in 𝑠neighbors (graph, e)
0 commit comments