Skip to main content

So3Cover

Struct So3Cover 

Source
pub struct So3Cover(/* private fields */);
Expand description

A finite geodesic-ball cover of So3 centred on icosahedral rotations.

The cover supplies Bounded domains and nodes for the global simplicial and geodesic algorithms.

Trait Implementations§

Source§

impl AsRef<So3<Coords<R64, 3>>> for So3Cover

Source§

fn as_ref(&self) -> &So3<Coords<R64, 3>>

Converts this type into a shared reference of the (usually inferred) input type.
Source§

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.571

and 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§

fn sdf(&self, v: &Coords<R64, 3>) -> R64

Source§

impl BuildNodes<So3Cover> for So3Cover

Source§

fn build_nodes() -> Vec<Self>

Source§

impl Chart<So3<Coords<R64, 3>>, Coords<R64, 3>> for So3Cover

Source§

type Global = So3<Coords<R64, 3>>

The result of mapping local coordinates back onto the manifold. Read more
Source§

fn to_local(&self, point: &So3<Coords<R64, 3>>) -> Option<Coords<R64, 3>>

Source§

fn to_global(&self, coord: Coords<R64, 3>) -> So3<Coords<R64, 3>>

Source§

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,

Calculates the distance between self and other in local coordinates, based at &self.
Source§

fn check_local_inverse(p: &P) -> bool
where P: PartialEq,

Source§

impl Clone for So3Cover

Source§

fn clone(&self) -> So3Cover

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for So3Cover

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl ExpMap<So3<Coords<R64, 3>>, Coords<R64, 3>> for So3Cover

Source§

fn base_point(&self) -> P

Source§

fn check_base_point_is_origin(&self) -> bool
where V: Form,

Source§

fn check_preservation_of_origin(&self) -> bool
where V: Form,

Source§

fn check_chart_at_base_point(&self) -> bool
where V: Form,

If a chart centred at p exists, chart_at(p) returns it. Formally: chart_at(p).base_point() == p whenever p is the base point of some valid chart in this atlas. Read more
Source§

impl From<So3<Coords<R64, 3>>> for So3Cover

Source§

fn from(value: So3<Coords<R64, 3>>) -> Self

Converts to this type from the input type.
Source§

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)>

The one irreducible assumption: graph distance on the 1-skeleton overestimates true geodesic distance by at most a factor 1 + e. Read more
Source§

fn max_candidate_paths() -> usize

Hard cap on how many candidate edge-paths are straightened. Raising it strengthens the guarantee; lowering it trades certification for speed.
Source§

fn max_frontier() -> usize

Cap on heap entries. Prefixes vastly outnumber completions, and this is the quantity that threatens memory. Independent of the above: no ratio between prefixes-in-flight and completions exists.
Source§

fn max_rescues() -> usize

Cap on local insertions before declaring the charts unusable. when flowing a polyline, sometimes a point might go out of the injectivity radius of its neighbors, in that case, we insert a point between them to try to rescue the polyline.
Source§

fn max_straightening_iterations(n: usize) -> usize

Iteration cap for the flow, as a function of vertex count. Read more
Source§

fn max_samples() -> usize

Cap on samples per 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

Generator count above which fundamental_group returns a correct but non-canonical presentation. Read more
Source§

fn prefix_smoothing_sweeps() -> usize

Sweeps of the discrete geodesic flow applied to a prefix before it is compared for basin membership. Read more
Source§

fn max_basins_per_class() -> usize

Source§

fn get_neighbors(i: usize) -> impl Iterator<Item = usize>

Returns the indices of nodes whose bounded domains overlap the bounded domain of this node — the 1-skeleton of the nerve. Read more
Source§

impl PartialEq for So3Cover

Source§

fn eq(&self, other: &So3Cover) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for So3Cover

Source§

impl TangentBundle<So3<Coords<R64, 3>>, Coords<R64, 3>> for So3Cover

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<𝒞, X> Equivalent<𝒞, X> for X
where 𝒞: Cat,

Source§

fn project(self) -> X

Source§

fn lift(x: X) -> X

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<P, V, T, B, C> NerveComplex<P, V, T, B> for C
where P: Point, V: Euclidean, <V as Tensor>::F: 'static + Send + Sync, T: TangentBundle<P, V> + Point, B: Bounded<T, P, V> + 'static + Send + Sync, C: NerveComplexParameters<P, V, T, B>,

Source§

fn topology() -> &'static NerveTopology

The nerve’s topology, computed once per type. See NerveTopology.
Source§

fn build_topology() -> NerveTopology

Source§

fn adjacency() -> &'static Vec<Vec<(usize, V::F)>>

The symmetrised, exactly-weighted adjacency of the 1-skeleton. Read more
Source§

fn build_adjacency() -> Vec<Vec<(usize, V::F)>>

Source§

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

Computes the fundamental group π₁(M) of the manifold from the graph structure of this cover via the spanning tree construction. Read more
Source§

