Skip to content

Commit 80459c9

Browse files
authored
Merge pull request #40 from JuliaManifolds/schild-and-pole
Introduce Schilds and Pole ladder
2 parents 72652d3 + 5095504 commit 80459c9

13 files changed

+1072
-293
lines changed

.travis.yml

-21
This file was deleted.

appveyor.yml

-38
This file was deleted.

src/DecoratorManifold.jl

+44
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,9 @@ decorated_manifold(M::Manifold) = M.manifold
580580

581581
@decorator_transparent_signature manifold_dimension(M::AbstractDecoratorManifold)
582582

583+
@decorator_transparent_signature mid_point(M::AbstractDecoratorManifold, p1, p2)
584+
@decorator_transparent_signature mid_point!(M::AbstractDecoratorManifold, q, p1, p2)
585+
583586
@decorator_transparent_signature number_system(M::AbstractDecoratorManifold)
584587

585588
@decorator_transparent_signature project(M::AbstractDecoratorManifold, p)
@@ -633,6 +636,30 @@ decorated_manifold(M::Manifold) = M.manifold
633636
X,
634637
c,
635638
)
639+
@decorator_transparent_signature vector_transport_along!(
640+
M::AbstractDecoratorManifold,
641+
Y,
642+
p,
643+
X,
644+
c::AbstractVector,
645+
m::AbstractVectorTransportMethod,
646+
)
647+
@decorator_transparent_signature vector_transport_along!(
648+
M::AbstractDecoratorManifold,
649+
Y,
650+
p,
651+
X,
652+
c::AbstractVector,
653+
m::PoleLadderTransport,
654+
)
655+
@decorator_transparent_signature vector_transport_along!(
656+
M::AbstractDecoratorManifold,
657+
Y,
658+
p,
659+
X,
660+
c::AbstractVector,
661+
m::SchildsLadderTransport,
662+
)
636663

637664
@decorator_transparent_signature vector_transport_direction(
638665
M::AbstractDecoratorManifold,
@@ -671,5 +698,22 @@ decorated_manifold(M::Manifold) = M.manifold
671698
q,
672699
m::ProjectionTransport,
673700
)
701+
@decorator_transparent_signature vector_transport_to!(
702+
M::AbstractDecoratorManifold,
703+
Y,
704+
p,
705+
X,
706+
q,
707+
m::PoleLadderTransport,
708+
)
709+
@decorator_transparent_signature vector_transport_to!(
710+
M::AbstractDecoratorManifold,
711+
Y,
712+
p,
713+
X,
714+
q,
715+
m::SchildsLadderTransport,
716+
)
674717

718+
@decorator_transparent_signature zero_tangent_vector(M::AbstractDecoratorManifold, p)
675719
@decorator_transparent_signature zero_tangent_vector!(M::AbstractDecoratorManifold, X, p)

src/DefaultManifold.jl

