@@ -39,7 +39,7 @@ alias_elimination(sys) = alias_elimination!(TearingState(sys; quick_cancel = tru
39
39
function alias_elimination! (state:: TearingState )
40
40
sys = state. sys
41
41
complete! (state. structure)
42
- ag, mm, updated_diff_vars = alias_eliminate_graph! (state)
42
+ ag, complete_ag, mm, updated_diff_vars = alias_eliminate_graph! (state)
43
43
isempty (ag) && return sys
44
44
45
45
fullvars = state. fullvars
@@ -543,6 +543,7 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
543
543
#
544
544
nvars = ndsts (graph)
545
545
ag = AliasGraph (nvars)
546
+ complete_ag = AliasGraph (nvars)
546
547
mm, echelon_mm = simple_aliases! (ag, graph, var_to_diff, mm_orig)
547
548
548
549
# Step 3: Handle differentiated variables
@@ -702,6 +703,7 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
702
703
while (iv = diff_to_var[v]) in zero_vars_set
703
704
v = iv
704
705
end
706
+ complete_ag[v] = 0
705
707
if diff_to_var[v] === nothing # `v` is reducible
706
708
dag[v] = 0
707
709
end
@@ -729,6 +731,13 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
729
731
# Step 4: Merge dag and ag
730
732
removed_aliases = BitSet ()
731
733
merged_ag = AliasGraph (nvars)
734
+ for (v, (c, a)) in dag
735
+ complete_ag[v] = c => a
736
+ end
737
+ for (v, (c, a)) in ag
738
+ (processed[v] || (! iszero (a) && processed[a])) && continue
739
+ complete_ag[v] = c => a
740
+ end
732
741
for (v, (c, a)) in dag
733
742
# D(x) ~ D(y) cannot be removed if x and y are not aliases
734
743
if v != a && ! iszero (a)
@@ -789,7 +798,7 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
789
798
update_graph_neighbors! (graph, ag)
790
799
end
791
800
792
- return ag, mm, updated_diff_vars
801
+ return ag, complete_ag, mm, updated_diff_vars
793
802
end
794
803
795
804
function update_graph_neighbors! (graph, ag)
0 commit comments