/
initval_algorithm.jl
106 lines (76 loc) · 2.97 KB
/
initval_algorithm.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# This file is a part of BAT.jl, licensed under the MIT License (MIT).
"""
abstract type BAT.InitvalAlgorithm
Abstract type for BAT initial/starting value generation algorithms.
Many algorithms in BAT, like MCMC and optimization, need initial/starting
values.
"""
abstract type InitvalAlgorithm end
export InitvalAlgorithm
"""
bat_initval(
target::BAT.MeasureLike,
[algorithm::BAT.InitvalAlgorithm],
[context::BATContext]
)::V
bat_initval(
target::BAT.MeasureLike,
n::Integer,
[algorithm::BAT.InitvalAlgorithm],
[context::BATContext]
)::AbstractVector{<:V}
Generate one or `n` random initial/starting value(s) suitable for
`target`.
Assuming the variates of `target` are of type `T`, returns a NamedTuple of
the shape
```julia
(result = X::AbstractVector{T}, ...)
```
Result properties not listed here are algorithm-specific and are not part
of the stable public API.
!!! note
Do not add add methods to `bat_initval`, add methods like
```julia
bat_initval_impl(target::MeasureLike, algorithm::InitvalAlgorithm, context::BATContext)
bat_initval_impl(target::MeasureLike, n::Integer, algorithm::InitvalAlgorithm, context::BATContext)
```
to `bat_initval_impl` instead.
"""
function bat_initval end
export bat_initval
function bat_initval_impl end
@inline function bat_initval(target::MeasureLike, algorithm::InitvalAlgorithm, context::BATContext)
orig_context = deepcopy(context)
r = bat_initval_impl(target, algorithm, context)
result_with_args(r, (algorithm = algorithm, context = orig_context))
end
@inline function bat_initval(target::MeasureLike, algorithm::InitvalAlgorithm)
bat_initval(target, algorithm, get_batcontext())
end
@inline function bat_initval(target::MeasureLike)
bat_initval(target, get_batcontext())
end
@inline function bat_initval(target::MeasureLike, context::BATContext)
algorithm = bat_default_withinfo(bat_initval, Val(:algorithm), target)
bat_initval(target, algorithm, context)
end
@inline function bat_initval(target::MeasureLike, n::Integer, algorithm::InitvalAlgorithm, context::BATContext)
orig_context = deepcopy(context)
r = bat_initval_impl(target, n, algorithm, context)
result_with_args(r, (algorithm = algorithm, context = orig_context))
end
@inline function bat_initval(target::MeasureLike, n::Integer)
bat_initval(target, n, get_batcontext())
end
@inline function bat_initval(target::MeasureLike, n::Integer, algorithm::InitvalAlgorithm)
bat_initval(target, n, algorithm, get_batcontext())
end
@inline function bat_initval(target::MeasureLike, n::Integer, context::BATContext)
algorithm = bat_default_withinfo(bat_initval, Val(:algorithm), target)
bat_initval(target, n, algorithm, context)
end
function argchoice_msg(::typeof(bat_initval), ::Val{:algorithm}, x::InitvalAlgorithm)
"Using initval algorithm $x"
end
# Internal for now:
apply_trafo_to_init(trafo::Function, initalg::InitvalAlgorithm) = initalg