Skip to content

Commit 535fab9

Browse files
committed
add verbosity types
1 parent cb5fdc9 commit 535fab9

File tree

1 file changed

+178
-0
lines changed

1 file changed

+178
-0
lines changed

src/verbosity.jl

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
# Linear Verbosity
2+
3+
linear_defaults = Dict(
4+
:default_lu_fallback => Verbosity.Warn(),
5+
:no_right_preconditioning => Verbosity.Warn(),
6+
:using_iterative_solvers => Verbosity.Warn(),
7+
:using_IterativeSolvers => Verbosity.Warn(),
8+
:IterativeSolvers_iterations => Verbosity.Warn(),
9+
:KrylovKit_verbosity => Verbosity.Warn(),
10+
:KrylovJL_verbosity => Verbosity.None()
11+
)
12+
mutable struct LinearErrorControlVerbosity
13+
default_lu_fallback::Verbosity.Type
14+
15+
function LinearErrorControlVerbosity(;
16+
default_lu_fallback = linear_defaults[:default_lu_fallback])
17+
new(default_lu_fallback)
18+
end
19+
20+
function LinearErrorControlVerbosity(verbose::Verbosity.Type)
21+
@match verbose begin
22+
Verbosity.None() => new(fill(
23+
Verbosity.None(), length(fieldnames(LinearErrorControlVerbosity)))...)
24+
25+
Verbosity.Info() => new(fill(
26+
Verbosity.Info(), length(fieldnames(LinearErrorControlVerbosity)))...)
27+
28+
Verbosity.Warn() => new(fill(
29+
Verbosity.Warn(), length(fieldnames(LinearErrorControlVerbosity)))...)
30+
31+
Verbosity.Error() => new(fill(
32+
Verbosity.Error(), length(fieldnames(LinearErrorControlVerbosity)))...)
33+
34+
Verbosity.Default() => LinearErrorControlVerbosity()
35+
36+
Verbosity.Edge() => LinearErrorControlVerbosity()
37+
38+
_ => @error "Not a valid choice for verbosity."
39+
end
40+
end
41+
end
42+
43+
mutable struct LinearPerformanceVerbosity
44+
no_right_preconditioning::Verbosity.Type
45+
46+
function LinearPerformanceVerbosity(;
47+
no_right_preconditioning = linear_defaults[:no_right_preconditioning])
48+
new(no_right_preconditioning)
49+
end
50+
51+
function LinearPerformanceVerbosity(verbose::Verbosity.Type)
52+
@match verbose begin
53+
Verbosity.None() => new(fill(
54+
Verbosity.None(), length(fieldnames(LinearPerformanceVerbosity)))...)
55+
56+
Verbosity.Info() => new(fill(
57+
Verbosity.Info(), length(fieldnames(LinearPerformanceVerbosity)))...)
58+
59+
Verbosity.Warn() => new(fill(
60+
Verbosity.Warn(), length(fieldnames(LinearPerformanceVerbosity)))...)
61+
62+
Verbosity.Error() => new(fill(
63+
Verbosity.Error(), length(fieldnames(LinearPerformanceVerbosity)))...)
64+
65+
Verbosity.Default() => LinearPerformanceVerbosity()
66+
67+
Verbosity.Edge() => LinearPerformanceVerbosity()
68+
69+
_ => @error "Not a valid choice for verbosity."
70+
end
71+
end
72+
end
73+
74+
mutable struct LinearNumericalVerbosity
75+
using_IterativeSolvers::Verbosity.Type
76+
IterativeSolvers_iterations::Verbosity.Type
77+
KrylovKit_verbosity::Verbosity.Type
78+
KrylovJL_verbosity::Verbosity.Type
79+
80+
function LinearNumericalVerbosity(;
81+
using_IterativeSolvers = linear_defaults[:using_IterativeSolvers],
82+
IterativeSolvers_iterations = linear_defaults[:IterativeSolvers_iterations],
83+
KrylovKit_verbosity = linear_defaults[:KrylovKit_verbosity],
84+
KrylovJL_verbosity = linear_defaults[:KrylovJL_verbosity])
85+
new(using_IterativeSolvers, IterativeSolvers_iterations,
86+
KrylovKit_verbosity, KrylovJL_verbosity)
87+
end
88+
89+
function LinearNumericalVerbosity(verbose::Verbosity.Type)
90+
@match verbose begin
91+
Verbosity.None() => new(fill(
92+
Verbosity.None(), length(fieldnames(LinearNumericalVerbosity)))...)
93+
94+
Verbosity.Info() => new(fill(
95+
Verbosity.Info(), length(fieldnames(LinearNumericalVerbosity)))...)
96+
97+
Verbosity.Warn() => new(fill(
98+
Verbosity.Warn(), length(fieldnames(LinearNumericalVerbosity)))...)
99+
100+
Verbosity.Error() => new(fill(
101+
Verbosity.Error(), length(fieldnames(LinearNumericalVerbosity)))...)
102+
103+
Verbosity.Default() => LinearNumericalVerbosity()
104+
105+
Verbosity.Edge() => LinearNumericalVerbosity()
106+
107+
_ => @error "Not a valid choice for verbosity."
108+
end
109+
end
110+
end
111+
112+
struct LinearVerbosity{T} <: AbstractVerbositySpecifier{T}
113+
error_control::LinearErrorControlVerbosity
114+
performance::LinearPerformanceVerbosity
115+
numerical::LinearNumericalVerbosity
116+
end
117+
118+
function LinearVerbosity(verbose::Verbosity.Type)
119+
@match verbose begin
120+
Verbosity.Default() => LinearVerbosity{true}(
121+
LinearErrorControlVerbosity(Verbosity.Default()),
122+
LinearPerformanceVerbosity(Verbosity.Default()),
123+
LinearNumericalVerbosity(Verbosity.Default())
124+
)
125+
126+
Verbosity.None() => LinearVerbosity{false}(
127+
LinearErrorControlVerbosity(Verbosity.None()),
128+
LinearPerformanceVerbosity(Verbosity.None()),
129+
LinearNumericalVerbosity(Verbosity.None()))
130+
131+
Verbosity.All() => LinearVerbosity{true}(
132+
LinearErrorControlVerbosity(Verbosity.Info()),
133+
LinearPerformanceVerbosity(Verbosity.Info()),
134+
LinearNumericalVerbosity(Verbosity.Info())
135+
)
136+
137+
_ => @error "Not a valid choice for LinearVerbosity. Available choices are `Default`, `None`, and `All`."
138+
end
139+
end
140+
141+
function LinearVerbosity(;
142+
error_control = Verbosity.Default(), performance = Verbosity.Default(),
143+
numerical = Verbosity.Default(), kwargs...)
144+
if error_control isa Verbosity.Type
145+
error_control_verbosity = LinearErrorControlVerbosity(error_control)
146+
else
147+
error_control_verbosity = error_control
148+
end
149+
150+
if performance isa Verbosity.Type
151+
performance_verbosity = LinearPerformanceVerbosity(performance)
152+
else
153+
performance_verbosity = performance
154+
end
155+
156+
if numerical isa Verbosity.Type
157+
numerical_verbosity = LinearNumericalVerbosity(numerical)
158+
else
159+
numerical_verbosity = numerical
160+
end
161+
162+
if !isempty(kwargs)
163+
for (key, value) in pairs(kwargs)
164+
if hasfield(LinearErrorControlVerbosity, key)
165+
setproperty!(error_control_verbosity, key, value)
166+
elseif hasfield(LinearPerformanceVerbosity, key)
167+
setproperty!(performance_verbosity, key, value)
168+
elseif hasfield(LinearNumericalVerbosity, key)
169+
setproperty!(numerical_verbosity, key, value)
170+
else
171+
error("$key is not a recognized verbosity toggle.")
172+
end
173+
end
174+
end
175+
176+
LinearVerbosity{true}(error_control_verbosity,
177+
performance_verbosity, numerical_verbosity)
178+
end

0 commit comments

Comments
 (0)