fn arc_poly(pts: Vec<P>) -> Option<ArcPoly<P, V::F>>

Build a polyline with its cumulative arc length. O(len) hops, once.
Source§

fn sample(ap: &ArcPoly<P, V::F>, t: V::F) -> Option<P>

The point a fraction t along, by arc length. O(log len) plus one log.
Source§

fn n_samples(total: V::F, rho: V::F) -> Option<usize>

Sample spacing must be finer than the covering radius: a bump narrower than δ_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

The base point of node i, as a point of M.
Source§

fn edge_weight(i: usize, j: usize) -> Option<V::F>

The exact geodesic arc length between the base points of two adjacent nodes, or 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 more
Source§

fn dijkstra( adj: &[Vec<(usize, V::F)>], sources: &[(usize, V::F)], ) -> Vec<Option<V::F>>

Dense O(n²) Dijkstra from a set of sources, each carrying an initial distance. Read more
Source§

fn hop(a: &P, b: &P) -> Option<V::F>

Exact geodesic arc length between two nearby points, trying either endpoint’s chart. None if neither sees the other.
Source§

fn midpoint(a: &P, b: &P) -> Option<P>

The geodesic midpoint of two nearby points.
Source§

fn polyline_length(pts: &[P]) -> Option<V::F>

Total length, as a sum of exact geodesic hops. Read more
Source§

fn relax_sweep(pts: &mut [P]) -> Result<(V::F, V::F), StraighteningResult<V::F>>

One Gauss–Seidel sweep. Returns (worst kink, lagged length).
Source§

fn rescue(pts: Vec<P>, i: usize) -> Vec<P>

Halve the two segments adjacent to vertex i, by inserting their geodesic midpoints. Read more
Source§

fn relax_to_convergence( pts: &mut Vec<P>, ) -> Result<V::F, StraighteningResult<V::F>>

Run the flow until every interior vertex is straight. Read more
Source§

fn straighten(pts: Vec<P>) -> Result<(Vec<P>, V::F), StraighteningResult<V::F>>

Relax a polyline to the geodesic at the bottom of its basin, and return that geodesic with its exact length. Read more
Source§

fn locate_all(p: &P) -> Vec<(usize, V::F)>

Every node whose bounded domain contains p, paired with the exact geodesic distance from that node’s base point to p. Read more
Source§

fn covering_radius() -> Option<V::F>

The covering radius δ_s, recovered from the asserted bound. Read more
Source§

fn smooth(pts: Vec<P>, sweeps: usize) -> Option<Vec<P>>

Apply sweeps descent sweeps with both endpoints pinned. Read more
Source§

fn smoothed_prefix(p: &P, nodes: &[usize]) -> Option<ArcPoly<P, V::F>>

The smoothed prefix [p, x_{i₀}, …, x_u], with its arc length, ready to be compared against others at the same (node, class). Read more
Source§

fn same_basin( a: &ArcPoly<P, V::F>, b: &ArcPoly<P, V::F>, rho: V::F, ) -> Option<bool>

Whether two smoothed curves with common endpoints provably lie in one basin. Read more
Source§

fn provably_same_basin( a: &ArcPoly<P, V::F>, b: &ArcPoly<P, V::F>, rho: V::F, ) -> bool

Same basin, with “cannot prove” folded to “no”. Read more
Source§

fn basins( p: &P, q: &P, ) -> Option<(Result<Basin<P, V::F>, V::F>, bool, StraighteningResult<V::F>)>

Every distinct basin of geodesics from 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 more
Source§

fn geodesic_path(p: &P, q: &P) -> Option<Geodesic<P, V::F>>

The global geodesic from p to q, and its exact arc length. Read more
Source§

fn geodesic_distance(p: &P, q: &P) -> Option<V::F>

The global geodesic distance d_M(p, q). See Self::geodesic_path for the guarantee and its one precondition.
Source§

fn geodesic_distance_uncertified(p: &P, q: &P) -> Option<V::F>

The best-effort geodesic distance. This gives an exact locally minimal geodesic but does not guarantee that it is the minimal geodesic.
Source§

impl<B, T> Nodes<B> for T
where B: 'static + Send + Sync, T: BuildNodes<B> + 'static + Send + Sync,

Source§

fn nodes() -> &'static [B]

Source§

impl<T> OptionallyOption<T> for T

Source§

fn into_option(self) -> Option<T>

Converts either permitted representation into Option<T>. Read more
Source§

impl<T> Point for T
where T: Clone + Debug,

Source§

impl<T> Reassociate for T

Source§

fn reassociate<P>( self, ) -> <<Self as ReassociateKernel<P>>::Reassociated as NormalizeWith<Undecorated>>::Normalized
where Self: ReassociateKernel<P>, <Self as ReassociateKernel<P>>::Reassociated: NormalizeWith<Undecorated>,

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.