34
34
35
35
alias_elimination (sys) = alias_elimination! (TearingState (sys; quick_cancel = true ))
36
36
function alias_elimination! (state:: TearingState )
37
- Main. _state[] = state
38
37
sys = state. sys
39
38
complete! (state. structure)
40
39
ag, mm, updated_diff_vars = alias_eliminate_graph! (state)
@@ -510,7 +509,8 @@ function find_linear_variables(graph, linear_equations, var_to_diff, irreducible
510
509
linear_variables = falses (length (var_to_diff))
511
510
var_to_lineq = Dict {Int, BitSet} ()
512
511
mark_not_linear! = let linear_variables = linear_variables, stack = stack,
513
- var_to_lineq = var_to_lineq
512
+ var_to_lineq = var_to_lineq
513
+
514
514
v -> begin
515
515
linear_variables[v] = false
516
516
push! (stack, v)
@@ -529,7 +529,7 @@ function find_linear_variables(graph, linear_equations, var_to_diff, irreducible
529
529
end
530
530
for eq in linear_equations, v in 𝑠neighbors (graph, eq)
531
531
linear_variables[v] = true
532
- vlineqs = get! (()-> BitSet (), var_to_lineq, v)
532
+ vlineqs = get! (() -> BitSet (), var_to_lineq, v)
533
533
push! (vlineqs, eq)
534
534
end
535
535
for v in irreducibles
@@ -586,7 +586,8 @@ function aag_bareiss!(graph, var_to_diff, mm_orig::SparseMatrixCLIL, irreducible
586
586
end
587
587
# TODO /FIXME : This needs a proper recursion to compute the transitive
588
588
# closure.
589
- is_linear_variables = find_linear_variables (graph, linear_equations, var_to_diff, irreducibles)
589
+ is_linear_variables = find_linear_variables (graph, linear_equations, var_to_diff,
590
+ irreducibles)
590
591
solvable_variables = findall (is_linear_variables)
591
592
592
593
function do_bareiss! (M, Mold = nothing )
@@ -646,11 +647,6 @@ function simple_aliases!(ag, graph, var_to_diff, mm_orig, irreducibles = ())
646
647
647
648
# Step 2: Simplify the system using the Bareiss factorization
648
649
rk1vars = BitSet (@view pivots[1 : rank1])
649
- fullvars = Main. _state[]. fullvars
650
- @info " " mm_orig. nzrows mm_orig
651
- @show fullvars
652
- @show fullvars[pivots[1 : rank1]]
653
- @show fullvars[solvable_variables]
654
650
for v in solvable_variables
655
651
v in rk1vars && continue
656
652
ag[v] = 0
@@ -702,13 +698,6 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
702
698
nvars = ndsts (graph)
703
699
ag = AliasGraph (nvars)
704
700
mm, echelon_mm = simple_aliases! (ag, graph, var_to_diff, mm_orig)
705
- state = Main. _state[]
706
- fullvars = state. fullvars
707
- for (v, (c, a)) in ag
708
- a = a == 0 ? 0 : c * fullvars[a]
709
- v = fullvars[v]
710
- @info " simple alias" v => a
711
- end
712
701
713
702
# Step 3: Handle differentiated variables
714
703
# At this point, `var_to_diff` and `ag` form a tree structure like the
@@ -745,15 +734,14 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
745
734
newinvag = SimpleDiGraph (nvars)
746
735
removed_aliases = BitSet ()
747
736
updated_diff_vars = Int[]
748
- irreducibles = Int[]
749
737
for (v, dv) in enumerate (var_to_diff)
750
738
processed[v] && continue
751
739
(dv === nothing && diff_to_var[v] === nothing ) && continue
752
740
753
741
r, _ = find_root! (iag, v)
754
- sv = fullvars[v]
755
- root = fullvars[r]
756
- @info " Found root $r " sv=> root
742
+ # sv = fullvars[v]
743
+ # root = fullvars[r]
744
+ # @info "Found root $r" sv=>root
757
745
level_to_var = Int[]
758
746
extreme_var (var_to_diff, r, nothing , Val (false ),
759
747
callback = Base. Fix1 (push!, level_to_var))
@@ -799,7 +787,6 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
799
787
extreme_var (var_to_diff, v, nothing , Val (false ), callback = add_alias!)
800
788
end
801
789
802
- @show processed
803
790
len = length (level_to_var)
804
791
set_v_zero! = let dag = dag
805
792
v -> dag[v] = 0
@@ -820,14 +807,8 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
820
807
# zero. Irreducible variables are highest differentiated variables (with
821
808
# order >= 1) that are not zero.
822
809
if zero_av_idx > 0
823
- extreme_var (var_to_diff, level_to_var[zero_av_idx], nothing , Val (false ), callback = set_v_zero!)
824
- if zero_av_idx > 2
825
- @warn " 1"
826
- push! (irreducibles, level_to_var[zero_av_idx - 1 ])
827
- end
828
- elseif len >= 2
829
- @warn " 2"
830
- push! (irreducibles, level_to_var[len])
810
+ extreme_var (var_to_diff, level_to_var[zero_av_idx], nothing , Val (false ),
811
+ callback = set_v_zero!)
831
812
end
832
813
# Handle virtual variables
833
814
if nlevels < len
@@ -839,17 +820,11 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
839
820
end
840
821
end
841
822
842
- # Merge dag and ag
823
+ # Step 4: Merge dag and ag
843
824
freshag = AliasGraph (nvars)
844
- @show irreducibles
845
- @show dag
846
825
for (v, (c, a)) in dag
847
- # TODO : make sure that `irreducibles` are
848
826
# D(x) ~ D(y) cannot be removed if x and y are not aliases
849
- if v != a && a in irreducibles
850
- push! (removed_aliases, v)
851
- @goto NEXT_ITER
852
- elseif v != a && ! iszero (a)
827
+ if v != a && ! iszero (a)
853
828
vv = v
854
829
aa = a
855
830
while true
@@ -873,16 +848,31 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
873
848
ag = freshag
874
849
mm = reduce! (copy (echelon_mm), ag)
875
850
end
876
- @info " " echelon_mm mm
877
851
852
+ # Step 5: Reflect our update decisions back into the graph, and make sure
853
+ # that the RHS of observable variables are defined.
854
+ for (ei, e) in enumerate (mm. nzrows)
855
+ set_neighbors! (graph, e, mm. row_cols[ei])
856
+ end
857
+ update_graph_neighbors! (graph, ag)
858
+ finalag = AliasGraph (nvars)
859
+ # RHS must still exist in the system to be valid aliases.
860
+ needs_update = false
878
861
for (v, (c, a)) in ag
879
- va = iszero (a) ? a : fullvars[a]
880
- @info " new alias" fullvars[v]=> (c, va)
862
+ if iszero (a) || ! isempty (𝑑neighbors (graph, a))
863
+ finalag[v] = c => a
864
+ else
865
+ needs_update = true
866
+ end
881
867
end
868
+ ag = finalag
882
869
883
- # Step 4: Reflect our update decisions back into the graph
884
- for (ei, e) in enumerate (mm. nzrows)
885
- set_neighbors! (graph, e, mm. row_cols[ei])
870
+ if needs_update
871
+ mm = reduce! (copy (echelon_mm), ag)
872
+ for (ei, e) in enumerate (mm. nzrows)
873
+ set_neighbors! (graph, e, mm. row_cols[ei])
874
+ end
875
+ update_graph_neighbors! (graph, ag)
886
876
end
887
877
888
878
return ag, mm, updated_diff_vars
0 commit comments