Skip to main content

amari_enumerative/
lib.rs

1//! # Amari Enumerative Geometry
2//!
3//! This crate provides enumerative geometry capabilities for the Amari mathematical library.
4//! It implements intersection theory, Schubert calculus, and tools for counting geometric
5//! configurations such as curves, surfaces, and higher-dimensional varieties.
6//!
7//! ## Features
8//!
9//! - **Intersection Theory**: Chow rings, intersection multiplicities, and Bezout's theorem
10//! - **Schubert Calculus**: Computations on Grassmannians and flag varieties
11//! - **Littlewood-Richardson Coefficients**: Complete LR coefficient computation
12//! - **Gromov-Witten Theory**: Curve counting and quantum cohomology
13//! - **Tropical Geometry**: Tropical curve counting and correspondence theorems
14//! - **Moduli Spaces**: Computations on moduli spaces of curves and surfaces
15//! - **Namespace/Capabilities**: Geometric access control via Schubert calculus
16//! - **Phantom Types**: Compile-time verification of mathematical properties
17//!
18//! ## Usage
19//!
20//! ```rust
21//! use amari_enumerative::{ProjectiveSpace, ChowClass, IntersectionRing};
22//!
23//! // Create projective 2-space
24//! let p2 = ProjectiveSpace::new(2);
25//!
26//! // Define two curves
27//! let cubic = ChowClass::hypersurface(3);
28//! let quartic = ChowClass::hypersurface(4);
29//!
30//! // Compute intersection number (Bezout's theorem)
31//! let intersection = p2.intersect(&cubic, &quartic);
32//! assert_eq!(intersection.multiplicity(), 12); // 3 * 4 = 12
33//! ```
34//!
35//! ## Schubert Calculus Example
36//!
37//! ```rust
38//! use amari_enumerative::{SchubertCalculus, SchubertClass, IntersectionResult};
39//!
40//! // How many lines meet 4 general lines in projective 3-space?
41//! let mut calc = SchubertCalculus::new((2, 4)); // Gr(2,4)
42//! let sigma_1 = SchubertClass::new(vec![1], (2, 4)).unwrap();
43//!
44//! let classes = vec![sigma_1.clone(), sigma_1.clone(), sigma_1.clone(), sigma_1.clone()];
45//! let result = calc.multi_intersect(&classes);
46//!
47//! assert_eq!(result, IntersectionResult::Finite(2)); // Answer: 2 lines!
48//! ```
49//!
50//! ## Phantom Types for Compile-Time Verification
51//!
52//! The crate provides zero-cost phantom types for compile-time verification:
53//!
54//! - `ValidPartition` / `UnvalidatedPartition`: Partition validity states
55//! - `Semistandard` / `LatticeWord`: Tableau property markers
56//! - `Granted` / `Pending` / `Revoked`: Capability grant states
57//! - `Transverse` / `Excess` / `Deficient`: Intersection dimension states
58//! - `FitsInBox` / `UnverifiedBox`: Grassmannian containment states
59
60#[cfg(test)]
61pub mod comprehensive_tests;
62pub mod verified_contracts;
63
64pub mod csm;
65pub mod geometric_algebra;
66pub mod gromov_witten;
67pub mod higher_genus;
68pub mod intersection;
69pub mod littlewood_richardson;
70pub mod localization;
71pub mod matroid;
72pub mod moduli_space;
73pub mod namespace;
74pub mod operad;
75pub mod phantom;
76pub mod schubert;
77pub mod stability;
78pub mod tropical_curves;
79pub mod wdvv;
80
81#[cfg(feature = "tropical-schubert")]
82pub mod tropical_schubert;
83
84#[cfg(feature = "gf2")]
85pub mod finite_field;
86pub mod kazhdan_lusztig;
87#[cfg(feature = "gf2")]
88pub mod representability;
89#[cfg(feature = "gf2")]
90pub mod weight_enumerator;
91
92// Re-export core types
93#[cfg(feature = "tropical-schubert")]
94pub use geometric_algebra::tropicalize_multivector;
95pub use geometric_algebra::{
96    quantum_k_theory, signatures, GeometricProjectiveSpace, GeometricSchubertClass,
97    GeometricVariety,
98};
99pub use gromov_witten::{CurveClass as GWCurveClass, GromovWittenInvariant, QuantumCohomology};
100pub use higher_genus::{
101    AdvancedCurveCounting, DTInvariant, HigherGenusCurve, JacobianData, PTInvariant,
102};
103pub use intersection::{
104    AlgebraicVariety, ChowClass, Constraint, Grassmannian, IntersectionNumber, IntersectionPoint,
105    IntersectionRing, MockMultivector, ProjectiveSpace, QuantumProduct,
106};
107pub use moduli_space::{CurveClass, ModuliSpace, TautologicalClass};
108
109// Schubert calculus exports
110pub use schubert::{FlagVariety, IntersectionResult, SchubertCalculus, SchubertClass};
111
112// Littlewood-Richardson exports
113pub use littlewood_richardson::{
114    lr_coefficient, schubert_product, Partition, SkewShape, SkewTableau,
115};
116
117// Parallel batch operations (when parallel feature is enabled)
118#[cfg(feature = "parallel")]
119pub use geometric_algebra::geometric_intersection_batch;
120#[cfg(feature = "parallel")]
121pub use littlewood_richardson::lr_coefficients_batch;
122#[cfg(feature = "parallel")]
123pub use namespace::{
124    capability_accessible_batch, count_configurations_batch, namespace_intersection_batch,
125};
126#[cfg(feature = "parallel")]
127pub use schubert::multi_intersect_batch;
128#[cfg(feature = "parallel")]
129pub use tropical_curves::{mikhalkin_correspondence_verify_batch, verify_mikhalkin_gw_batch};
130
131// Namespace exports for geometric access control
132pub use namespace::{
133    capability_accessible, namespace_intersection, Capability, CapabilityId, Namespace,
134    NamespaceBuilder, NamespaceError, NamespaceIntersection, QuantumCapability,
135};
136
137// Tropical curves
138pub use tropical_curves::{
139    verify_mikhalkin_gw, MikhalkinResult, TropicalCurve, TropicalEdge, TropicalIntersection,
140    TropicalModuliSpace, TropicalPoint,
141};
142
143// Optional tropical Schubert exports
144#[cfg(all(feature = "tropical-schubert", feature = "parallel"))]
145pub use geometric_algebra::tropicalize_multivector_batch;
146#[cfg(all(feature = "tropical-schubert", feature = "parallel"))]
147pub use tropical_schubert::{tropical_convexity_batch, tropical_intersection_batch};
148#[cfg(feature = "tropical-schubert")]
149pub use tropical_schubert::{
150    tropical_convexity_check, tropical_intersection_count, TropicalResult, TropicalSchubertClass,
151};
152
153// Phantom types for compile-time verification
154pub use phantom::{
155    // Box containment
156    BoxContainment,
157    Deficient,
158    Excess,
159    FitsInBox,
160    // Grant states
161    GrantState,
162    Granted,
163    // Intersection dimension
164    IntersectionDimension,
165    LatticeWord,
166    // Partition validity
167    PartitionValidity,
168    Pending,
169    // Properties wrapper
170    Properties,
171    Revoked,
172    Semistandard,
173    // Tableau validity
174    TableauValidity,
175    Transverse,
176    UnknownDimension,
177    UnvalidatedPartition,
178    UnverifiedBox,
179    UnverifiedTableau,
180    // Type aliases
181    ValidLRTableau,
182    ValidPartition,
183    ValidSchubertClass,
184};
185
186use thiserror::Error;
187
188/// Error types for enumerative geometry computations
189#[derive(Error, Debug, Clone, PartialEq)]
190pub enum EnumerativeError {
191    /// Invalid dimension for the ambient space
192    #[error("Invalid dimension: {0}")]
193    InvalidDimension(String),
194
195    /// Intersection computation failed
196    #[error("Intersection error: {0}")]
197    IntersectionError(String),
198
199    /// Schubert calculus error
200    #[error("Schubert calculus error: {0}")]
201    SchubertError(String),
202
203    /// Gromov-Witten invariant computation error
204    #[error("Gromov-Witten error: {0}")]
205    GromovWittenError(String),
206
207    /// General computational error
208    #[error("Computation error: {0}")]
209    ComputationError(String),
210
211    /// Matroid representability error
212    #[error("Representability error: {0}")]
213    RepresentabilityError(String),
214
215    /// Linear code error
216    #[error("Code error: {0}")]
217    CodeError(String),
218
219    /// Invalid field size (must be a prime power)
220    #[error("Invalid field size: {q} is not a prime power")]
221    InvalidFieldSize { q: u64 },
222
223    /// Search space too large for exhaustive computation
224    #[error("Search space too large: {description}")]
225    SearchSpaceTooLarge { description: String },
226}
227
228/// Result type for enumerative geometry computations
229pub type EnumerativeResult<T> = Result<T, EnumerativeError>;
230
231// WDVV recursion
232pub use wdvv::WDVVEngine;
233
234// Equivariant localization
235pub use localization::{EquivariantLocalizer, FixedPoint, TorusWeights};
236
237// Matroids
238pub use matroid::{Matroid, ValuatedMatroid};
239
240// Kazhdan-Lusztig polynomials
241pub use kazhdan_lusztig::{
242    flag_f_vector, inverse_kl_polynomial, kl_is_non_negative, kl_polynomial, z_polynomial,
243};
244
245// GF(2)-dependent modules
246#[cfg(feature = "gf2")]
247pub use finite_field::{
248    grassmannian_poincare_polynomial, grassmannian_points, point_counts_over_extensions,
249    schubert_cell_points, schubert_poincare_polynomial, schubert_variety_points,
250    schubert_zeta_exponents,
251};
252#[cfg(feature = "gf2")]
253pub use representability::{
254    column_matroid, dual_fano_matroid, fano_matroid, has_minor, is_binary, is_regular, is_ternary,
255    standard_representation, RepresentabilityResult,
256};
257#[cfg(feature = "gf2")]
258pub use weight_enumerator::{
259    extended_golay_code, gilbert_varshamov_bound, hamming_bound, hamming_code, plotkin_bound,
260    reed_muller_code, simplex_code, singleton_bound, BinaryCode,
261};
262
263// CSM classes
264pub use csm::{CSMClass, SegreClass};
265
266// Operadic composition
267pub use operad::{
268    compose_namespaces, composition_multiplicity, interfaces_compatible, ComposableNamespace,
269    Interface, InterfaceDirection,
270};
271
272// Wall-crossing / stability
273pub use stability::{StabilityCondition, Wall, WallCrossingEngine};
274
275// Parallel batch operations for new modules
276#[cfg(feature = "parallel")]
277pub use csm::{csm_of_cells_batch, euler_characteristic_batch};
278#[cfg(feature = "parallel")]
279pub use matroid::{circuits_batch, intersection_cardinality_batch, tutte_polynomial_batch};
280#[cfg(feature = "parallel")]
281pub use stability::{compute_walls_batch, stable_count_batch};
282#[cfg(feature = "parallel")]
283pub use wdvv::rational_curve_count_batch;