Skip to content

Commit 978b869

Browse files
committed
Add AliasGraph updating code
1 parent 7f6548c commit 978b869

File tree

1 file changed

+35
-16
lines changed

1 file changed

+35
-16
lines changed

src/systems/alias_elimination.jl

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -99,27 +99,38 @@ function alias_elimination(sys)
9999

100100
# TODO: use an iterator, and get a relative level vector for `processed`
101101
# 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)
106104
let
107105
sv = fullvars[v]
108106
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
113125
end
114126
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!)
121132
end
122-
nlevels = length(level_to_var)
133+
empty!(relative_level)
123134
if nlevels < (new_nlevels = length(level_to_var))
124135
@assert !(D isa Nothing)
125136
for i in (nlevels + 1):new_nlevels
@@ -128,6 +139,15 @@ function alias_elimination(sys)
128139
end
129140
end
130141
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
131151

132152
subs = Dict()
133153
for (v, (coeff, alias)) in pairs(ag)
@@ -471,7 +491,6 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
471491
# Kind of like the backward substitution, but we don't actually rely on it
472492
# being lower triangular. We eliminate a variable if there are at most 2
473493
# variables left after the substitution.
474-
diff_to_var = invview(var_to_diff)
475494
function lss!(ei::Integer)
476495
vi = pivots[ei]
477496
locally_structure_simplify!((@view mm[ei, :]), vi, ag, var_to_diff)

0 commit comments

Comments
 (0)