@@ -99,27 +99,38 @@ function alias_elimination(sys)
99
99
100
100
# TODO : use an iterator, and get a relative level vector for `processed`
101
101
# variabels.
102
- r, lv = walk_to_root! (relative_level, iag, v)
103
- fill! (processed, false )
104
- # lv = extreme_var(var_to_diff, v, -lv, Val(false))
105
- lv′ = extreme_var (var_to_diff, v, 0 )[2 ]
102
+ # Note that `rootlv` is non-positive
103
+ r, rootlv = walk_to_root! (relative_level, iag, v)
106
104
let
107
105
sv = fullvars[v]
108
106
root = fullvars[r]
109
- @warn " " sv=> root level= lv levelv= lv′
110
- for (v, rl) in pairs (relative_level)
111
- @show v, rl
112
- @show fullvars[v], rl - lv, rl, lv
107
+ @warn " " sv=> root level= rootlv
108
+ end
109
+ level_to_var = Int[]
110
+ extreme_var (var_to_diff, r, nothing , Val (false ), callback = Base. Fix1 (push!, level_to_var))
111
+ nlevels = length (level_to_var)
112
+ current_level = Ref (0 )
113
+ add_alias! = let current_level = current_level, level_to_var = level_to_var, newag = newag
114
+ v -> begin
115
+ level = current_level[]
116
+ # FIXME : only alias variables in the reachable set
117
+ if level + 1 <= length (level_to_var)
118
+ # TODO : make sure the coefficient is 1
119
+ newag[v] = 1 => level_to_var[level + 1 ]
120
+ else
121
+ @assert length (level_to_var) == level
122
+ push! (level_to_var, v)
123
+ end
124
+ current_level[] += 1
113
125
end
114
126
end
115
- empty! (relative_level)
116
- level_to_var = Int[r]
117
- v′′:: Union{Nothing, Int} = v′:: Int = r
118
- while (v′′ = var_to_diff[v′]) != = nothing
119
- v′ = v′′
120
- push! (level_to_var, v′)
127
+ for (v, rl) in pairs (relative_level)
128
+ @assert diff_to_var[v] === nothing
129
+ v == r && continue
130
+ current_level[] = rl - rootlv
131
+ extreme_var (var_to_diff, v, nothing , Val (false ), callback = add_alias!)
121
132
end
122
- nlevels = length (level_to_var )
133
+ empty! (relative_level )
123
134
if nlevels < (new_nlevels = length (level_to_var))
124
135
@assert ! (D isa Nothing)
125
136
for i in (nlevels + 1 ): new_nlevels
@@ -128,6 +139,15 @@ function alias_elimination(sys)
128
139
end
129
140
end
130
141
end
142
+ newkeys = keys (newag)
143
+ for (v, (c, a)) in ag
144
+ (v in newkeys || a in newkeys) && continue
145
+ newag[v] = c => a
146
+ end
147
+ ag = newag
148
+ for (v, (c, a)) in ag
149
+ @warn " new alias" fullvars[v] => (c, fullvars[a])
150
+ end
131
151
132
152
subs = Dict ()
133
153
for (v, (coeff, alias)) in pairs (ag)
@@ -471,7 +491,6 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
471
491
# Kind of like the backward substitution, but we don't actually rely on it
472
492
# being lower triangular. We eliminate a variable if there are at most 2
473
493
# variables left after the substitution.
474
- diff_to_var = invview (var_to_diff)
475
494
function lss! (ei:: Integer )
476
495
vi = pivots[ei]
477
496
locally_structure_simplify! ((@view mm[ei, :]), vi, ag, var_to_diff)
0 commit comments