sklears_linear/
lib.rs

1#![allow(dead_code)]
2#![allow(non_snake_case)]
3#![allow(missing_docs)]
4#![allow(deprecated)]
5#![allow(clippy::needless_range_loop)]
6#![allow(clippy::derivable_impls)]
7#![allow(clippy::needless_borrow)]
8//! Linear models for sklears
9//!
10//! This crate provides implementations of linear models including:
11//! - Linear Regression (OLS, Ridge, Lasso)
12//! - Logistic Regression
13//! - Generalized Linear Models
14//!
15//! These implementations leverage scirs2's linear algebra and optimization capabilities.
16
17#[cfg(feature = "admm")]
18pub mod admm;
19#[cfg(feature = "gpu")]
20pub mod advanced_gpu_acceleration;
21#[cfg(feature = "bayesian")]
22pub mod bayesian;
23pub mod builder_enhancements;
24#[cfg(feature = "feature-selection")]
25pub mod categorical_encoding;
26#[cfg(feature = "chunked-processing")]
27pub mod chunked_processing;
28#[cfg(feature = "diagnostics")]
29pub mod classification_diagnostics;
30#[cfg(feature = "constrained-optimization")]
31// TODO: Migrate to scirs2-linalg (uses nalgebra types)
32//pub mod constrained_optimization;
33#[cfg(feature = "convergence-analysis")]
34pub mod convergence_visualization;
35#[cfg(feature = "coordinate-descent")]
36pub mod coordinate_descent;
37#[cfg(feature = "cross-validation")]
38pub mod cross_validation;
39#[cfg(feature = "early-stopping")]
40pub mod early_stopping;
41#[cfg(feature = "elastic-net")]
42pub mod elastic_net_cv;
43pub mod errors;
44#[cfg(feature = "feature-selection")]
45pub mod feature_scaling;
46#[cfg(feature = "feature-selection")]
47pub mod feature_selection;
48#[cfg(feature = "glm")]
49// TODO: Migrate to scirs2-linalg (uses ndarray_linalg::Solve)
50//pub mod glm;
51#[cfg(feature = "gpu")]
52pub mod gpu_acceleration;
53#[cfg(feature = "huber")]
54pub mod huber;
55pub mod irls;
56#[cfg(feature = "lasso")]
57pub mod lars;
58#[cfg(feature = "lasso")]
59pub mod lasso_cv;
60#[cfg(feature = "lasso")]
61pub mod lasso_lars;
62#[cfg(feature = "linear-regression")]
63pub mod linear_regression;
64#[cfg(feature = "logistic-regression")]
65pub mod logistic_regression;
66// TODO: Temporarily disabled until cross_val_score is generalized for LogisticRegression
67// #[cfg(feature = "logistic-regression")]
68// pub mod logistic_regression_cv;
69#[cfg(feature = "memory-mapping")]
70pub mod memory_efficient_ops;
71#[cfg(feature = "memory-mapping")]
72pub mod mmap_arrays;
73#[cfg(any(feature = "multi-task", feature = "all-algorithms"))]
74// TODO: Migrate to scirs2-linalg (uses nalgebra types)
75//pub mod multi_output_regression;
76#[cfg(feature = "multi-task-elastic-net")]
77pub mod multi_task_elastic_net;
78#[cfg(feature = "multi-task-elastic-net")]
79pub mod multi_task_elastic_net_cv;
80#[cfg(feature = "multi-task")]
81pub mod multi_task_feature_selection;
82#[cfg(feature = "multi-task-lasso")]
83pub mod multi_task_lasso;
84#[cfg(feature = "multi-task-lasso")]
85pub mod multi_task_lasso_cv;
86#[cfg(feature = "multi-task")]
87pub mod multi_task_shared_representation;
88#[cfg(feature = "lasso")]
89pub mod omp;
90#[cfg(feature = "online-learning")]
91pub mod online_learning;
92pub mod optimizer;
93#[cfg(feature = "sgd")]
94pub mod passive_aggressive;
95#[cfg(feature = "regularization-path")]
96pub mod paths;
97#[cfg(feature = "sgd")]
98pub mod perceptron;
99#[cfg(feature = "feature-selection")]
100pub mod polynomial_features;
101#[cfg(feature = "quantile-regression")]
102// TODO: Migrate to scirs2-linalg (uses ndarray_linalg::Solve)
103//pub mod quantile;
104#[cfg(feature = "ransac")]
105pub mod ransac;
106#[cfg(feature = "feature-selection")]
107pub mod recursive_feature_elimination;
108#[cfg(feature = "residual-analysis")]
109pub mod residual_analysis;
110#[cfg(feature = "ridge")]
111pub mod ridge_classifier;
112#[cfg(feature = "ridge")]
113pub mod ridge_cv;
114#[cfg(feature = "serde")]
115// TODO: Migrate to scirs2-linalg (uses nalgebra types)
116//pub mod serialization;
117#[cfg(feature = "sgd")]
118pub mod sgd;
119// #[cfg(feature = "simd")]
120// TODO: Migrate to scirs2-linalg (uses nalgebra types)
121//pub mod simd_optimizations;
122pub mod solver;
123#[cfg(feature = "sparse")]
124pub mod sparse;
125#[cfg(feature = "sparse")]
126pub mod sparse_linear_regression;
127#[cfg(feature = "sparse")]
128pub mod sparse_regularized;
129#[cfg(feature = "feature-selection")]
130pub mod stability_selection;
131#[cfg(feature = "streaming")]
132pub mod streaming_algorithms;
133pub mod utils;
134
135// New modular framework modules
136pub mod large_scale_variational_inference;
137pub mod loss_functions;
138pub mod modular_framework;
139pub mod regularization_schemes;
140pub mod solver_implementations;
141pub mod type_safety;
142pub mod uncertainty_quantification;
143
144#[cfg(feature = "theil-sen")]
145pub mod theil_sen;
146
147//#[allow(non_snake_case)]
148#[cfg(test)]
149//pub mod advanced_property_tests;
150#[cfg(feature = "admm")]
151pub use admm::{AdmmConfig, AdmmSolution, AdmmSolver};
152
153#[cfg(feature = "bayesian")]
154pub use bayesian::{
155    ARDRegression, ARDRegressionConfig, BayesianRidge, BayesianRidgeConfig,
156    VariationalBayesianConfig, VariationalBayesianRegression,
157};
158pub use builder_enhancements::{
159    EnhancedLinearRegressionBuilder, ModelPreset, ModelValidation, ValidationConfig,
160};
161
162#[cfg(feature = "logistic-regression")]
163pub use builder_enhancements::EnhancedLogisticRegressionBuilder;
164
165#[cfg(feature = "feature-selection")]
166pub use categorical_encoding::{
167    CategoricalEncoder, CategoricalEncodingConfig, CategoricalEncodingResult,
168    CategoricalEncodingStrategy, CategoricalFeatureInfo, UnknownHandling,
169};
170
171#[cfg(feature = "chunked-processing")]
172pub use chunked_processing::{
173    ChunkProcessingConfig, ChunkProcessingResult, ChunkedDataIterator, ChunkedLinearRegression,
174    ChunkedMatrixProcessor, ChunkedProcessingUtils, ChunkedProcessor, MemoryStats,
175    ParallelChunkedProcessor,
176};
177
178#[cfg(feature = "diagnostics")]
179pub use classification_diagnostics::{
180    CalibrationResult, ClassImbalanceResult, ClassificationDiagnostics,
181    ClassificationDiagnosticsConfig, DecisionBoundaryResult, FeatureImportanceMethod,
182    FeatureImportanceResult,
183};
184
185#[cfg(feature = "constrained-optimization")]
186// TODO: Migrate to scirs2-linalg (uses nalgebra types)
187// pub use constrained_optimization::{
188//     ConstrainedLinearRegression, ConstrainedOptimizationBuilder, ConstrainedOptimizationConfig,
189//     ConstrainedOptimizationProblem, ConstrainedOptimizationResult, ConstraintType,
190//     InteriorPointSolver,
191// };
192#[cfg(feature = "convergence-analysis")]
193pub use convergence_visualization::{
194    ComparisonResult, ConvergenceAnalysis, ConvergenceConfig, ConvergenceCriteria,
195    ConvergenceCriterion, ConvergenceMetric, ConvergenceReport, ConvergenceStatus,
196    ConvergenceTracker, MetricHistory, MetricSummary, PlotData,
197};
198
199#[cfg(feature = "coordinate-descent")]
200pub use coordinate_descent::{CoordinateDescentSolver, ValidationInfo};
201
202#[cfg(feature = "cross-validation")]
203pub use cross_validation::{
204    cross_validate_with_early_stopping, CVStrategy, CrossValidationResult,
205    CrossValidatorWithEarlyStopping, StratifiedKFold,
206};
207
208#[cfg(feature = "early-stopping")]
209pub use early_stopping::{
210    train_validation_split, EarlyStopping, EarlyStoppingCallback, EarlyStoppingConfig,
211    StoppingCriterion,
212};
213
214#[cfg(feature = "elastic-net")]
215pub use elastic_net_cv::{ElasticNetCV, ElasticNetCVConfig};
216pub use errors::{
217    ConfigurationError, ConfigurationErrorKind, ConvergenceInfo, CrossValidationError,
218    CrossValidationErrorKind, DataError, DataErrorKind, ErrorBuilder, ErrorSeverity, FeatureError,
219    FeatureErrorKind, FoldInfo, LinearModelError, MatrixError, MatrixErrorKind, MatrixInfo,
220    NumericalError, NumericalErrorKind, OptimizationError, OptimizationErrorKind, ResourceError,
221    ResourceErrorKind, ResourceInfo, StateError, StateErrorKind,
222};
223#[cfg(feature = "feature-selection")]
224pub use feature_scaling::{
225    FeatureScaler, FeatureScalerBuilder, FeatureScalingConfig, FeatureStats, PowerTransformMethod,
226    ScalingMethod,
227};
228#[cfg(feature = "feature-selection")]
229pub use feature_selection::{
230    FeatureScore, FeatureSelectionConfig, FeatureSelector, ModelBasedEstimator, UnivariateScoreFunc,
231};
232#[cfg(feature = "glm")]
233// TODO: Migrate to scirs2-linalg (uses ndarray_linalg::Solve)
234// pub use glm::{Family, GLMConfig, GeneralizedLinearModel, Link};
235#[cfg(feature = "huber")]
236pub use huber::{HuberRegressor, HuberRegressorConfig};
237// TODO: Migrate to scirs2-linalg (uses ndarray_linalg::Solve)
238// pub use irls::{IRLSConfig, IRLSEstimator, IRLSResult, ScaleEstimator, WeightFunction};
239#[cfg(feature = "lasso")]
240pub use lars::{Lars, LarsConfig};
241#[cfg(feature = "lasso")]
242pub use lasso_cv::{LassoCV, LassoCVConfig};
243#[cfg(feature = "lasso")]
244pub use lasso_lars::{LassoLars, LassoLarsConfig};
245#[cfg(feature = "linear-regression")]
246pub use linear_regression::{LinearRegression, LinearRegressionConfig};
247#[cfg(feature = "logistic-regression")]
248pub use logistic_regression::{LogisticRegression, LogisticRegressionConfig};
249// TODO: Temporarily disabled until cross_val_score is generalized for LogisticRegression
250// #[cfg(feature = "logistic-regression")]
251// pub use logistic_regression_cv::{LogisticRegressionCV, LogisticRegressionCVConfig};
252#[cfg(feature = "memory-mapping")]
253pub use memory_efficient_ops::{
254    MemoryEfficiencyConfig, MemoryEfficientCoordinateDescent, MemoryEfficientOps, MemoryOperation,
255    NormType,
256};
257#[cfg(feature = "memory-mapping")]
258pub use mmap_arrays::{
259    MmapAdvice, MmapConfig, MmapMatrix, MmapMatrixMut, MmapUtils, MmapVector, MmapVectorMut,
260};
261#[cfg(any(feature = "multi-task", feature = "all-algorithms"))]
262// TODO: Migrate to scirs2-linalg (uses nalgebra types)
263// pub use multi_output_regression::{
264//     MultiOutputConfig, MultiOutputRegression, MultiOutputRegressionBuilder, MultiOutputResult,
265//     MultiOutputStrategy,
266// };
267#[cfg(feature = "multi-task-elastic-net")]
268pub use multi_task_elastic_net::{MultiTaskElasticNet, MultiTaskElasticNetConfig};
269#[cfg(feature = "multi-task-elastic-net")]
270pub use multi_task_elastic_net_cv::{MultiTaskElasticNetCV, MultiTaskElasticNetCVConfig};
271#[cfg(feature = "multi-task")]
272pub use multi_task_feature_selection::{
273    FeatureSelectionResult, FeatureSelectionStrategy, MultiTaskFeatureSelectionConfig,
274    MultiTaskFeatureSelector, SelectionSummary,
275};
276#[cfg(feature = "multi-task-lasso")]
277pub use multi_task_lasso::{MultiTaskLasso, MultiTaskLassoConfig};
278#[cfg(feature = "multi-task-lasso")]
279pub use multi_task_lasso_cv::{MultiTaskLassoCV, MultiTaskLassoCVConfig};
280#[cfg(feature = "multi-task")]
281pub use multi_task_shared_representation::{
282    MultiTaskSharedRepresentation, SharedRepresentationBuilder, SharedRepresentationConfig,
283    SharedRepresentationStrategy,
284};
285#[cfg(feature = "lasso")]
286pub use omp::{OrthogonalMatchingPursuit, OrthogonalMatchingPursuitConfig};
287#[cfg(feature = "online-learning")]
288pub use online_learning::{
289    LearningRateSchedule, MiniBatchConfig, MiniBatchIterator, OnlineCoordinateDescent,
290    OnlineLearningConfig, OnlineLinearRegression, OnlineLogisticRegression, SGDVariant,
291};
292pub use optimizer::{
293    FistaOptimizer, LbfgsOptimizer, NesterovAcceleratedGradient, ProximalGradientOptimizer,
294    SagOptimizer, SagaOptimizer,
295};
296#[cfg(feature = "sgd")]
297pub use passive_aggressive::{
298    PassiveAggressiveClassifier, PassiveAggressiveClassifierConfig, PassiveAggressiveLoss,
299    PassiveAggressiveRegressor, PassiveAggressiveRegressorConfig,
300};
301#[cfg(feature = "sgd")]
302pub use perceptron::{Perceptron, PerceptronConfig, PerceptronPenalty};
303#[cfg(feature = "feature-selection")]
304pub use polynomial_features::{
305    FeatureInfo, PolynomialConfig, PolynomialFeatures, PolynomialFeaturesBuilder, PolynomialUtils,
306};
307#[cfg(feature = "quantile-regression")]
308// TODO: Migrate to scirs2-linalg (uses ndarray_linalg::Solve)
309// pub use quantile::{QuantileRegressor, QuantileRegressorConfig, QuantileSolver, SolverOptions};
310#[cfg(feature = "ransac")]
311pub use ransac::{RANSACLoss, RANSACRegressor, RANSACRegressorConfig};
312#[cfg(feature = "feature-selection")]
313pub use recursive_feature_elimination::{
314    RFEConfig, RFEEstimator, RFEFeatureInfo, RFEResult, RecursiveFeatureElimination, ScoringMetric,
315};
316#[cfg(feature = "residual-analysis")]
317pub use residual_analysis::{
318    AssumptionResult, AssumptionTests, InfluenceMeasures, OutlierAnalysis, ResidualAnalysisConfig,
319    ResidualAnalysisResult, ResidualAnalyzer, ResidualStats, StatisticalTests, TestResult,
320};
321#[cfg(feature = "ridge")]
322pub use ridge_classifier::{RidgeClassifier, RidgeClassifierConfig};
323#[cfg(feature = "ridge")]
324pub use ridge_cv::{RidgeCV, RidgeCVConfig};
325#[cfg(feature = "serde")]
326// TODO: Migrate to scirs2-linalg (uses nalgebra types)
327// pub use serialization::{
328//     ModelMetadata, ModelRegistry, ModelSerializer, ModelVersioning, PerformanceMetrics,
329//     SerializableConstrainedOptimization, SerializableLassoRegression, SerializableLinearRegression,
330//     SerializableMatrix, SerializableModel, SerializableMultiOutputRegression,
331//     SerializableRidgeRegression, SerializableVector, SerializationFormat, TrainingInfo,
332// };
333#[cfg(feature = "sgd")]
334pub use sgd::{
335    SGDClassifier, SGDClassifierConfig, SGDLoss, SGDPenalty, SGDRegressor, SGDRegressorConfig,
336};
337// #[cfg(feature = "simd")]
338// TODO: Migrate to scirs2-linalg (uses nalgebra types)
339// pub use simd_optimizations::{
340//     SimdConfig, SimdCoordinateDescent, SimdFeatures, SimdLinearRegression, SimdOps,
341// };
342#[cfg(feature = "theil-sen")]
343pub use theil_sen::{TheilSenRegressor, TheilSenRegressorConfig};
344// Exports for new modular framework
345pub use modular_framework::{
346    create_modular_linear_regression, BayesianPredictionProvider, CompositeObjective,
347    LinearPredictionProvider, ModularConfig, ModularFramework, ModularLinearModel, Objective,
348    ObjectiveData, ObjectiveMetadata, OptimizationResult, OptimizationSolver, PredictionProvider,
349    PredictionWithConfidence, PredictionWithUncertainty, ProbabilisticPredictionProvider,
350    SolverInfo, SolverRecommendations,
351};
352pub use solver::Solver;
353#[cfg(feature = "feature-selection")]
354pub use stability_selection::{
355    BaseSelector, BootstrapResult, StabilityPath, StabilitySelection, StabilitySelectionConfig,
356    StabilitySelectionResult,
357};
358#[cfg(feature = "streaming")]
359pub use streaming_algorithms::{
360    DataStreamIterator, StreamingConfig, StreamingLasso, StreamingLinearRegression,
361    StreamingLinearRegressionBuilder, StreamingUtils,
362};
363
364pub use loss_functions::{
365    AbsoluteLoss, EpsilonInsensitiveLoss, HingeLoss, HuberLoss, LogisticLoss, LossFactory,
366    QuantileLoss, SquaredHingeLoss, SquaredLoss,
367};
368
369pub use regularization_schemes::{
370    CompositeRegularization, ElasticNetRegularization, GroupLassoRegularization, L1Regularization,
371    L2Regularization, RegularizationFactory,
372};
373
374pub use modular_framework::Regularization;
375
376pub use solver_implementations::{
377    BacktrackingConfig, CoordinateDescentConfig, CoordinateDescentResult, GradientDescentConfig,
378    GradientDescentResult, GradientDescentSolver, LineSearchConfig, ProximalGradientConfig,
379    ProximalGradientResult, ProximalGradientSolver, SolverFactory,
380};
381
382pub use type_safety::{
383    problem_type, solver_capability, ComputationalComplexity, ConfigurationHints,
384    ConfigurationValidator, FeatureValidator, FixedSizeOps, L1Scheme, L2Scheme,
385    LargeLinearRegression, MediumLinearRegression, MemoryRequirements, RegularizationConstraint,
386    RegularizationScheme, SmallLinearRegression, SolverConstraint, Trained, TypeSafeConfig,
387    TypeSafeFit, TypeSafeLinearModel, TypeSafeModelBuilder, TypeSafePredict,
388    TypeSafeSolverSelector, Untrained,
389};
390
391pub use large_scale_variational_inference::{
392    ARDConfiguration, LargeScaleVariationalConfig, LargeScaleVariationalRegression,
393    LearningRateDecay, PriorConfiguration, VariationalPosterior,
394};
395
396pub use uncertainty_quantification::{
397    CalibrationMetrics, UncertaintyCapable, UncertaintyConfig, UncertaintyMethod,
398    UncertaintyQuantifier, UncertaintyResult,
399};
400
401// Re-export path functions
402#[cfg(feature = "regularization-path")]
403pub use paths::{
404    enet_path, enet_path_enhanced, lars_path, lars_path_gram, lasso_path, ElasticNetPathConfig,
405    ElasticNetPathResult,
406};
407
408// Re-export utility functions
409pub use crate::utils::{
410    accurate_condition_number, adaptive_least_squares, condition_number,
411    diagnose_numerical_stability, enhanced_ridge_regression, orthogonal_mp, orthogonal_mp_gram,
412    qr_ridge_regression, rank_revealing_qr, ridge_regression, solve_with_iterative_refinement,
413    stable_normal_equations, stable_ridge_regression, svd_ridge_regression, NumericalDiagnostics,
414};
415
416// Re-export sparse matrix functionality
417#[cfg(feature = "sparse")]
418pub use sparse::{
419    Either, SparseConfig, SparseCoordinateDescentSolver, SparseMatrix, SparseMatrixCSR,
420    SparsityAnalysis,
421};
422
423#[cfg(feature = "sparse")]
424pub use sparse_linear_regression::{SparseLinearRegression, SparseLinearRegressionConfig};
425
426#[cfg(feature = "sparse")]
427pub use sparse_regularized::{
428    SparseElasticNet, SparseElasticNetConfig, SparseLasso, SparseLassoConfig,
429};
430
431// Disabled error functions are defined inline when sparse feature is not enabled
432#[cfg(not(feature = "sparse"))]
433pub fn sparse_feature_disabled_error() -> sklears_core::error::SklearsError {
434    sklears_core::error::SklearsError::InvalidParameter {
435        name: "sparse".to_string(),
436        reason: "Sparse matrix support requires the 'sparse' feature".to_string(),
437    }
438}
439
440#[cfg(not(feature = "sparse"))]
441pub fn sparse_linear_regression_disabled_error() -> sklears_core::error::SklearsError {
442    sklears_core::error::SklearsError::InvalidParameter {
443        name: "sparse-linear-regression".to_string(),
444        reason: "Sparse linear regression requires the 'sparse' feature".to_string(),
445    }
446}
447
448#[cfg(not(feature = "sparse"))]
449pub fn sparse_regularized_disabled_error() -> sklears_core::error::SklearsError {
450    sklears_core::error::SklearsError::InvalidParameter {
451        name: "sparse-regularized".to_string(),
452        reason: "Sparse regularized models require the 'sparse' feature".to_string(),
453    }
454}
455
456/// Penalty types for regularized models
457#[derive(Debug, Clone, Copy, PartialEq, Default)]
458pub enum Penalty {
459    /// No regularization
460    #[default]
461    None,
462    /// L1 regularization (Lasso)
463    L1(f64),
464    /// L2 regularization (Ridge)
465    L2(f64),
466    /// Elastic Net (L1 + L2)
467    ElasticNet { l1_ratio: f64, alpha: f64 },
468}