Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bases for CholeskySpace and LogCholesky metric #780

Merged
merged 4 commits into from
Jan 10, 2025
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Merge remote-tracking branch 'origin/master' into mbaran/cholesky-bases
mateuszbaran committed Jan 10, 2025

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit 7937238a8cfe1bbaa4706c2dd1aa6419dc3c7fb4
6 changes: 5 additions & 1 deletion NEWS.md
Original file line number Diff line number Diff line change
@@ -5,13 +5,17 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.10.12] - unreleased
## [0.10.12] - 2025-01-10

### Added

* Orthonormal bases for `CholeskySpace` and `LogCholesky` metric for `SymmetricPositiveDefinite`.
* `rand` for `CholeskySpace`.

### Changed

* Improved performance of selected `get_vector` and `get_coordinates` methods for complex `Euclidean` manifold.

## [0.10.11] - 2025-01-02

### Added

Unchanged files with check annotations Beta

return q
end
function get_coordinates_orthonormal!(M::CholeskySpace, Xⁱ, p, X, ::RealNumbers)
n = get_parameter(M.size)[1]
view(Xⁱ, 1:n) .= diag(X)
xi_ind = n + 1
for i in 1:n
for j in (i + 1):n
Xⁱ[xi_ind] = X[j, i]
xi_ind += 1
end
end
return Xⁱ

Check warning on line 134 in src/manifolds/CholeskySpace.jl

Codecov / codecov/patch

src/manifolds/CholeskySpace.jl#L124-L134

Added lines #L124 - L134 were not covered by tests
end
function get_vector_orthonormal!(M::CholeskySpace, X, p, Xⁱ, ::RealNumbers)
n = get_parameter(M.size)[1]
fill!(X, 0)
view(X, diagind(X)) .= view(Xⁱ, 1:n) .* diag(p)
xi_ind = n + 1
for i in 1:n
for j in (i + 1):n
X[j, i] = Xⁱ[xi_ind]
xi_ind += 1
end
end
return X

Check warning on line 148 in src/manifolds/CholeskySpace.jl

Codecov / codecov/patch

src/manifolds/CholeskySpace.jl#L137-L148

Added lines #L137 - L148 were not covered by tests
end
@doc raw"""
return copyto!(Y, strictlyLowerTriangular(p) + Diagonal(diag(q) .* diag(X) ./ diag(p)))
end
function Random.rand!(

Check warning on line 258 in src/manifolds/CholeskySpace.jl

Codecov / codecov/patch

src/manifolds/CholeskySpace.jl#L258

Added line #L258 was not covered by tests
rng::AbstractRNG,
M::CholeskySpace,
pX;
(vector_at === nothing ? 1 : norm(convert(AbstractMatrix, vector_at))),
tangent_distr=:Gaussian,
)
N = get_parameter(M.size)[1]
if vector_at === nothing
p_spd = rand(

Check warning on line 269 in src/manifolds/CholeskySpace.jl

Codecov / codecov/patch

src/manifolds/CholeskySpace.jl#L267-L269

Added lines #L267 - L269 were not covered by tests
rng,
SymmetricPositiveDefinite(N; parameter=:field);
σ=σ,
tangent_distr=tangent_distr,
)
pX .= cholesky(p_spd).L

Check warning on line 275 in src/manifolds/CholeskySpace.jl

Codecov / codecov/patch

src/manifolds/CholeskySpace.jl#L275

Added line #L275 was not covered by tests
else
p_spd = vector_at * vector_at'
X_spd = rand(

Check warning on line 278 in src/manifolds/CholeskySpace.jl

Codecov / codecov/patch

src/manifolds/CholeskySpace.jl#L277-L278

Added lines #L277 - L278 were not covered by tests
rng,
SymmetricPositiveDefinite(N; parameter=:field);
vector_at=p_spd,
σ=σ,
tangent_distr=tangent_distr,
)
pX .= spd_to_cholesky(p_spd, X_spd)[2]

Check warning on line 285 in src/manifolds/CholeskySpace.jl

Codecov / codecov/patch

src/manifolds/CholeskySpace.jl#L285

Added line #L285 was not covered by tests
end
return pX

Check warning on line 287 in src/manifolds/CholeskySpace.jl

Codecov / codecov/patch

src/manifolds/CholeskySpace.jl#L287

Added line #L287 was not covered by tests
end
@doc raw"""
return Euclidean(n, n; field=ℝ, parameter=:field)
end
get_parameter_type(::SymmetricPositiveDefinite{<:TypeParameter}) = :type
get_parameter_type(::SymmetricPositiveDefinite{Tuple{Int}}) = :field