+34-18
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,13 @@ function check_tangent_vector(M::DefaultManifold, p, X; check_base_point = true,
3838
return nothing
3939
end
4040

41-
distance(::DefaultManifold, x, y) = norm(x - y)
41+
distance(::DefaultManifold, p, q) = norm(p - q)
4242

43-
embed!(::DefaultManifold, y, x) = copyto!(y, x)
43+
embed!(::DefaultManifold, q, p) = copyto!(q, p)
4444

45-
embed!(::DefaultManifold, w, x, v) = copyto!(w, v)
45+
embed!(::DefaultManifold, Y, p, X) = copyto!(Y, X)
4646

47-
48-
exp!(::DefaultManifold, y, x, v) = (y .= x .+ v)
47+
exp!(::DefaultManifold, q, p, X) = (q .= p .+ X)
4948

5049
function get_basis(M::DefaultManifold, p, B::DefaultOrthonormalBasis)
5150
return CachedBasis(B, [_euclidean_basis_vector(p, i) for i in eachindex(p)])
@@ -74,36 +73,53 @@ end
7473

7574
injectivity_radius(::DefaultManifold) = Inf
7675

77-
@inline inner(::DefaultManifold, x, v, w) = dot(v, w)
76+
@inline inner(::DefaultManifold, p, X, Y) = dot(X, Y)
7877

79-
log!(::DefaultManifold, v, x, y) = (v .= y .- x)
78+
log!(::DefaultManifold, Y, p, q) = (Y .= q .- p)
8079

8180
@generated function manifold_dimension(::DefaultManifold{T,𝔽}) where {T,𝔽}
8281
return *(T.parameters...) * real_dimension(𝔽)
8382
end
8483

8584
number_system(::DefaultManifold{T,𝔽}) where {T,𝔽} = 𝔽
8685

87-
norm(::DefaultManifold, x, v) = norm(v)
86+
norm(::DefaultManifold, p, X) = norm(X)
8887

89-
project!(::DefaultManifold, y, x) = copyto!(y, x)
90-
project!(::DefaultManifold, w, x, v) = copyto!(w, v)
88+
project!(::DefaultManifold, q, p) = copyto!(q, p)
89+
project!(::DefaultManifold, Y, p, X) = copyto!(Y, X)
9190

9291
@generated representation_size(::DefaultManifold{T}) where {T} = Tuple(T.parameters...)
9392

9493
function vector_transport_along!(
9594
::DefaultManifold,
96-
vto,
97-
x,
98-
v,
99-
c,
95+
Y,
96+
p,
97+
X,
98+
c::AbstractVector,
10099
::AbstractVectorTransportMethod,
101100
)
102-
return copyto!(vto, v)
101+
return copyto!(Y, X)
102+
end
103+
for VT in VECTOR_TRANSPORT_DISAMBIGUATION
104+
eval(
105+
quote
106+
@invoke_maker 6 AbstractVectorTransportMethod vector_transport_along!(
107+
M::DefaultManifold,
108+
Y,
109+
p,
110+
X,
111+
c::AbstractVector,
112+
B::$VT,
113+
)
114+
end,
115+
)
103116
end
104117

105-
function vector_transport_to!(::DefaultManifold, vto, x, v, y, ::ParallelTransport)
106-
return copyto!(vto, v)
118+
function vector_transport_to!(::DefaultManifold, Y, p, X, q, ::ParallelTransport)
119+
return copyto!(Y, X)
120+
end
121+
function vector_transport_to!(M::DefaultManifold, Y, p, X, q, ::ProjectionTransport)
122+
return project!(M, Y, q, X)
107123
end
108124

109-
zero_tangent_vector!(::DefaultManifold, v, x) = fill!(v, 0)
125+
zero_tangent_vector!(::DefaultManifold, Y, p) = fill!(Y, 0)

src/EmbeddedManifold.jl

+62-4
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,34 @@ function decorator_transparent_dispatch(
343343
) where {𝔽}
344344
return Val(:transparent)
345345
end
346+
function decorator_transparent_dispatch(
347+
::typeof(mid_point),
348+
::AbstractEmbeddedManifold,
349+
args...,
350+
)
351+
return Val(:parent)
352+
end
353+
function decorator_transparent_dispatch(
354+
::typeof(mid_point),
355+
::AbstractEmbeddedManifold{𝔽,<:TransparentIsometricEmbedding},
356+
args...,
357+
) where {𝔽}
358+
return Val(:transparent)
359+
end
360+
function decorator_transparent_dispatch(
361+
::typeof(mid_point!),
362+
::AbstractEmbeddedManifold,
363+
args...,
364+
)
365+
return Val(:parent)
366+
end
367+
function decorator_transparent_dispatch(
368+
::typeof(mid_point!),
369+
::AbstractEmbeddedManifold{𝔽,<:TransparentIsometricEmbedding},
370+
args...,
371+
) where {𝔽}
372+
return Val(:transparent)
373+
end
346374
function decorator_transparent_dispatch(::typeof(norm), ::AbstractEmbeddedManifold, args...)
347375
return Val(:intransparent)
348376
end
@@ -495,15 +523,45 @@ function decorator_transparent_dispatch(
495523
end
496524
function decorator_transparent_dispatch(
497525
::typeof(vector_transport_to!),
498-
::AbstractEmbeddedManifold,
499-
args...,
500-
)
526+
::AbstractEmbeddedManifold{𝔽,<:E},
527+
Y,
528+
p,
529+
X,
530+
q,
531+
::T,
532+
) where {𝔽,T,E}
501533
return Val(:intransparent)
502534
end
535+
function decorator_transparent_dispatch(
536+
::typeof(vector_transport_to!),
537+
::AbstractEmbeddedManifold{𝔽,<:E},
538+
Y,
539+
p,
540+
X,
541+
q,
542+
::Union{PoleLadderTransport,SchildsLadderTransport},
543+
) where {𝔽,E}
544+
return Val(:parent)
545+
end
503546
function decorator_transparent_dispatch(
504547
::typeof(vector_transport_to!),
505548
::AbstractEmbeddedManifold{𝔽,<:TransparentIsometricEmbedding},
506-
args...,
549+
Y,
550+
p,
551+
X,
552+
q,
553+
::Union{PoleLadderTransport,SchildsLadderTransport},
507554
) where {𝔽}
555+
return Val(:parent)
556+
end
557+
function decorator_transparent_dispatch(
558+
::typeof(vector_transport_to!),
559+
::AbstractEmbeddedManifold{𝔽,<:TransparentIsometricEmbedding},
560+
Y,
561+
p,
562+
X,
563+
q,
564+
::T,
565+
) where {𝔽,T}
508566
return Val(:transparent)
509567
end

0 commit comments

Comments
 (0)