@@ -38,66 +38,30 @@ function flatten(::Type{T}, X::Orthogonal) where {T<:Real}
38
38
return v, unflatten_Orthogonal
39
39
end
40
40
41
- """
42
- positive_semidefinite(X::AbstractMatrix{<:Real})
43
-
44
- Produce a parameter whose `value` is constrained to be a positive-semidefinite matrix. The
45
- argument `X` needs to be a positive-definite matrix
46
- (see https://en.wikipedia.org/wiki/Definite_matrix).
47
-
48
- The unconstrained parameter is a `LowerTriangular` matrix, stored as a vector.
49
-
50
- !!! warning
51
- Even though the matrix needs to be positive-definite upon construction, the
52
- unconstrained parameter can become zero, which represents a matrix which is merely
53
- positive-semidefinite. To get a matrix that is always strictly positive-definite, use
54
- `positive_definite`.
55
- """
56
- function positive_semidefinite (X:: AbstractMatrix{<:Real} )
57
- isposdef (X) || throw (ArgumentError (" X is not positive-definite" ))
58
- return PositiveSemiDefinite (tril_to_vec (cholesky (X). L))
59
- end
60
-
61
41
"""
62
42
positive_definite(X::AbstractMatrix{<:Real}, ε = eps(T))
63
43
64
- Produce a parameter whose `value` is constrained to be a strictly positive-semidefinite
44
+ Produce a parameter whose `value` is constrained to be a strictly positive-definite
65
45
matrix. The argument `X` minus `ε` times the identity needs to be a positive-definite matrix
66
46
(see https://en.wikipedia.org/wiki/Definite_matrix). The optional second argument `ε` must
67
47
be a positive real number.
68
48
69
49
The unconstrained parameter is a `LowerTriangular` matrix, stored as a vector.
70
50
"""
71
51
function positive_definite (X:: AbstractMatrix{T} , ε= eps (T)) where {T<: Real }
72
- ε > 0 || throw (ArgumentError (" ε is not positive. Use `positive_semidefinite` instead ." ))
52
+ ε > 0 || throw (ArgumentError (" ε must be positive." ))
73
53
_X = X - ε * I
74
54
isposdef (_X) || throw (ArgumentError (" X-ε*I is not positive-definite for ε=$ε " ))
75
55
return PositiveDefinite (tril_to_vec (cholesky (_X). L), ε)
76
56
end
77
57
78
- struct PositiveSemiDefinite{TL<: AbstractVector{<:Real} } <: AbstractParameter
79
- L:: TL
80
- end
81
-
82
- Base.:(== )(X:: PositiveSemiDefinite , Y:: PositiveSemiDefinite ) = X. L == Y. L
83
-
84
- A_At (X) = X * X'
85
-
86
- value (X:: PositiveSemiDefinite ) = A_At (vec_to_tril (X. L))
87
-
88
- function flatten (:: Type{T} , X:: PositiveSemiDefinite ) where {T<: Real }
89
- v, unflatten_v = flatten (T, X. L)
90
- function unflatten_PositiveSemiDefinite (v_new:: Vector{T} )
91
- return PositiveSemiDefinite (unflatten_v (v_new))
92
- end
93
- return v, unflatten_PositiveSemiDefinite
94
- end
95
-
96
58
struct PositiveDefinite{TL<: AbstractVector{<:Real} ,Tε<: Real } <: AbstractParameter
97
59
L:: TL
98
60
ε:: T ε
99
61
end
100
62
63
+ A_At (X) = X * X'
64
+
101
65
Base.:(== )(X:: PositiveDefinite , Y:: PositiveDefinite ) = X. L == Y. L && X. ε == Y. ε
102
66
103
67
value (X:: PositiveDefinite ) = A_At (vec_to_tril (X. L)) + X. ε * I
0 commit comments