@@ -2,7 +2,7 @@ using SymbolicUtils: Rewriters
2
2
3
3
const KEEP = typemin (Int)
4
4
5
- function alias_eliminate (sys)
5
+ function alias_elimination (sys)
6
6
sys = flatten (sys)
7
7
s = get_structure (sys)
8
8
if ! (s isa SystemStructure)
@@ -30,7 +30,7 @@ function alias_eliminate(sys)
30
30
dels = Int[]
31
31
eqs = copy (equations (sys))
32
32
for (ei, e) in enumerate (linear_equations)
33
- vs = 𝑠vertices (graph, e)
33
+ vs = 𝑠neighbors (graph, e)
34
34
if isempty (vs)
35
35
push! (dels, e)
36
36
else
@@ -64,16 +64,16 @@ function alias_eliminate(sys)
64
64
return sys
65
65
end
66
66
67
- function alias_eliminate_graph (s:: SystemStructure , is_linear_variables , eadj, cadj)
67
+ function alias_eliminate_graph (s:: SystemStructure , is_linear_equations , eadj, cadj)
68
68
@unpack graph, varassoc = s
69
69
invvarassoc = inverse_mapping (varassoc)
70
70
71
71
old_cadj = map (copy, cadj)
72
72
73
73
is_not_potential_state = iszero .(varassoc)
74
74
is_linear_variables = copy (is_not_potential_state)
75
- for i in 𝑠edges (graph); is_linear_equations[i] || continue
76
- for j in 𝑠vertices (graph, i)
75
+ for i in 𝑠vertices (graph); is_linear_equations[i] || continue
76
+ for j in 𝑠neighbors (graph, i)
77
77
is_linear_variables[j] = false
78
78
end
79
79
end
@@ -83,11 +83,11 @@ function alias_eliminate_graph(s::SystemStructure, is_linear_variables, eadj, ca
83
83
84
84
85
85
rank1 = bareiss! (
86
- (eadg , cadj),
86
+ (eadj , cadj),
87
87
old_cadj, linear_equations, is_linear_variables, 1
88
88
)
89
89
90
- v_solved = [eadg [i][1 ] for i in 1 : rank1]
90
+ v_solved = [eadj [i][1 ] for i in 1 : rank1]
91
91
v_eliminated = setdiff (solvable_variables, v_solved)
92
92
n_null_vars = length (v_eliminated)
93
93
@@ -97,41 +97,42 @@ function alias_eliminate_graph(s::SystemStructure, is_linear_variables, eadj, ca
97
97
end
98
98
99
99
rank2 = bareiss! (
100
- (eadg , cadj),
100
+ (eadj , cadj),
101
101
old_cadj, linear_equations, is_not_potential_state, rank1+ 1
102
102
)
103
103
104
104
rank3 = bareiss! (
105
- (eadg , cadj),
105
+ (eadj , cadj),
106
106
old_cadj, linear_equations, nothing , rank2+ 1
107
107
)
108
108
109
109
# kind of like the backward substitution
110
110
for ei in reverse (1 : rank2)
111
111
locally_structure_simplify! (
112
- (eadg [ei], cadj[ei]),
112
+ (eadj [ei], cadj[ei]),
113
113
invvarassoc, v_eliminated, v_types
114
114
)
115
115
end
116
116
117
117
reduced = false
118
118
for ei in 1 : rank2
119
- if length (cadj[ei]) > length (old_cadj[ei])
119
+ if length (cadj[ei]) >= length (old_cadj[ei])
120
120
cadj[ei] = old_cadj[ei]
121
121
else
122
- cadj[ei] = eadg[linear_equations[ei]]
122
+ # MEMORY ALIAS of a vector
123
+ eadj[ei] = 𝑠neighbors (graph, linear_equations[ei])
123
124
reduced |= locally_structure_simplify! (
124
- (eadg [ei], cadj[ei]),
125
+ (eadj [ei], cadj[ei]),
125
126
invvarassoc, v_eliminated, v_types
126
127
)
127
128
end
128
129
end
129
130
130
131
while reduced
131
132
for ei in 1 : rank2
132
- if ! isempty (eadg [ei])
133
+ if ! isempty (eadj [ei])
133
134
reduced |= locally_structure_simplify! (
134
- (eadg [ei], cadj[ei]),
135
+ (eadj [ei], cadj[ei]),
135
136
invvarassoc, v_eliminated, v_types
136
137
)
137
138
reduced && break # go back to the begining of equations
@@ -140,11 +141,11 @@ function alias_eliminate_graph(s::SystemStructure, is_linear_variables, eadj, ca
140
141
end
141
142
142
143
for ei in rank2+ 1 : length (linear_equations)
143
- eadg [ei] = old_cadj[ei]
144
+ eadj [ei] = old_cadj[ei]
144
145
end
145
146
146
147
for (ei, e) in enumerate (linear_equations)
147
- graph. eadglist [e] = eadg [ei]
148
+ graph. eadjlist [e] = eadj [ei]
148
149
end
149
150
150
151
degenerate_equations = rank3 < length (linear_equations) ? linear_equations[rank3+ 1 : end ] : Int[]
@@ -161,7 +162,7 @@ function locally_structure_simplify!(
161
162
(vars, coeffs),
162
163
invvarassoc, v_eliminated, v_types
163
164
)
164
- while length (vars) > 1 && any (! isequal (KEEP), (v_types[v] in @view vars[2 : end ]))
165
+ while length (vars) > 1 && any (! isequal (KEEP), (v_types[v] for v in @view vars[2 : end ]))
165
166
for vj in 2 : length (vars)
166
167
v = vars[vj]
167
168
if isirreducible (v_types, v)
@@ -208,7 +209,7 @@ function locally_structure_simplify!(
208
209
209
210
v = first (vars)
210
211
if invvarassoc[v] == 0
211
- if length (nvars ) == 1
212
+ if length (vars ) == 1
212
213
push! (v_eliminated, v)
213
214
v_types[v] = 0
214
215
empty! (vars); empty! (coeffs)
@@ -236,11 +237,11 @@ $(SIGNATURES)
236
237
Use Bareiss algorithm to compute the nullspace of an integer matrix exactly.
237
238
"""
238
239
function bareiss! (
239
- (eadg , cadj),
240
+ (eadj , cadj),
240
241
old_cadj, linear_equations, is_linear_variables, offset
241
242
)
242
- m = nsrcs (solvable_graph )
243
- # v = eadg [ei][vj]
243
+ m = length (eadj )
244
+ # v = eadj [ei][vj]
244
245
v = ei = vj = 0
245
246
pivot = last_pivot = 1
246
247
tmp_incidence = Int[]
@@ -256,46 +257,46 @@ function bareiss!(
256
257
# ##
257
258
# ## Pivoting:
258
259
# ##
259
- ei, vj = find_first_linear_variable (solvable_graph , k: m, is_linear_variables, isequal (1 ))
260
+ ei, vj = find_first_linear_variable (eadj , k: m, is_linear_variables, isequal (1 ))
260
261
if vj == 0
261
- ei, vj = find_first_linear_variable (solvable_graph , k: m, is_linear_variables, isequal (2 ))
262
+ ei, vj = find_first_linear_variable (eadj , k: m, is_linear_variables, isequal (2 ))
262
263
else
263
- ei, vj = find_first_linear_variable (solvable_graph , k: m, is_linear_variables, _-> true )
264
+ ei, vj = find_first_linear_variable (eadj , k: m, is_linear_variables, _-> true )
264
265
end
265
266
266
267
if vj > 0 # has a pivot
267
268
pivot = cadj[ei][vj]
268
269
deleteat! (cadj[ei] , vj)
269
- v = eadg [ei][vj]
270
- deleteat! (eadg [ei], vj)
270
+ v = eadj [ei][vj]
271
+ deleteat! (eadj [ei], vj)
271
272
if ei != k
272
273
swap! (cadj, ei, k)
273
274
swap! (old_cadj, ei, k)
274
- swap! (eadg , ei, k)
275
+ swap! (eadj , ei, k)
275
276
swap! (linear_equations, ei, k)
276
277
end
277
278
else # rank deficient
278
279
return k- 1
279
280
end
280
281
281
- for ei in k+ 1
282
+ for ei in k+ 1 : m
282
283
# elimate `v`
283
284
coeff = 0
284
- vars = eadg [ei]
285
+ vars = eadj [ei]
285
286
vj = findfirst (isequal (v), vars)
286
287
if vj === nothing # `v` is not in in `e`
287
288
continue
288
289
else # remove `v`
289
290
coeff = cadj[ei][vj]
290
291
deleteat! (cadj[ei], vj)
291
- deleteat! (eadg [ei], vj)
292
+ deleteat! (eadj [ei], vj)
292
293
end
293
294
294
295
# the pivot row
295
- kvars = eadg [k]
296
+ kvars = eadj [k]
296
297
kcoeffs = cadj[k]
297
298
# the elimination target
298
- ivars = eadg [ei]
299
+ ivars = eadj [ei]
299
300
icoeffs = cadj[ei]
300
301
301
302
empty! (tmp_incidence)
@@ -313,19 +314,19 @@ function bareiss!(
313
314
end
314
315
end
315
316
316
- eadg [ei], tmp_incidence = tmp_incidence, eadg [ei]
317
+ eadj [ei], tmp_incidence = tmp_incidence, eadj [ei]
317
318
cadj[ei], tmp_coeffs = tmp_coeffs, cadj[ei]
318
319
end
319
320
last_pivot = pivot
320
321
# add `v` in the front of the `k`-th equation
321
- pushfirst! (eadg [k], v)
322
+ pushfirst! (eadj [k], v)
322
323
pushfirst! (cadj[k], pivot)
323
324
end
324
325
325
326
return m # fully ranked
326
327
end
327
328
328
- swap! (v, i, j) = (( v[i], v[j] = v[j], v[i]); nothing )
329
+ swap! (v, i, j) = v[i], v[j] = v[j], v[i]
329
330
330
331
function getcoeff (vars, coeffs, var)
331
332
for (vj, v) in enumerate (vars)
@@ -337,17 +338,17 @@ end
337
338
"""
338
339
$(SIGNATURES)
339
340
340
- Find the first linear variable such that `𝑠vertices (adj, i)[j]` is true given
341
+ Find the first linear variable such that `𝑠neighbors (adj, i)[j]` is true given
341
342
the `constraint`.
342
343
"""
343
344
@inline function find_first_linear_variable (
344
- solvable_graph ,
345
+ eadj ,
345
346
range,
346
347
mask,
347
348
constraint,
348
349
)
349
350
for i in range
350
- vertices = 𝑠vertices (solvable_graph, i)
351
+ vertices = eadj[i]
351
352
if constraint (length (vertices))
352
353
for (j, v) in enumerate (vertices)
353
354
(mask === nothing || mask[v]) && return i, j
0 commit comments