Check warning on line 240 in src/manifolds/SymmetricPositiveDefinite.jl

Codecov / codecov/patch

src/manifolds/SymmetricPositiveDefinite.jl#L239-L240

Added lines #L239 - L240 were not covered by tests
@doc raw"""
injectivity_radius(M::SymmetricPositiveDefinite[, p])
"""
function distance(M::MetricManifold{ℝ,<:SymmetricPositiveDefinite,LogCholeskyMetric}, p, q)
N = get_parameter(M.manifold.size)[1]
return distance(

Check warning on line 40 in src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl

Codecov / codecov/patch

src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl#L40

Added line #L40 was not covered by tests
CholeskySpace(N; parameter=get_parameter_type(M.manifold)),
cholesky(p).L,
cholesky(q).L,
function exp!(M::MetricManifold{ℝ,<:SymmetricPositiveDefinite,LogCholeskyMetric}, q, p, X)
N = get_parameter(M.manifold.size)[1]
(y, W) = spd_to_cholesky(p, X)
z = exp(CholeskySpace(N; parameter=get_parameter_type(M.manifold)), y, W)

Check warning on line 67 in src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl

Codecov / codecov/patch

src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl#L67

Added line #L67 was not covered by tests
return copyto!(q, z * z')
end
function exp!(
return exp!(M, q, p, t * X)
end
function get_coordinates_orthonormal!(

Check warning on line 80 in src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl

Codecov / codecov/patch

src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl#L80

Added line #L80 was not covered by tests
M::MetricManifold{ℝ,<:SymmetricPositiveDefinite,LogCholeskyMetric},
Xⁱ,
p,
X,
rn::RealNumbers,
)
N = get_parameter(M.manifold.size)[1]
MC = CholeskySpace(N; parameter=get_parameter_type(M.manifold))
(y, W) = spd_to_cholesky(p, X)
get_coordinates_orthonormal!(MC, Xⁱ, y, W, rn)
return Xⁱ

Check warning on line 91 in src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl

Codecov / codecov/patch

src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl#L87-L91

Added lines #L87 - L91 were not covered by tests
end
function get_vector_orthonormal!(

Check warning on line 94 in src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl

Codecov / codecov/patch

src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl#L94

Added line #L94 was not covered by tests
M::MetricManifold{ℝ,<:SymmetricPositiveDefinite,LogCholeskyMetric},
X,
p,
Xⁱ,
rn::RealNumbers,
)
N = get_parameter(M.manifold.size)[1]
MC = CholeskySpace(N; parameter=get_parameter_type(M.manifold))
y = cholesky(p).L
get_vector_orthonormal!(MC, X, y, Xⁱ, rn)
tangent_cholesky_to_tangent_spd!(p, X)
return X

Check warning on line 106 in src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl

Codecov / codecov/patch

src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl#L101-L106

Added lines #L101 - L106 were not covered by tests
end
@doc raw"""
N = get_parameter(M.manifold.size)[1]
(z, Xz) = spd_to_cholesky(p, X)
(z, Yz) = spd_to_cholesky(p, z, Y)
return inner(CholeskySpace(N; parameter=get_parameter_type(M.manifold)), z, Xz, Yz)

Check warning on line 129 in src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl

Codecov / codecov/patch

src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl#L129

Added line #L129 was not covered by tests
end
"""
N = get_parameter(M.manifold.size)[1]
x = cholesky(p).L
y = cholesky(q).L
log!(CholeskySpace(N; parameter=get_parameter_type(M.manifold)), X, x, y)

Check warning on line 158 in src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl

Codecov / codecov/patch

src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl#L158

Added line #L158 was not covered by tests
return tangent_cholesky_to_tangent_spd!(x, X)
end
N = get_parameter(M.manifold.size)[1]
y = cholesky(q).L
(x, W) = spd_to_cholesky(p, X)
parallel_transport_to!(

Check warning on line 200 in src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl

Codecov / codecov/patch

src/manifolds/SymmetricPositiveDefiniteLogCholesky.jl#L200

Added line #L200 was not covered by tests
CholeskySpace(N; parameter=get_parameter_type(M.manifold)),
Y,
x,
You are viewing a condensed version of this merge commit. You can view the full changes here.