optirs_core/lib.rs
1//! # OptiRS Core - Advanced ML Optimization Built on SciRS2
2//!
3//! **Version:** 0.3.2
4//! **Status:** Pre-1.0 (0.3.x) - the public API may still change between 0.x releases
5//!
6//! `optirs-core` provides state-of-the-art optimization algorithms for machine learning,
7//! built exclusively on the [SciRS2](https://github.com/cool-japan/scirs) scientific computing ecosystem.
8//!
9//! ## Dependencies
10//!
11//! - `scirs2-core` 0.6.5, `scirs2-optimize` 0.6.5 - Required foundation
12//! - `scirs2-neural`, `scirs2-stats` - Unconditional dependencies, pulled in for specific
13//! modules (e.g. `neuromorphic`, distribution-based regularizers) but not behind a feature
14//! - `scirs2-metrics` - Optional, behind the `metrics-integration` feature
15//! - `scirs2-datasets` - Optional, behind the `cross-platform-testing` feature
16//!
17//! ## Quick Start
18//!
19//! ```rust
20//! use optirs_core::optimizers::{Adam, Optimizer};
21//! use scirs2_core::ndarray::Array1;
22//!
23//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
24//! // Create optimizer
25//! let mut optimizer = Adam::new(0.001);
26//!
27//! // Prepare parameters and gradients
28//! let params = Array1::from_vec(vec![1.0, 2.0, 3.0, 4.0]);
29//! let grads = Array1::from_vec(vec![0.1, 0.2, 0.15, 0.08]);
30//!
31//! // Perform optimization step
32//! let updated_params = optimizer.step(¶ms, &grads)?;
33//! # Ok(())
34//! # }
35//! ```
36//!
37//! ## Features
38//!
39//! ### 26 Optimizers
40//!
41//! 22 types implement the [`optimizers::Optimizer`] trait (`optirs_core::optimizers`, listed
42//! below). 4 more live in [`second_order`] (`optirs_core::second_order`) as a separate family
43//! not reachable through `Optimizer`: 2 implement [`second_order::SecondOrderOptimizer`]
44//! (Newton, and a second, independent L-BFGS implementation re-exported as `SecondOrderLBFGS`
45//! to avoid colliding with `optimizers::LBFGS`), and 2 expose their own inherent
46//! `step`/`step_with_loss` methods instead of a shared trait (NewtonCG, KFAC).
47//!
48//! **First-Order Methods (17):**
49//! - **SGD** - Stochastic Gradient Descent with optional momentum
50//! - **SimdSGD** - SIMD-accelerated SGD
51//! - **Adam** - Adaptive Moment Estimation
52//! - **AdamW** - Adam with decoupled weight decay
53//! - **AdaDelta** - Adaptive LR without manual tuning
54//! - **AdaBound** - Smooth Adam→SGD transition
55//! - **Ranger** - RAdam + Lookahead combination
56//! - **RMSprop** - Root Mean Square Propagation
57//! - **Adagrad** - Adaptive Gradient Algorithm
58//! - **LAMB** - Layer-wise Adaptive Moments for Batch training
59//! - **LARS** - Layer-wise Adaptive Rate Scaling
60//! - **Lion** - Evolved Sign Momentum
61//! - **Lookahead** - Look ahead optimizer wrapper
62//! - **RAdam** - Rectified Adam
63//! - **SAM** - Sharpness-Aware Minimization
64//! - **SparseAdam** - Adam optimized for sparse gradients
65//! - **GroupedAdam** - Adam with parameter groups
66//!
67//! **Quasi-Newton (1):**
68//! - **LBFGS** (`optimizers::LBFGS`) - Limited-memory BFGS with two-loop recursion
69//!
70//! **Meta-Learning Optimizers (4)** - these also implement [`optimizers::Optimizer`], so they
71//! drop into the same training loop as any other entry above:
72//! - **MAML** - Model-Agnostic Meta-Learning (SecondOrder/FirstOrder/Reptile variants)
73//! - **MetaSGD** - Meta-learned per-parameter learning rates
74//! - **ReptileOptimizer** - First-order meta-learning
75//! - **NtmOptimizer** - Neural Turing Machine-style memory-augmented optimizer
76//!
77//! **`second_order` module (4)** - not part of `optimizers::Optimizer`:
78//! - **Newton** (`second_order::Newton`) - implements `SecondOrderOptimizer`; diagonal Newton
79//! step with curvature flooring
80//! - **SecondOrderLBFGS** (`second_order::LBFGS`) - implements `SecondOrderOptimizer`; a
81//! separate, simpler L-BFGS implementation from `optimizers::LBFGS` above
82//! - **NewtonCG** - own `step`/`step_with_loss` API; Newton Conjugate Gradient with
83//! trust-region control
84//! - **KFAC** - own `step` API; Kronecker-Factored Approximate Curvature
85//!
86//! ### Performance Optimizations
87//!
88//! #### SIMD Acceleration
89//! ```rust
90//! use optirs_core::optimizers::{Optimizer, SimdSGD};
91//! use scirs2_core::ndarray::Array1;
92//!
93//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
94//! let params = Array1::from_elem(100_000, 1.0f32);
95//! let grads = Array1::from_elem(100_000, 0.001f32);
96//!
97//! let mut optimizer = SimdSGD::new(0.01f32);
98//! let updated = optimizer.step(¶ms, &grads)?;
99//! # Ok(())
100//! # }
101//! ```
102//!
103//! #### Parallel Processing
104//! ```rust
105//! use optirs_core::optimizers::{Adam, Optimizer};
106//! use optirs_core::parallel_optimizer::parallel_step_array1;
107//! use scirs2_core::ndarray::Array1;
108//!
109//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
110//! let params_list = vec![
111//! Array1::from_elem(10_000, 1.0),
112//! Array1::from_elem(20_000, 1.0),
113//! ];
114//! let grads_list = vec![
115//! Array1::from_elem(10_000, 0.01),
116//! Array1::from_elem(20_000, 0.01),
117//! ];
118//!
119//! let mut optimizer = Adam::new(0.001);
120//! let results = parallel_step_array1(&mut optimizer, ¶ms_list, &grads_list)?;
121//! # Ok(())
122//! # }
123//! ```
124//!
125//! #### Memory-Efficient Operations
126//! ```rust
127//! use optirs_core::memory_efficient_optimizer::GradientAccumulator;
128//! use scirs2_core::ndarray::Array1;
129//!
130//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
131//! let mut accumulator = GradientAccumulator::<f32>::new(1000);
132//!
133//! // Accumulate gradients from micro-batches
134//! for _ in 0..4 {
135//! let micro_grads = Array1::from_elem(1000, 0.1);
136//! accumulator.accumulate(µ_grads.view())?;
137//! }
138//!
139//! let avg_grads = accumulator.average()?;
140//! # Ok(())
141//! # }
142//! ```
143//!
144//! #### Production Metrics & Monitoring
145//! ```rust
146//! use optirs_core::optimizer_metrics::{MetricsCollector, MetricsReporter};
147//! use optirs_core::optimizers::{Adam, Optimizer};
148//! use scirs2_core::ndarray::Array1;
149//! use std::time::{Duration, Instant};
150//!
151//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
152//! let mut collector = MetricsCollector::new();
153//! collector.register_optimizer("adam");
154//!
155//! let mut optimizer = Adam::new(0.001);
156//! let params = Array1::from_elem(1000, 1.0);
157//! let grads = Array1::from_elem(1000, 0.01);
158//!
159//! let params_before = params.clone();
160//! let start = Instant::now();
161//! let params = optimizer.step(¶ms, &grads)?;
162//! let duration = start.elapsed();
163//!
164//! collector.update(
165//! "adam",
166//! duration,
167//! 0.001,
168//! &grads.view(),
169//! ¶ms_before.view(),
170//! ¶ms.view(),
171//! )?;
172//!
173//! println!("{}", collector.summary_report());
174//! # Ok(())
175//! # }
176//! ```
177//!
178//! ### Learning Rate Schedulers (`optirs_core::schedulers`)
179//!
180//! - **ConstantScheduler**, **ExponentialDecay**, **StepDecay**, **LinearDecay** - basic decays
181//! - **CosineAnnealing**, **CosineAnnealingWarmRestarts** - cosine schedules
182//! - **LinearWarmupDecay**, **OneCycle**, **CyclicLR** - warmup / cyclic policies
183//! - **ReduceOnPlateau** - metric-driven LR reduction
184//! - **CurriculumScheduler** - staged curriculum transitions
185//! - **NoiseInjectionScheduler** - stochastic LR perturbation
186//! - **AttentionAwareScheduler** - component-specific LR scaling for Transformer models
187//! - **ViTLayerDecay** - per-layer exponential LR decay for Vision Transformers
188//! - **CustomScheduler** / **CombinedScheduler** / **SchedulerBuilder** - compose schedules
189//! from closures
190//!
191//! ### Advanced Features
192//!
193//! - **Parameter Groups** - Different learning rates per layer
194//! - **Gradient Accumulation** - Micro-batch training for large models
195//! - **Gradient Clipping** - Prevent exploding gradients
196//! - **Regularization** - L1, L2, weight decay
197//! - **Privacy-Preserving** - Differential privacy support (Rényi DP accountant, secure
198//! aggregation)
199//! - **Distributed Training** - Parameter averaging, ring all-reduce/all-gather, pipeline
200//! parallelism (GPipe/1F1B), elastic (join/leave) training. Device-level GPU/TPU
201//! coordination lives in the separate `optirs-gpu` / `optirs-tpu` crates.
202//!
203//! ## Architecture
204//!
205//! ### SciRS2 Foundation
206//!
207//! OptiRS-Core is built **exclusively** on the SciRS2 ecosystem:
208//!
209//! - **Arrays**: Uses `scirs2_core::ndarray` (NOT direct ndarray)
210//! - **Random**: Uses `scirs2_core::random` (NOT direct rand)
211//! - **SIMD**: Uses `scirs2_core::simd_ops` for vectorization
212//! - **Parallel**: Uses `scirs2_core::parallel_ops` for multi-core
213//! - **GPU**: Built on `scirs2_core::gpu` abstractions
214//! - **Metrics**: Uses `scirs2_core::metrics` for monitoring
215//! - **Error Handling**: Uses `scirs2_core::error::Result`
216//!
217//! This integration ensures:
218//! - Type safety across the ecosystem
219//! - Consistent performance optimizations
220//! - Unified error handling
221//! - Simplified dependency management
222//!
223//! ### Module Organization
224//!
225//! - [`optimizers`] - Core optimizer implementations
226//! - [`schedulers`] - Learning rate scheduling
227//! - [`simd_optimizer`] - SIMD-accelerated optimizers
228//! - [`parallel_optimizer`] - Multi-core processing
229//! - [`memory_efficient_optimizer`] - Memory optimization
230//! - [`gpu_optimizer`] - GPU acceleration
231//! - [`optimizer_metrics`] - Performance monitoring
232//! - [`gradient_processing`] - Gradient manipulation
233//! - [`regularizers`] - Regularization techniques
234//! - [`second_order`] - Second-order methods
235//! - [`distributed`] - Distributed training
236//! - [`privacy`] - Privacy-preserving optimization
237//!
238//! ## Performance
239//!
240//! ### Benchmarks
241//!
242//! All benchmarks use [Criterion.rs](https://github.com/bheisler/criterion.rs) with statistical analysis:
243//!
244//! - **optimizer_benchmarks** - Compare optimizer implementations
245//! - **simd_benchmarks** - SIMD vs scalar performance
246//! - **parallel_benchmarks** - Multi-core scaling
247//! - **memory_efficient_benchmarks** - Memory optimization impact
248//! - **gpu_benchmarks** - GPU vs CPU comparison
249//! - **metrics_benchmarks** - Monitoring overhead
250//!
251//! Run benchmarks:
252//! ```bash
253//! cargo bench --package optirs-core
254//! ```
255//!
256//! ### Test Coverage
257//!
258//! - **2202 tests** - library + integration tests (`cargo nextest run -p optirs-core --all-features`)
259//! - **95 doc tests** - Documentation examples
260//! - **Zero clippy warnings** - `cargo clippy -p optirs-core --all-features --all-targets`
261//!
262//! ## Examples
263//!
264//! See the `examples/` directory for comprehensive examples:
265//!
266//! - `sgd_example.rs` - Getting started
267//! - `advanced_optimization.rs` - Schedulers, regularization, clipping
268//! - `performance_optimization.rs` - SIMD, parallel, GPU acceleration
269//! - `production_monitoring.rs` - Metrics and convergence detection
270//!
271//! ## Contributing
272//!
273//! When contributing, ensure:
274//! - **100% SciRS2 usage** - No direct ndarray/rand/rayon imports
275//! - **Zero clippy warnings** - Run `cargo clippy`
276//! - **All tests pass** - Run `cargo test`
277//! - **Documentation** - Add examples to public APIs
278//!
279//! ## License
280//!
281//! licensed under Apache-2.0
282
283pub mod adaptive_selection;
284pub mod benchmarking;
285#[cfg(not(target_arch = "wasm32"))]
286pub mod coordination;
287pub mod curriculum_optimization;
288#[cfg(not(target_arch = "wasm32"))]
289pub mod distributed;
290#[cfg(not(target_arch = "wasm32"))]
291pub mod domain_specific;
292pub mod error;
293pub mod gpu_optimizer;
294pub mod gradient_accumulation;
295pub mod gradient_flow;
296pub mod gradient_processing;
297#[cfg(not(target_arch = "wasm32"))]
298pub mod hardware_aware;
299pub mod loss_landscape;
300#[cfg(not(target_arch = "wasm32"))]
301pub mod memory_efficient;
302pub mod memory_efficient_optimizer;
303pub mod metrics;
304pub mod neural_integration;
305#[cfg(not(target_arch = "wasm32"))]
306pub mod neuromorphic;
307pub mod online_learning;
308pub mod optimizer_composition;
309pub mod optimizer_metrics;
310pub mod optimizers;
311#[cfg(not(target_arch = "wasm32"))]
312pub mod parallel_optimizer;
313pub mod parameter_groups;
314#[cfg(not(target_arch = "wasm32"))]
315pub mod plugin;
316#[cfg(not(target_arch = "wasm32"))]
317pub mod privacy;
318pub mod quantum_inspired;
319pub mod regularizers;
320pub mod reinforcement_learning;
321#[cfg(not(target_arch = "wasm32"))]
322pub mod research;
323pub mod schedulers;
324pub mod second_order;
325pub mod self_tuning;
326pub mod sensitivity_analysis;
327pub mod simd_optimizer;
328#[cfg(not(target_arch = "wasm32"))]
329pub mod streaming;
330pub mod training_stabilization;
331pub mod unified_api;
332pub mod utils;
333pub mod visualization;
334
335// Re-export commonly used types
336pub use error::{OptimError, OptimizerError, Result};
337pub use optimizers::*;
338pub use parameter_groups::*;
339pub use regularizers::*;
340pub use schedulers::*;
341pub use unified_api::{OptimizerConfig, OptimizerFactory, Parameter, UnifiedOptimizer};
342
343// Re-export key functionality
344pub use adaptive_selection::{
345 AdaptiveOptimizerSelector, OptimizerStatistics, OptimizerType, PerformanceMetrics,
346 ProblemCharacteristics, ProblemType, SelectionNetwork, SelectionStrategy,
347};
348pub use curriculum_optimization::{
349 AdaptiveCurriculum, AdversarialAttack, AdversarialConfig, CurriculumManager, CurriculumState,
350 CurriculumStrategy, ImportanceWeightingStrategy,
351};
352#[cfg(not(target_arch = "wasm32"))]
353pub use distributed::{
354 AveragingStrategy, CommunicationResult, CompressedGradient, CompressionStrategy,
355 DistributedCoordinator, GradientCompressor, ParameterAverager, ParameterServer,
356};
357#[cfg(not(target_arch = "wasm32"))]
358pub use domain_specific::{
359 CrossDomainKnowledge, DomainOptimizationConfig, DomainPerformanceMetrics, DomainRecommendation,
360 DomainSpecificSelector, DomainStrategy, LearningRateScheduleType, OptimizationContext,
361 RecommendationType, RegularizationApproach, ResourceConstraints, TrainingConfiguration,
362};
363pub use gpu_optimizer::{GpuConfig, GpuMemoryStats, GpuOptimizer, GpuUtils};
364pub use gradient_accumulation::{
365 AccumulationMode, GradientAccumulator as GradAccumulator, MicroBatchTrainer,
366 VariableAccumulator,
367};
368pub use gradient_processing::*;
369pub use memory_efficient_optimizer::{
370 ChunkedOptimizer, GradientAccumulator as MemoryEfficientGradientAccumulator,
371 MemoryUsageEstimator,
372};
373pub use neural_integration::architecture_aware::{
374 ArchitectureAwareOptimizer, ArchitectureStrategy,
375};
376pub use neural_integration::forward_backward::{BackwardHook, ForwardHook, NeuralIntegration};
377pub use neural_integration::{
378 LayerArchitecture, LayerId, OptimizationConfig, ParamId, ParameterManager, ParameterMetadata,
379 ParameterOptimizer, ParameterType,
380};
381pub use online_learning::{
382 ColumnGrowthStrategy, LearningRateAdaptation, LifelongOptimizer, LifelongStats,
383 LifelongStrategy, MemoryExample, MemoryUpdateStrategy, MirrorFunction, OnlineLearningStrategy,
384 OnlineOptimizer, OnlinePerformanceMetrics, SharedKnowledge, TaskGraph,
385};
386pub use optimizer_metrics::{
387 ConvergenceMetrics, GradientStatistics, MetricsCollector, MetricsReporter, OptimizerMetrics,
388 ParameterStatistics,
389};
390#[cfg(not(target_arch = "wasm32"))]
391pub use parallel_optimizer::{
392 parallel_step, parallel_step_array1, ParallelBatchProcessor, ParallelOptimizer,
393};
394#[cfg(not(target_arch = "wasm32"))]
395pub use plugin::core::{
396 create_basic_capabilities, create_plugin_info, OptimizerPluginFactory, PluginCategory,
397 PluginInfo,
398};
399#[cfg(not(target_arch = "wasm32"))]
400pub use plugin::sdk::BaseOptimizerPlugin;
401#[cfg(not(target_arch = "wasm32"))]
402pub use plugin::{
403 OptimizerPlugin, PluginCapabilities, PluginLoader, PluginRegistry, PluginValidationFramework,
404};
405#[cfg(not(target_arch = "wasm32"))]
406pub use privacy::{
407 AccountingMethod, ClippingStats, DifferentialPrivacyConfig, DifferentiallyPrivateOptimizer,
408 MomentsAccountant, NoiseMechanism, PrivacyBudget, PrivacyValidation,
409};
410pub use quantum_inspired::{
411 HybridQuantumClassical, OptimizationPhase, QuantumAnnealing, QuantumOptimizerConfig,
412 VariationalQuantumOptimizer,
413};
414pub use second_order::{
415 HessianInfo, Newton, NewtonCG, SecondOrderOptimizer, LBFGS as SecondOrderLBFGS,
416};
417pub use self_tuning::{
418 OptimizerInfo, OptimizerTrait, PerformanceStats, SelfTuningConfig, SelfTuningOptimizer,
419 SelfTuningStatistics, TargetMetric,
420};
421pub use sensitivity_analysis::{
422 MorrisAnalyzer, MorrisIndices, OatAnalyzer, OatResult, SensitivityAnalyzer, SensitivityIndices,
423 SobolAnalyzer,
424};
425pub use simd_optimizer::{should_use_simd, SimdOptimizer};
426#[cfg(not(target_arch = "wasm32"))]
427pub use streaming::{
428 LearningRateAdaptation as StreamingLearningRateAdaptation, StreamingConfig, StreamingDataPoint,
429 StreamingHealthStatus, StreamingMetrics, StreamingOptimizer,
430};
431pub use training_stabilization::{AveragingMethod, ModelEnsemble, PolyakAverager, WeightAverager};
432pub use visualization::{
433 ColorScheme, ConvergenceInfo, DataSeries, MemoryStats as VisualizationMemoryStats,
434 OptimizationMetric, OptimizationVisualizer, OptimizerComparison, PlotType, VisualizationConfig,
435};
436
437#[cfg(feature = "metrics-integration")]
438pub use metrics::*;