Skip to content

Commit 98f9bf0

Browse files
committed
Add actives for all solvers and test
1 parent 0396c6f commit 98f9bf0

File tree

14 files changed

+149
-44
lines changed

14 files changed

+149
-44
lines changed

Project.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ julia = "1.6, 1.8"
1616

1717
[extras]
1818
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
19+
OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
1920
SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f"
2021
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
2122

2223
[targets]
23-
test = ["LinearAlgebra", "Test", "SafeTestsets"]
24+
test = ["LinearAlgebra", "OrderedCollections", "Test", "SafeTestsets"]

benchmark/adjacency_matrix.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,6 @@ A = [
7272

7373
A[13,21] = A[21,13] = 1
7474
A[16,30] = A[30,16] = 1
75-
A[20,36] = A[36,20] = 1
75+
A[20,36] = A[36,20] = 1
76+
77+
N = size(A)[1]

benchmark/example_benchmark.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ function initialize!_posdef!(system::System{N}) where N
1212
end
1313

1414

15-
system = System{Float64}(A, ones(Int,size(A)[1])*3)
16-
systemldlt = System{Float64}(A, ones(Int,size(A)[1])*3, symmetric=true)
17-
systemllt = System{Float64}(A, ones(Int,size(A)[1])*3, symmetric=true)
15+
system = System{Float64}(A, ones(Int,N)*3)
16+
systemldlt = System{Float64}(A, ones(Int,N)*3, symmetric=true)
17+
systemllt = System{Float64}(A, ones(Int,N)*3, symmetric=true)
1818

1919
SUITE["sparse_ldu"] = @benchmarkable ldu_solve!($system) setup=(initialize!($system))
2020
SUITE["sparse_lu"] = @benchmarkable lu_solve!($system) setup=(initialize!($system))

src/solvers/ldlt.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,20 @@ function ldlt_factorization!(system::System)
2323
diagonal_inverses = system.diagonal_inverses
2424
acyclic_children = system.acyclic_children
2525
cyclic_children = system.cyclic_children
26+
actives = system.actives
2627

2728
reset_inverse_diagonals!(system)
2829

2930
for v in system.dfs_list
31+
!actives[v] && continue
3032
for c in acyclic_children[v]
33+
!actives[c] && continue
3134
ldlt_factorization_acyclic!(matrix_entries[v,v], matrix_entries[v,c], matrix_entries[c,c], diagonal_inverses[c])
3235
end
3336
for c in cyclic_children[v]
37+
!actives[c] && continue
3438
for cc in cyclic_children[v]
39+
!actives[cc] && continue
3540
cc == c && break
3641
(cc acyclic_children[c] && cc cyclic_children[c]) && continue
3742
ldlt_factorization_cyclic!(matrix_entries[v,c], matrix_entries[v,cc], matrix_entries[cc,cc], matrix_entries[c,cc])
@@ -67,18 +72,24 @@ function ldlt_backsubstitution!(system::System)
6772
cyclic_children = system.cyclic_children
6873
parents = system.parents
6974
dfs_list = system.dfs_list
75+
actives = system.actives
7076

7177
for v in dfs_list
78+
!actives[v] && continue
7279
for c in cyclic_children[v]
80+
!actives[c] && continue
7381
ldlt_backsubstitution_l!(vector_entries[v], matrix_entries[v,c], vector_entries[c])
7482
end
7583
for c in acyclic_children[v]
84+
!actives[c] && continue
7685
ldlt_backsubstitution_l!(vector_entries[v], matrix_entries[v,c], vector_entries[c])
7786
end
7887
end
7988
for v in reverse(dfs_list)
89+
!actives[v] && continue
8090
ldlt_backsubstitution_d!(vector_entries[v], matrix_entries[v,v], diagonal_inverses[v])
8191
for p in parents[v]
92+
!actives[p] && continue
8293
ldlt_backsubstitution_lt!(vector_entries[v], matrix_entries[p,v], vector_entries[p])
8394
end
8495
end

src/solvers/ldu.jl

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,20 @@ function ldu_factorization!(system::System)
2323
diagonal_inverses = system.diagonal_inverses
2424
acyclic_children = system.acyclic_children
2525
cyclic_children = system.cyclic_children
26-
active = system.active
26+
actives = system.actives
2727

2828
reset_inverse_diagonals!(system)
2929

3030
for v in system.dfs_list
31-
!active[v] && continue
32-
31+
!actives[v] && continue
3332
for c in acyclic_children[v]
34-
!active[c] && continue
33+
!actives[c] && continue
3534
ldu_factorization_acyclic!(matrix_entries[v,v], matrix_entries[v,c], matrix_entries[c,c], matrix_entries[c,v], diagonal_inverses[c])
3635
end
3736
for c in cyclic_children[v]
38-
!active[c] && continue
37+
!actives[c] && continue
3938
for cc in cyclic_children[v]
40-
!active[cc] && continue
39+
!actives[cc] && continue
4140
cc == c && break
4241
(cc acyclic_children[c] && cc cyclic_children[c]) && continue
4342
ldu_factorization_cyclic!(matrix_entries[v,c], matrix_entries[v,cc], matrix_entries[cc,cc], matrix_entries[cc,c])
@@ -74,24 +73,24 @@ function ldu_backsubstitution!(system::System)
7473
cyclic_children = system.cyclic_children
7574
parents = system.parents
7675
dfs_list = system.dfs_list
77-
active = system.active
76+
actives = system.actives
7877

7978
for v in dfs_list
80-
!active[v] && continue
79+
!actives[v] && continue
8180
for c in cyclic_children[v]
82-
!active[c] && continue
81+
!actives[c] && continue
8382
ldu_backsubstitution_l!(vector_entries[v], matrix_entries[v,c], vector_entries[c])
8483
end
8584
for c in acyclic_children[v]
86-
!active[c] && continue
85+
!actives[c] && continue
8786
ldu_backsubstitution_l!(vector_entries[v], matrix_entries[v,c], vector_entries[c])
8887
end
8988
end
9089
for v in reverse(dfs_list)
91-
!active[v] && continue
90+
!actives[v] && continue
9291
ldu_backsubstitution_d!(vector_entries[v], matrix_entries[v,v], diagonal_inverses[v])
9392
for p in parents[v]
94-
!active[p] && continue
93+
!actives[p] && continue
9594
ldu_backsubstitution_u!(vector_entries[v], matrix_entries[v,p], vector_entries[p])
9695
end
9796
end

src/solvers/llt.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,20 @@ function llt_factorization!(system::System)
2727
diagonal_inverses = system.diagonal_inverses
2828
acyclic_children = system.acyclic_children
2929
cyclic_children = system.cyclic_children
30+
actives = system.actives
3031

3132
reset_inverse_diagonals!(system)
3233

3334
for v in system.dfs_list
35+
!actives[v] && continue
3436
for c in acyclic_children[v]
37+
!actives[c] && continue
3538
llt_factorization_acyclic!(matrix_entries[v,v], matrix_entries[v,c], matrix_entries[c,c], diagonal_inverses[c])
3639
end
3740
for c in cyclic_children[v]
41+
!actives[c] && continue
3842
for cc in cyclic_children[v]
43+
!actives[cc] && continue
3944
cc == c && break
4045
(cc acyclic_children[c] && cc cyclic_children[c]) && continue
4146
llt_factorization_cyclic!(matrix_entries[v,c], matrix_entries[v,cc], matrix_entries[c,cc])
@@ -72,18 +77,24 @@ function llt_backsubstitution!(system::System)
7277
cyclic_children = system.cyclic_children
7378
parents = system.parents
7479
dfs_list = system.dfs_list
80+
actives = system.actives
7581

7682
for v in dfs_list
83+
!actives[v] && continue
7784
for c in cyclic_children[v]
85+
!actives[c] && continue
7886
llt_backsubstitution_l!(vector_entries[v], matrix_entries[v,c], vector_entries[c])
7987
end
8088
for c in acyclic_children[v]
89+
!actives[c] && continue
8190
llt_backsubstitution_l!(vector_entries[v], matrix_entries[v,c], vector_entries[c])
8291
end
8392
llt_backsubstitution_d!(vector_entries[v], matrix_entries[v,v], diagonal_inverses[v])
8493
end
8594
for v in reverse(dfs_list)
95+
!actives[v] && continue
8696
for p in parents[v]
97+
!actives[p] && continue
8798
llt_backsubstitution_lt!(vector_entries[v], matrix_entries[p,v], vector_entries[p])
8899
end
89100
llt_backsubstitution_d!(vector_entries[v], matrix_entries[v,v], diagonal_inverses[v])

src/solvers/lu.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,20 @@ function lu_factorization!(system::System)
2222
diagonal_inverses = system.diagonal_inverses
2323
acyclic_children = system.acyclic_children
2424
cyclic_children = system.cyclic_children
25+
actives = system.actives
2526

2627
reset_inverse_diagonals!(system)
2728

2829
for v in system.dfs_list
30+
!actives[v] && continue
2931
for c in acyclic_children[v]
32+
!actives[c] && continue
3033
lu_factorization_acyclic!(matrix_entries[v,v], matrix_entries[v,c], matrix_entries[c,c], matrix_entries[c,v], diagonal_inverses[c])
3134
end
3235
for c in cyclic_children[v]
36+
!actives[c] && continue
3337
for cc in cyclic_children[v]
38+
!actives[cc] && continue
3439
cc == c && break
3540
(cc acyclic_children[c] && cc cyclic_children[c]) && continue
3641
lu_factorization_cyclic!(matrix_entries[v,c], matrix_entries[v,cc], matrix_entries[cc,c])
@@ -67,17 +72,23 @@ function lu_backsubstitution!(system::System)
6772
cyclic_children = system.cyclic_children
6873
parents = system.parents
6974
dfs_list = system.dfs_list
75+
actives = system.actives
7076

7177
for v in dfs_list
78+
!actives[v] && continue
7279
for c in cyclic_children[v]
80+
!actives[c] && continue
7381
lu_backsubstitution_l!(vector_entries[v], matrix_entries[v,c], vector_entries[c])
7482
end
7583
for c in acyclic_children[v]
84+
!actives[c] && continue
7685
lu_backsubstitution_l!(vector_entries[v], matrix_entries[v,c], vector_entries[c])
7786
end
7887
end
7988
for v in reverse(dfs_list)
89+
!actives[v] && continue
8090
for p in parents[v]
91+
!actives[p] && continue
8192
lu_backsubstitution_u!(vector_entries[v], matrix_entries[v,p], vector_entries[p])
8293
end
8394
lu_backsubstitution_d!(vector_entries[v], matrix_entries[v,v], diagonal_inverses[v])

src/system/interface.jl

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,18 @@
22
@inline connections(system::System, v) = neighbors(system.graph, v) # all connected nodes of v
33
@inline parents(system::System, v) = inneighbors(system.dfs_graph, v) # same elements as system.parents[v], but potentially different order
44

5-
function ranges(system::System{N}) where N
6-
dims = system.dims
7-
range_dict = Dict(1=>1:dims[1])
8-
for i=2:N
9-
range_dict[i] = last(range_dict[i-1])+1:sum(dims[1:i])
10-
end
115

12-
return range_dict
13-
end
14-
function ranges(dims::AbstractVector)
6+
ranges(system::System{N}; actives = sones(Bool, N)) where N = ranges(system.dims; actives)
7+
function ranges(dims::AbstractVector; actives = sones(Bool, size(dims)[1]))
158
range_dict = Dict(1=>1:dims[1])
169
for i=2:size(dims)[1]
1710
range_dict[i] = last(range_dict[i-1])+1:sum(dims[1:i])
1811
end
1912

13+
for i=1:size(dims)[1]
14+
!actives[i] && delete!(range_dict,i)
15+
end
16+
2017
return range_dict
2118
end
2219

src/system/system.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ mutable struct System{N,S}
88
acyclic_children::Vector{Vector{Int64}} # contains direct children that are not part of a cycle
99
cyclic_children::Vector{Vector{Int64}} # contains direct and indirect children that are part of a cycle (in dfs_list order)
1010
parents::Vector{Vector{Int64}} # contains direct and cycle-opening parents
11-
active::SVector{N,Bool} # indicates if the node should be considered or not
11+
actives::SVector{N,Bool} # indicates if the node should be considered or not
1212
dfs_list::SVector{N,Int64} # depth-first search list of nodes [last-found node, ..., first-found node]
1313
graph::SimpleGraph{Int64} # the graph built from the adjacency matrix
1414
dfs_graph::SimpleDiGraph{Int64} # the directed graph built from the depth-first search

test/adjacency_matrix.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,6 @@ A = [
7272

7373
A[13,21] = A[21,13] = 1
7474
A[16,30] = A[30,16] = 1
75-
A[20,36] = A[36,20] = 1
75+
A[20,36] = A[36,20] = 1
76+
77+
N = size(A)[1]

0 commit comments

Comments
 (0)