pub struct So3Cover(/* private fields */);Expand description
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 BuildNodes<So3Cover> for So3Cover
impl BuildNodes<So3Cover> for So3Cover
fn build_nodes() -> Vec<Self>
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 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 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
impl StructuralPartialEq for So3Cover
Auto Trait Implementations§
impl Freeze for So3Cover
impl RefUnwindSafe for So3Cover
impl Send for So3Cover
impl Sync for So3Cover
impl Unpin for So3Cover
impl UnsafeUnpin for So3Cover
impl UnwindSafe for So3Cover
Blanket Implementations§
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<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<𝒞, X> Equivalent<𝒞, X> for Xwhere
𝒞: Cat,
impl<𝒞, X> Equivalent<𝒞, X> for Xwhere
𝒞: Cat,
Source§impl<P, V, T, B, C> NerveComplex<P, V, T, B> for C
impl<P, V, T, B, C> NerveComplex<P, V, T, B> for C
Source§fn topology() -> &'static NerveTopology
fn topology() -> &'static NerveTopology
NerveTopology.fn build_topology() -> NerveTopology
Source§fn adjacency() -> &'static Vec<Vec<(usize, V::F)>>
fn adjacency() -> &'static Vec<Vec<(usize, V::F)>>
fn build_adjacency() -> Vec<Vec<(usize, V::F)>>
Source§fn homology() -> (&'static Abelianisation, &'static HashMap<(usize, usize), (usize, bool)>)
fn homology() -> (&'static Abelianisation, &'static HashMap<(usize, usize), (usize, bool)>)
H₁ and the edge→generator map, for prefix deduplication.Source§fn fundamental_group() -> impl GroupPresentation
fn fundamental_group() -> impl GroupPresentation
Source§fn arc_poly(pts: Vec<P>) -> Option<ArcPoly<P, V::F>>
fn arc_poly(pts: Vec<P>) -> Option<ArcPoly<P, V::F>>
O(len) hops, once.Source§fn sample(ap: &ArcPoly<P, V::F>, t: V::F) -> Option<P>
fn sample(ap: &ArcPoly<P, V::F>, t: V::F) -> Option<P>
t along, by arc length. O(log len) plus one log.Source§fn n_samples(total: V::F, rho: V::F) -> Option<usize>
fn n_samples(total: V::F, rho: V::F) -> Option<usize>
δ_s is what Φ forbids, and a bump wider than δ_s cannot hide
between two samples spaced δ_s apart. A fixed count silently fails on
long polylines.Source§fn base_point_of(i: usize) -> P
fn base_point_of(i: usize) -> P
i, as a point of M.Source§fn edge_weight(i: usize, j: usize) -> Option<V::F>
fn edge_weight(i: usize, j: usize) -> Option<V::F>
None if x_j lies outside x_i’s injectivity
domain — which is precisely the condition a curvature bound would
otherwise have to assert. Read moreSource§fn dijkstra(
adj: &[Vec<(usize, V::F)>],
sources: &[(usize, V::F)],
) -> Vec<Option<V::F>>
fn dijkstra( adj: &[Vec<(usize, V::F)>], sources: &[(usize, V::F)], ) -> Vec<Option<V::F>>
O(n²) Dijkstra from a set of sources, each carrying an initial
distance. Read moreSource§fn hop(a: &P, b: &P) -> Option<V::F>
fn hop(a: &P, b: &P) -> Option<V::F>
None if neither sees the other.Source§fn polyline_length(pts: &[P]) -> Option<V::F>
fn polyline_length(pts: &[P]) -> Option<V::F>
Source§fn relax_sweep(pts: &mut [P]) -> Result<(V::F, V::F), StraighteningResult<V::F>>
fn relax_sweep(pts: &mut [P]) -> Result<(V::F, V::F), StraighteningResult<V::F>>
(worst kink, lagged length).Source§fn rescue(pts: Vec<P>, i: usize) -> Vec<P>
fn rescue(pts: Vec<P>, i: usize) -> Vec<P>
i, by inserting their
geodesic midpoints. Read moreSource§fn relax_to_convergence(
pts: &mut Vec<P>,
) -> Result<V::F, StraighteningResult<V::F>>
fn relax_to_convergence( pts: &mut Vec<P>, ) -> Result<V::F, StraighteningResult<V::F>>
Source§fn straighten(pts: Vec<P>) -> Result<(Vec<P>, V::F), StraighteningResult<V::F>>
fn straighten(pts: Vec<P>) -> Result<(Vec<P>, V::F), StraighteningResult<V::F>>
Source§fn locate_all(p: &P) -> Vec<(usize, V::F)>
fn locate_all(p: &P) -> Vec<(usize, V::F)>
p, paired with the exact
geodesic distance from that node’s base point to p. Read moreSource§fn covering_radius() -> Option<V::F>
fn covering_radius() -> Option<V::F>
δ_s, recovered from the asserted bound. Read moreSource§fn smooth(pts: Vec<P>, sweeps: usize) -> Option<Vec<P>>
fn smooth(pts: Vec<P>, sweeps: usize) -> Option<Vec<P>>
sweeps descent sweeps with both endpoints pinned. Read moreSource§fn smoothed_prefix(p: &P, nodes: &[usize]) -> Option<ArcPoly<P, V::F>>
fn smoothed_prefix(p: &P, nodes: &[usize]) -> Option<ArcPoly<P, V::F>>
[p, x_{i₀}, …, x_u], with its arc length, ready to
be compared against others at the same (node, class). Read moreSource§fn same_basin(
a: &ArcPoly<P, V::F>,
b: &ArcPoly<P, V::F>,
rho: V::F,
) -> Option<bool>
fn same_basin( a: &ArcPoly<P, V::F>, b: &ArcPoly<P, V::F>, rho: V::F, ) -> Option<bool>
Source§fn provably_same_basin(
a: &ArcPoly<P, V::F>,
b: &ArcPoly<P, V::F>,
rho: V::F,
) -> bool
fn provably_same_basin( a: &ArcPoly<P, V::F>, b: &ArcPoly<P, V::F>, rho: V::F, ) -> bool
Source§fn basins(
p: &P,
q: &P,
) -> Option<(Result<Basin<P, V::F>, V::F>, bool, StraighteningResult<V::F>)>
fn basins( p: &P, q: &P, ) -> Option<(Result<Basin<P, V::F>, V::F>, bool, StraighteningResult<V::F>)>
p to q that the cover can
reach, together with two completeness flags: whether the search
terminated by clearing its ceiling (rather than a cap), and whether
every candidate it examined straightened successfully. Read moreSource§fn geodesic_distance(p: &P, q: &P) -> Option<V::F>
fn geodesic_distance(p: &P, q: &P) -> Option<V::F>
d_M(p, q). See Self::geodesic_path
for the guarantee and its one precondition.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