pub struct Coords<F: Field, const N: usize, const M: usize = 0>(pub [F; N]);Expand description
The canonical model of flat pseudo-Euclidean coordinate space R^(NβM, M).
A fixed-size array of N coordinates over the field R, carrying the
algebraic structure of a vector space together with a symmetric bilinear
form of signature (N β M, M): N β M positive (spacelike) directions
and M negative (timelike) ones. The first M coordinates are the
negative-signature directions; the remaining N β M are positive.
This is the space in which local coordinate charts take their values and
in which tangent vectors live. With the default M = 0 it is ordinary
flat Euclidean space R^N β positive-definite, hence carrying a genuine
norm and Metric. With M > 0 the form is indefinite: it is a
Bilinear scalar product only, with no norm and no metric (a timelike
vector has negative norm_squared, and null vectors give distinct points
at zero separation). Minkowski spacetime is Coords<R, 4, 1>.
M is expected in 0..=N; values M > N are safe but redundant,
behaving identically to M = N (fully negative-definite), since the
scalar product only ranges over the N present coordinates.
Β§Trait scoping
The definite (M = 0) case implements InnerProduct, Metric, and
Euclidean; the general case implements Sesquilinear and, in cases
where the fixed field is itself, Bilinear
Tuple FieldsΒ§
Β§0: [F; N]Methods from Deref<Target = [F; N]>Β§
1.57.0 Β· Sourcepub fn as_slice(&self) -> &[T]
pub fn as_slice(&self) -> &[T]
Returns a slice containing the entire array. Equivalent to &s[..].
1.57.0 Β· Sourcepub fn as_mut_slice(&mut self) -> &mut [T]
pub fn as_mut_slice(&mut self) -> &mut [T]
Returns a mutable slice containing the entire array. Equivalent to
&mut s[..].
1.77.0 Β· Sourcepub fn each_ref(&self) -> [&T; N]
pub fn each_ref(&self) -> [&T; N]
Borrows each element and returns an array of references with the same
size as self.
Β§Example
let floats = [3.1, 2.7, -1.0];
let float_refs: [&f64; 3] = floats.each_ref();
assert_eq!(float_refs, [&3.1, &2.7, &-1.0]);This method is particularly useful if combined with other methods, like
map. This way, you can avoid moving the original
array if its elements are not Copy.
let strings = ["Ferris".to_string(), "β₯".to_string(), "Rust".to_string()];
let is_ascii = strings.each_ref().map(|s| s.is_ascii());
assert_eq!(is_ascii, [true, false, true]);
// We can still access the original array: it has not been moved.
assert_eq!(strings.len(), 3);1.77.0 Β· Sourcepub fn each_mut(&mut self) -> [&mut T; N]
pub fn each_mut(&mut self) -> [&mut T; N]
Borrows each element mutably and returns an array of mutable references
with the same size as self.
Β§Example
let mut floats = [3.1, 2.7, -1.0];
let float_refs: [&mut f64; 3] = floats.each_mut();
*float_refs[0] = 0.0;
assert_eq!(float_refs, [&mut 0.0, &mut 2.7, &mut -1.0]);
assert_eq!(floats, [0.0, 2.7, -1.0]);Sourcepub fn split_array_ref<const M: usize>(&self) -> (&[T; M], &[T])
π¬This is a nightly-only experimental API. (split_array)
pub fn split_array_ref<const M: usize>(&self) -> (&[T; M], &[T])
split_array)Divides one array reference into two at an index.
The first will contain all indices from [0, M) (excluding
the index M itself) and the second will contain all
indices from [M, N) (excluding the index N itself).
Β§Panics
Panics if M > N.
Β§Examples
#![feature(split_array)]
let v = [1, 2, 3, 4, 5, 6];
{
let (left, right) = v.split_array_ref::<0>();
assert_eq!(left, &[]);
assert_eq!(right, &[1, 2, 3, 4, 5, 6]);
}
{
let (left, right) = v.split_array_ref::<2>();
assert_eq!(left, &[1, 2]);
assert_eq!(right, &[3, 4, 5, 6]);
}
{
let (left, right) = v.split_array_ref::<6>();
assert_eq!(left, &[1, 2, 3, 4, 5, 6]);
assert_eq!(right, &[]);
}Sourcepub fn split_array_mut<const M: usize>(&mut self) -> (&mut [T; M], &mut [T])
π¬This is a nightly-only experimental API. (split_array)
pub fn split_array_mut<const M: usize>(&mut self) -> (&mut [T; M], &mut [T])
split_array)Divides one mutable array reference into two at an index.
The first will contain all indices from [0, M) (excluding
the index M itself) and the second will contain all
indices from [M, N) (excluding the index N itself).
Β§Panics
Panics if M > N.
Β§Examples
#![feature(split_array)]
let mut v = [1, 0, 3, 0, 5, 6];
let (left, right) = v.split_array_mut::<2>();
assert_eq!(left, &mut [1, 0][..]);
assert_eq!(right, &mut [3, 0, 5, 6]);
left[1] = 2;
right[1] = 4;
assert_eq!(v, [1, 2, 3, 4, 5, 6]);Sourcepub fn rsplit_array_ref<const M: usize>(&self) -> (&[T], &[T; M])
π¬This is a nightly-only experimental API. (split_array)
pub fn rsplit_array_ref<const M: usize>(&self) -> (&[T], &[T; M])
split_array)Divides one array reference into two at an index from the end.
The first will contain all indices from [0, N - M) (excluding
the index N - M itself) and the second will contain all
indices from [N - M, N) (excluding the index N itself).
Β§Panics
Panics if M > N.
Β§Examples
#![feature(split_array)]
let v = [1, 2, 3, 4, 5, 6];
{
let (left, right) = v.rsplit_array_ref::<0>();
assert_eq!(left, &[1, 2, 3, 4, 5, 6]);
assert_eq!(right, &[]);
}
{
let (left, right) = v.rsplit_array_ref::<2>();
assert_eq!(left, &[1, 2, 3, 4]);
assert_eq!(right, &[5, 6]);
}
{
let (left, right) = v.rsplit_array_ref::<6>();
assert_eq!(left, &[]);
assert_eq!(right, &[1, 2, 3, 4, 5, 6]);
}Sourcepub fn rsplit_array_mut<const M: usize>(&mut self) -> (&mut [T], &mut [T; M])
π¬This is a nightly-only experimental API. (split_array)
pub fn rsplit_array_mut<const M: usize>(&mut self) -> (&mut [T], &mut [T; M])
split_array)Divides one mutable array reference into two at an index from the end.
The first will contain all indices from [0, N - M) (excluding
the index N - M itself) and the second will contain all
indices from [N - M, N) (excluding the index N itself).
Β§Panics
Panics if M > N.
Β§Examples
#![feature(split_array)]
let mut v = [1, 0, 3, 0, 5, 6];
let (left, right) = v.rsplit_array_mut::<4>();
assert_eq!(left, &mut [1, 0]);
assert_eq!(right, &mut [3, 0, 5, 6][..]);
left[1] = 2;
right[1] = 4;
assert_eq!(v, [1, 2, 3, 4, 5, 6]);Trait ImplementationsΒ§
SourceΒ§impl Bounded<So3<Coords<R64, 3>>, So3<Coords<R64, 3>>, Coords<R64, 3>> for So3Cover
Radius of the geodesic-ball domains of So3Cover.
impl Bounded<So3<Coords<R64, 3>>, So3<Coords<R64, 3>>, Coords<R64, 3>> for So3Cover
Radius of the geodesic-ball domains of So3Cover.
The 60 nodes are the icosahedral rotation group I β
Aβ
β SO(3) β the
image of the 120 icosian unit quaternions (the vertices of the 600-cell)
under the double cover SΒ³ β SO(3). In the bi-invariant metric
d = |identity_log| (half the rotation angle; diameter Ο/2), the
pairwise distances realised between nodes are exactly
Ο/5 β 0.628, Ο/3 β 1.047, 2Ο/5 β 1.257, Ο/2 β 1.571and the covering radius of the node set is β 0.3857 (the circumradius of a cell of the 600-cell). The radius Ο = 0.42 is chosen so that:
- covering: Ο > 0.3857, so the 60 open balls cover SO(3);
- goodness: Ο < Ο/4, the convexity radius of SO(3) β RPΒ³, so every ball is geodesically convex and all intersections of balls are convex, hence contractible or empty β an open good cover;
- faithful 1-skeleton: two equal balls overlap iff their centres are closer than 2Ο = 0.84, which separates Ο/5 from Ο/3 with a wide margin on both sides β the nerveβs edges are exactly the 600-cellβs edges (mod Β±1), and the computation is robust to floating-point error;
- faithful 2-skeleton: every triangle of the overlap graph is an equilateral triangle of side Ο/5 with spherical circumradius β 0.365 < Ο, so all three balls genuinely share a point β mutual pairwise overlap coincides with triple intersection, and the triangles of the nerve are exactly the 600-cellβs 2-faces (mod Β±1).
The nerve of this cover is therefore the hemi-600-cell: the classical vertex-transitive 60-vertex triangulation of RPΒ³ with f-vector (60, 360, 600, 300), obtained from the boundary complex of the 600-cell by identifying antipodes. By the nerve theorem the nerve is homotopy equivalent to SO(3), and Οβ computed from its 2-skeleton is β¨x | xΒ²β© β Z/2Z.
SourceΒ§impl Bounded<UnitComplex<Coords<R64, 1>>, UnitComplex<Coords<R64, 1>>, Coords<R64, 1>> for S1Cover
impl Bounded<UnitComplex<Coords<R64, 1>>, UnitComplex<Coords<R64, 1>>, Coords<R64, 1>> for S1Cover
SourceΒ§impl Chart<So3<Coords<R64, 3>>, Coords<R64, 3>> for So3Cover
impl Chart<So3<Coords<R64, 3>>, Coords<R64, 3>> for So3Cover
SourceΒ§type Global = So3<Coords<R64, 3>>
type Global = So3<Coords<R64, 3>>
fn to_local(&self, point: &So3<Coords<R64, 3>>) -> Option<Coords<R64, 3>>
fn to_global(&self, coord: Coords<R64, 3>) -> So3<Coords<R64, 3>>
fn chart_at(p: &So3<Coords<R64, 3>>) -> Self
SourceΒ§fn local_distance(&self, other: &P) -> Option<<V::F as Field>::Fixed>where
V: Euclidean,
fn local_distance(&self, other: &P) -> Option<<V::F as Field>::Fixed>where
V: Euclidean,
self and other
in local coordinates, based at &self.fn check_local_inverse(p: &P) -> boolwhere
P: PartialEq,
SourceΒ§impl Chart<UnitComplex<Coords<R64, 1>>, Coords<R64, 1>> for S1Cover
impl Chart<UnitComplex<Coords<R64, 1>>, Coords<R64, 1>> for S1Cover
SourceΒ§type Global = <UnitComplex<Coords<R64, 1>> as Chart<UnitComplex<Coords<R64, 1>>, Coords<R64, 1>>>::Global
type Global = <UnitComplex<Coords<R64, 1>> as Chart<UnitComplex<Coords<R64, 1>>, Coords<R64, 1>>>::Global
fn to_local(&self, p: &UnitComplex<Coords<R64, 1>>) -> Option<Coords<R64, 1>>
fn to_global(&self, c: Coords<R64, 1>) -> Self::Global
fn chart_at(p: &UnitComplex<Coords<R64, 1>>) -> Self
SourceΒ§fn local_distance(&self, other: &P) -> Option<<V::F as Field>::Fixed>where
V: Euclidean,
fn local_distance(&self, other: &P) -> Option<<V::F as Field>::Fixed>where
V: Euclidean,
self and other
in local coordinates, based at &self.fn check_local_inverse(p: &P) -> boolwhere
P: PartialEq,
impl<F: Copy + Field, const N: usize, const M: usize> Copy for Coords<F, N, M>
SourceΒ§impl<R: Real, const N: usize> Euclidean for Coords<R, N, 0>
impl<R: Real, const N: usize> Euclidean for Coords<R, N, 0>
fn check_pythagorean(a: &Self, b: &Self) -> bool
SourceΒ§impl ExpMap<So3<Coords<R64, 3>>, Coords<R64, 3>> for So3Cover
impl ExpMap<So3<Coords<R64, 3>>, Coords<R64, 3>> for So3Cover
fn base_point(&self) -> P
fn check_base_point_is_origin(&self) -> boolwhere
V: Form,
fn check_preservation_of_origin(&self) -> boolwhere
V: Form,
SourceΒ§impl ExpMap<UnitComplex<Coords<R64, 1>>, Coords<R64, 1>> for S1Cover
impl ExpMap<UnitComplex<Coords<R64, 1>>, Coords<R64, 1>> for S1Cover
fn base_point(&self) -> UnitComplex<Coords<R64, 1>>
fn check_base_point_is_origin(&self) -> boolwhere
V: Form,
fn check_preservation_of_origin(&self) -> boolwhere
V: Form,
SourceΒ§impl<R: Field, const N: usize, const M: usize> FormLift for Coords<R, N, M>
impl<R: Field, const N: usize, const M: usize> FormLift for Coords<R, N, M>
SourceΒ§impl<F: CField<Characteristic = NatZero>, const N: usize, const D: usize> From<Coords<F, D>> for SlAlgebra<F, N, D>
impl<F: CField<Characteristic = NatZero>, const N: usize, const D: usize> From<Coords<F, D>> for SlAlgebra<F, N, D>
SourceΒ§impl<const R: usize, F: Field, const N: usize, const M: usize> Index<[usize; R]> for Coords<F, N, M>
impl<const R: usize, F: Field, const N: usize, const M: usize> Index<[usize; R]> for Coords<F, N, M>
SourceΒ§impl<const R: usize, F: Field, const N: usize, const M: usize> IndexMut<[usize; R]> for Coords<F, N, M>
impl<const R: usize, F: Field, const N: usize, const M: usize> IndexMut<[usize; R]> for Coords<F, N, M>
SourceΒ§impl<R: Real, F: Field<Fixed = R>, const N: usize, const M: usize> Interval for Coords<F, N, M>
impl<R: Real, F: Field<Fixed = R>, const N: usize, const M: usize> Interval for Coords<F, N, M>
SourceΒ§type R = R
type R = R
Fixed: analysis happens here regardless of the
algebraic involution.SourceΒ§fn interval_squared(&self, other: &Self) -> R
fn interval_squared(&self, other: &Self) -> R
SourceΒ§fn interval(&self, other: &Self) -> Complex<Self::R>
fn interval(&self, other: &Self) -> Complex<Self::R>
fn check_interval_symmetry(a: Self, b: Self) -> bool
fn check_self_interval_zero(a: Self) -> bool
fn check_interval_squared_agrees_with_interval(a: &Self, b: &Self) -> bool
SourceΒ§impl<R: Real> LieGroup<Coords<R, 2>> for Complex<R>
impl<R: Real> LieGroup<Coords<R, 2>> for Complex<R>
fn identity_exp(v: Coords<R, 2>) -> Self
fn identity_log(p: &Self) -> Option<Coords<R, 2>>
SourceΒ§impl<R: Real> LieGroup<Coords<R, 2>> for NonZero<Complex<R>>
impl<R: Real> LieGroup<Coords<R, 2>> for NonZero<Complex<R>>
fn identity_exp(v: Coords<R, 2>) -> Self
fn identity_log(p: &Self) -> Option<Coords<R, 2>>
SourceΒ§impl<R: Real> LieGroup<Coords<R, 4>> for Quaternion<R>
impl<R: Real> LieGroup<Coords<R, 4>> for Quaternion<R>
fn identity_exp(v: Coords<R, 4>) -> Self
fn identity_log(p: &Self) -> Option<Coords<R, 4>>
SourceΒ§impl<F: Field, const N: usize, const M: usize> Mul<<Coords<F, N, M> as Tensor>::F> for Coords<F, N, M>
impl<F: Field, const N: usize, const M: usize> Mul<<Coords<F, N, M> as Tensor>::F> for Coords<F, N, M>
SourceΒ§impl NerveComplexParameters<So3<Coords<R64, 3>>, Coords<R64, 3>, So3<Coords<R64, 3>>, So3Cover> for So3Cover
impl NerveComplexParameters<So3<Coords<R64, 3>>, Coords<R64, 3>, So3<Coords<R64, 3>>, So3Cover> for So3Cover
SourceΒ§fn overestimation_bound() -> Option<(V::F, V::F)>
fn overestimation_bound() -> Option<(V::F, V::F)>
1 + e. Read moreSourceΒ§fn max_candidate_paths() -> usize
fn max_candidate_paths() -> usize
SourceΒ§fn max_frontier() -> usize
fn max_frontier() -> usize
SourceΒ§fn max_rescues() -> usize
fn max_rescues() -> usize
SourceΒ§fn max_straightening_iterations(n: usize) -> usize
fn max_straightening_iterations(n: usize) -> usize
SourceΒ§fn max_samples() -> usize
fn max_samples() -> usize
same_basin comparison. Exceeding it means the
polyline is longer than max_samples Β· Ξ΄_s, and no comparison at that
spacing could prove two prefixes share a basin β so the prune is
declined rather than performed on insufficient evidence.SourceΒ§fn max_canonical_generators() -> usize
fn max_canonical_generators() -> usize
fundamental_group returns a correct but
non-canonical presentation. Read moreSourceΒ§fn prefix_smoothing_sweeps() -> usize
fn prefix_smoothing_sweeps() -> usize
fn max_basins_per_class() -> usize
SourceΒ§impl NerveComplexParameters<UnitComplex<Coords<R64, 1>>, Coords<R64, 1>, UnitComplex<Coords<R64, 1>>, S1Cover> for S1Cover
impl NerveComplexParameters<UnitComplex<Coords<R64, 1>>, Coords<R64, 1>, UnitComplex<Coords<R64, 1>>, S1Cover> for S1Cover
SourceΒ§fn overestimation_bound() -> Option<(V::F, V::F)>
fn overestimation_bound() -> Option<(V::F, V::F)>
1 + e. Read moreSourceΒ§fn max_candidate_paths() -> usize
fn max_candidate_paths() -> usize
SourceΒ§fn max_frontier() -> usize
fn max_frontier() -> usize
SourceΒ§fn max_rescues() -> usize
fn max_rescues() -> usize
SourceΒ§fn max_straightening_iterations(n: usize) -> usize
fn max_straightening_iterations(n: usize) -> usize
SourceΒ§fn max_samples() -> usize
fn max_samples() -> usize
same_basin comparison. Exceeding it means the
polyline is longer than max_samples Β· Ξ΄_s, and no comparison at that
spacing could prove two prefixes share a basin β so the prune is
declined rather than performed on insufficient evidence.SourceΒ§fn max_canonical_generators() -> usize
fn max_canonical_generators() -> usize
fundamental_group returns a correct but
non-canonical presentation. Read moreSourceΒ§fn prefix_smoothing_sweeps() -> usize
fn prefix_smoothing_sweeps() -> usize
fn max_basins_per_class() -> usize
SourceΒ§impl<R: Field, const N: usize, const M: usize> NondegenerateLift for Coords<R, N, M>
impl<R: Field, const N: usize, const M: usize> NondegenerateLift for Coords<R, N, M>
SourceΒ§impl<F: Field, const N: usize, const M: usize> Sesquilinear for Coords<F, N, M>
impl<F: Field, const N: usize, const M: usize> Sesquilinear for Coords<F, N, M>
fn norm_squared(&self) -> <Self::F as Field>::Fixed
fn check_hermitian_symmetry(a: Self, b: Self) -> bool
fn check_additivity(a: Self, b: Self, c: Self) -> bool
fn check_scalar_linearity(a: Self, c: Self, k: Self::F) -> bool
SourceΒ§impl TangentBundle<So3<Coords<R64, 3>>, Coords<R64, 3>> for So3Cover
impl TangentBundle<So3<Coords<R64, 3>>, Coords<R64, 3>> for So3Cover
fn check_universal_centring(p: P) -> boolwhere
V: Form,
SourceΒ§impl TangentBundle<UnitComplex<Coords<R64, 1>>, Coords<R64, 1>> for S1Cover
impl TangentBundle<UnitComplex<Coords<R64, 1>>, Coords<R64, 1>> for S1Cover
fn check_universal_centring(p: P) -> boolwhere
V: Form,
SourceΒ§impl<F: Field, const N: usize, const M: usize> Tensor for Coords<F, N, M>
impl<F: Field, const N: usize, const M: usize> Tensor for Coords<F, N, M>
SourceΒ§type Hand = Right
type Hand = Right
F acts. Dual<Self> elects the opposite
hand, and Dual<Dual<Self>> therefore restores this one.SourceΒ§type Normalization = Atomic
type Normalization = Atomic
Atomic; expression constructors provide
their corresponding structural normalizer.SourceΒ§fn from_fn(f: impl FnMut(usize) -> Self::F) -> Self
fn from_fn(f: impl FnMut(usize) -> Self::F) -> Self
SourceΒ§const N: usize = <Self::Array<Self::F>>::N
const N: usize = <Self::Array<Self::F>>::N
SourceΒ§fn iter(&self) -> <Self::Array<Self::F> as Array<Self::F>>::Iter<'_>
fn iter(&self) -> <Self::Array<Self::F> as Array<Self::F>>::Iter<'_>
N coordinates in order.SourceΒ§fn from_iter(iter: impl IntoIterator<Item = Self::F>) -> Self
fn from_iter(iter: impl IntoIterator<Item = Self::F>) -> Self
fn flatten_index<const R: usize>(index: [usize; R]) -> usize
fn check_global_chart(p: &Self, q: &Self) -> bool
fn check_global_geodesic_scaling( p: &Self, v: Self, t: <Self::F as Field>::Fixed, ) -> bool
Auto Trait ImplementationsΒ§
impl<F, const N: usize, const M: usize> Freeze for Coords<F, N, M>
impl<F, const N: usize, const M: usize> RefUnwindSafe for Coords<F, N, M>where
[F; N]: RefUnwindSafe,
impl<F, const N: usize, const M: usize> Send for Coords<F, N, M>
impl<F, const N: usize, const M: usize> Sync for Coords<F, N, M>
impl<F, const N: usize, const M: usize> Unpin for Coords<F, N, M>
impl<F, const N: usize, const M: usize> UnsafeUnpin for Coords<F, N, M>where
[F; N]: UnsafeUnpin,
impl<F, const N: usize, const M: usize> UnwindSafe for Coords<F, N, M>where
[F; N]: UnwindSafe,
Blanket ImplementationsΒ§
impl<F, V> Bilinear for Vwhere
F: Field<Fixed = F>,
V: Sesquilinear<F = F>,
SourceΒ§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
SourceΒ§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
SourceΒ§impl<G> CGroup for G
impl<G> CGroup for G
fn check_left_inverse(&self) -> boolwhere
Self: PartialEq,
fn check_right_inverse(&self) -> boolwhere
Self: PartialEq,
fn check_sub_agrees_with_neg(a: &Self, b: &Self) -> boolwhere
Self: PartialEq,
SourceΒ§impl<M> CMonoid for M
impl<M> CMonoid for M
fn check_left_identity(&self) -> boolwhere
Self: PartialEq,
fn check_right_identity(&self) -> boolwhere
Self: PartialEq,
fn check_associativity(a: Self, b: Self, c: Self) -> boolwhere
Self: PartialEq,
fn check_commutativity(a: Self, b: Self) -> boolwhere
Self: PartialEq,
SourceΒ§impl<V, S> Chart<S, V> for S
impl<V, S> Chart<S, V> for S
SourceΒ§type Global = <S as Smooth<V>>::Global
type Global = <S as Smooth<V>>::Global
fn to_local(&self, point: &S) -> Option<V>
fn to_global(&self, coord: V) -> <S as Smooth<V>>::Global
fn chart_at(p: &S) -> S
SourceΒ§fn local_distance(&self, other: &P) -> Option<<V::F as Field>::Fixed>where
V: Euclidean,
fn local_distance(&self, other: &P) -> Option<<V::F as Field>::Fixed>where
V: Euclidean,
self and other
in local coordinates, based at &self.fn check_local_inverse(p: &P) -> boolwhere
P: PartialEq,
SourceΒ§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
SourceΒ§impl<V> Connection<V, V> for Vwhere
V: Tensor,
impl<V> Connection<V, V> for Vwhere
V: Tensor,
SourceΒ§fn tangent_to_local<const N: usize>(
base: TangentElement<V, V, Γ, N>,
local: TangentElement<V, V, Γ, N>,
) -> Option<TensorOver<V, Jet<π, <V as Tensor>::F, N>>>
fn tangent_to_local<const N: usize>( base: TangentElement<V, V, Γ, N>, local: TangentElement<V, V, Γ, N>, ) -> Option<TensorOver<V, Jet<π, <V as Tensor>::F, N>>>
local in the lifted chart centred at base.SourceΒ§fn tangent_to_global<const N: usize>(
base: TangentElement<V, V, Γ, N>,
coordinate: TensorOver<V, Jet<π, <V as Tensor>::F, N>>,
) -> (V, TensorOver<V, Jet<π, <V as Tensor>::F, N>>)
fn tangent_to_global<const N: usize>( base: TangentElement<V, V, Γ, N>, coordinate: TensorOver<V, Jet<π, <V as Tensor>::F, N>>, ) -> (V, TensorOver<V, Jet<π, <V as Tensor>::F, N>>)
SourceΒ§fn geodesic_acceleration(&self, p: P, v: V) -> Option<V>
fn geodesic_acceleration(&self, p: P, v: V) -> Option<V>
p of the geodesic with
initial tangent v, expressed in the fixed chart self. Read moreSourceΒ§impl<π, X> Equivalent<π, X> for Xwhere
π: Cat,
impl<π, X> Equivalent<π, X> for Xwhere
π: Cat,
SourceΒ§impl<V, L> ExpMap<L, V> for L
impl<V, L> ExpMap<L, V> for L
fn base_point(&self) -> L
fn check_base_point_is_origin(&self) -> boolwhere
V: Form,
fn check_preservation_of_origin(&self) -> boolwhere
V: Form,
SourceΒ§impl<V> Group for Vwhere
V: Tensor,
impl<V> Group for Vwhere
V: Tensor,
fn identity() -> V
fn compose(&self, other: &V) -> V
fn inverse(&self) -> V
fn check_left_identity(&self) -> boolwhere
Self: PartialEq,
fn check_right_identity(&self) -> boolwhere
Self: PartialEq,
fn check_associativity(a: Self, b: Self, c: Self) -> boolwhere
Self: PartialEq,
fn check_left_inverse(&self) -> bool
fn check_right_inverse(&self) -> boolwhere
Self: PartialEq,
impl<I, V> ICompatible<V> for I
SourceΒ§impl<P> InnerProduct for P
impl<P> InnerProduct for P
SourceΒ§fn norm(&self) -> <Self::F as Field>::Fixed
fn norm(&self) -> <Self::F as Field>::Fixed
βvβ = sqrt(β¨v,vβ©). Well-defined and real because the form
is positive-definite. On an indefinite Bilinear space this would
not be real β which is why it lives here, not on the base.fn check_positive_definite(a: Self) -> bool
fn check_metric_compatibility(a: Self, b: Self) -> bool
SourceΒ§impl<V> LieGroup<V> for Vwhere
V: Tensor,
impl<V> LieGroup<V> for Vwhere
V: Tensor,
fn identity_exp(v: V) -> V
fn identity_log(p: &V) -> Option<V>
SourceΒ§impl<T> OptionallyOption<T> for T
impl<T> OptionallyOption<T> for T
SourceΒ§fn into_option(self) -> Option<T>
fn into_option(self) -> Option<T>
Option<T>. Read more