Skip to content

Commit e4bb835

Browse files
authored
Merge pull request #2 from janbruedigam/custom_dict
Speed up
2 parents b6ed342 + ec53e33 commit e4bb835

14 files changed

+251
-249
lines changed

Project.toml

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ version = "0.1.1"
55

66
[deps]
77
LightGraphs = "093fc24a-ae57-5d10-9952-331d41423f4d"
8+
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
89
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
910

1011
[compat]

src/GraphBasedSystems.jl

+9-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
module GraphBasedSystems
22

3+
using SparseArrays
34
using StaticArrays
45
using LightGraphs
56

@@ -14,15 +15,15 @@ export System,
1415
ldu_solve!
1516

1617

17-
include("custom_static.jl")
18+
include(joinpath("util", "custom_static.jl"))
1819

19-
include("entry.jl")
20-
include("system.jl")
21-
include("setup_functions.jl")
20+
include(joinpath("system", "entry.jl"))
21+
include(joinpath("system", "system.jl"))
22+
include(joinpath("system", "setup_functions.jl"))
2223

23-
# include("lu.jl")
24-
# include("llt.jl")
25-
# include("ldlt.jl")
26-
include("ldu.jl")
24+
include(joinpath("solvers", "lu.jl"))
25+
include(joinpath("solvers", "llt.jl"))
26+
include(joinpath("solvers", "ldlt.jl"))
27+
include(joinpath("solvers", "ldu.jl"))
2728

2829
end

src/entry.jl

-15
This file was deleted.

src/ldu.jl

-86
This file was deleted.
File renamed without changes.

src/solvers/ldu.jl

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
# LDU factorization for unsymmetric systems
2+
3+
function ldu_factorization_acyclic!(diagonal_v, offdiagonal_l, diagonal_c, offdiagonal_u, diagonal_inverse_c)
4+
if diagonal_inverse_c.isinverted
5+
invdiagonal_c = diagonal_inverse_c.value
6+
else
7+
invdiagonal_c = inv(diagonal_c.value)
8+
diagonal_inverse_c.value = invdiagonal_c
9+
diagonal_inverse_c.isinverted = true
10+
end
11+
offdiagonal_l.value = offdiagonal_l.value * invdiagonal_c
12+
offdiagonal_u.value = invdiagonal_c * offdiagonal_u.value
13+
diagonal_v.value -= offdiagonal_l.value*diagonal_c.value*offdiagonal_u.value
14+
return
15+
end
16+
function ldu_factorization_cyclic!(entry_lu, offdiagonal_lu, diagonal_c, offdiagonal_ul)
17+
entry_lu.value -= offdiagonal_lu.value*diagonal_c.value*offdiagonal_ul.value
18+
return
19+
end
20+
21+
function ldu_factorization!(system)
22+
matrix_entries = system.matrix_entries
23+
diagonal_inverses = system.diagonal_inverses
24+
acyclic_children = system.acyclic_children
25+
cycles = system.cycles
26+
27+
for v in system.dfs_list
28+
for cyclic_children in cycles[v]
29+
for c in cyclic_children
30+
for cc in cyclic_children
31+
cc == c && break
32+
cc acyclic_children[c] && continue
33+
ldu_factorization_cyclic!(matrix_entries[v,c], matrix_entries[v,cc], matrix_entries[cc,cc], matrix_entries[cc,c])
34+
ldu_factorization_cyclic!(matrix_entries[c,v], matrix_entries[c,cc], matrix_entries[cc,cc], matrix_entries[cc,v])
35+
end
36+
ldu_factorization_acyclic!(matrix_entries[v,v], matrix_entries[v,c], matrix_entries[c,c], matrix_entries[c,v], diagonal_inverses[c])
37+
end
38+
end
39+
for c in acyclic_children[v]
40+
ldu_factorization_acyclic!(matrix_entries[v,v], matrix_entries[v,c], matrix_entries[c,c], matrix_entries[c,v], diagonal_inverses[c])
41+
end
42+
end
43+
return
44+
end
45+
46+
function ldu_backsubstitution_l!(vector_v, offdiagonal, vector_c)
47+
vector_v.value -= offdiagonal.value*vector_c.value
48+
return
49+
end
50+
function ldu_backsubstitution_u!(vector_v, offdiagonal, vector_p)
51+
vector_v.value -= offdiagonal.value*vector_p.value
52+
return
53+
end
54+
function ldu_backsubstitution_d!(vector, diagonal, diagonal_inverse)
55+
if diagonal_inverse.isinverted
56+
vector.value = diagonal_inverse.value*vector.value
57+
else
58+
vector.value = diagonal.value\vector.value
59+
end
60+
diagonal_inverse.isinverted = false
61+
return
62+
end
63+
64+
function ldu_backsubstitution!(system)
65+
matrix_entries = system.matrix_entries
66+
diagonal_inverses = system.diagonal_inverses
67+
vector_entries = system.vector_entries
68+
acyclic_children = system.acyclic_children
69+
cycles = system.cycles
70+
parents = system.parents
71+
dfs_list = system.dfs_list
72+
73+
for v in dfs_list
74+
for cyclic_children in cycles[v]
75+
for c in cyclic_children
76+
ldu_backsubstitution_l!(vector_entries[v], matrix_entries[v,c], vector_entries[c])
77+
end
78+
end
79+
for c in acyclic_children[v]
80+
ldu_backsubstitution_l!(vector_entries[v], matrix_entries[v,c], vector_entries[c])
81+
end
82+
end
83+
for v in reverse(dfs_list)
84+
ldu_backsubstitution_d!(vector_entries[v], matrix_entries[v,v], diagonal_inverses[v])
85+
for p in parents[v]
86+
ldu_backsubstitution_u!(vector_entries[v], matrix_entries[v,p], vector_entries[p])
87+
end
88+
end
89+
end
90+
91+
function ldu_solve!(system)
92+
ldu_factorization!(system)
93+
ldu_backsubstitution!(system)
94+
return
95+
end
File renamed without changes.
File renamed without changes.

src/system.jl

-129
This file was deleted.

0 commit comments

Comments
 (0)