This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
SciRS2 is a comprehensive scientific computing and AI/ML infrastructure in Rust, providing SciPy-compatible APIs while leveraging Rust's performance, safety, and concurrency features.
Note: From v0.1.0-beta.2, the ML optimization module (scirs2-optim) has been separated into the independent OptiRS project for better modularity and focused development.
Important: From v0.1.0-beta.4, the SciRS2 POLICY is in effect. All non-core crates must use scirs2-core abstractions instead of direct external dependencies.
cargo build # Build all workspace members
cargo build --release # Release build with optimizationscargo test
cargo test -p scirs2-{module} # Test specific module- Format code:
cargo fmt - Lint:
cargo clippy(MUST have zero warnings) - Build:
cargo build - Test:
cargo test | tail - Fix any issues and return to step 1
- Only proceed when ALL steps pass cleanly
- Commit & Push only when everything passes
Read your memory
When implementing SciPy-compatible functionality, directly read these source files for reference.
- MANDATORY: Fix ALL build errors AND warnings
- Applies to: samples, unit tests, DOC tests
- Use
#[allow(clippy::too_many_arguments)]for unavoidable "too many arguments" - Use
#[allow(dead_code)]for "function is never used" warnings - Run
cargo clippybefore every commit
CRITICAL: Follow the SciRS2 POLICY for all development (Updated v0.1.0-RC.1):
- Core Rule: Only
scirs2-coremay use external dependencies directly - All other crates (including tests, examples, benchmarks) MUST use SciRS2-Core abstractions
- Prohibited: Direct
rand::,rand_distr::,ndarray::,num_complex::imports in non-core code - Required: Use
scirs2_core::random::*,scirs2_core::ndarray::*,scirs2_core::numeric::*, etc.
✅ POLICY Compliance Complete (Established v0.1.0-RC.1, Current: v0.1.0-rc.2):
- All 23 crates are POLICY-compliant (100%)
scirs2_core::random- ALL rand_distr distributions (Beta, Cauchy, StudentT, etc.)scirs2_core::ndarray- Complete ndarray including macros (array!,s!,azip!)scirs2_core::numeric- All num-traits, num-complex functionality- Benefits: Consistent APIs, centralized version control, type safety, maintainability
✅ Correct Cargo.toml:
[dependencies]
# SCIRS2 POLICY: scirs2-core is the ONLY crate allowed external dependencies
scirs2-core = { workspace = true, features = ["array", "random"] }
thiserror = { workspace = true } # Only if needed for errors✅ Correct Imports:
// Arrays and numerical operations
use scirs2_core::ndarray::{array, Array1, Array2, s};
use scirs2_core::numeric::{Float, Zero, NumCast, Complex64};
// Random number generation
use scirs2_core::random::{thread_rng, Distribution, Normal, RandBeta};❌ Prohibited Imports (will cause POLICY violations):
// FORBIDDEN - Do NOT use these in non-core crates
use ndarray::*; // ❌ Use scirs2_core::ndarray instead
use num_traits::*; // ❌ Use scirs2_core::numeric instead
use rand::*; // ❌ Use scirs2_core::random instead
use rand_distr::Beta; // ❌ Use scirs2_core::random::RandBeta insteadCommon Patterns:
// Pattern 1: Array creation and operations
use scirs2_core::ndarray::{array, Array2};
let a = array![[1.0, 2.0], [3.0, 4.0]];
let b = Array2::zeros((2, 2));
// Pattern 2: Random sampling
use scirs2_core::random::{thread_rng, Normal};
let mut rng = thread_rng();
let normal = Normal::new(0.0, 1.0).unwrap();
let sample = normal.sample(&mut rng);
// Pattern 3: Generic numeric functions
use scirs2_core::numeric::{Float, NumCast};
fn compute<T: Float>(x: T) -> T {
x * <T as NumCast>::from(2.0).unwrap()
}Quick Reference: See /tmp/scirs2_policy_quick_reference.md for comprehensive examples.
- ALWAYS use
cargo nextest runinstead ofcargo test - Test all code paths including edge cases
- Numerical comparison tests against SciPy reference
- Performance benchmarks for critical operations
- DOC tests for all public APIs
Known Issue: The auto-feature-engineering feature in scirs2-transform requires PyTorch 2.0.0 but may conflict with newer PyTorch versions (2.5+).
Current Workaround:
# Run tests excluding auto-feature-engineering
cargo nextest run --nff --features simd,gpu,distributed,monitoring
# To use auto-feature-engineering feature:
# 1. Install PyTorch 2.0.0, OR
# 2. Set environment variables:
# LIBTORCH_USE_PYTORCH=1 LIBTORCH_BYPASS_VERSION_CHECK=1Status: Main functionality works without the auto-feature-engineering feature. Full PyTorch integration requires compatible PyTorch version or environment variable workarounds.
- rand 0.9.x: Update API calls (gen_range → random_range, thread_rng → rng)
- Maintain SciPy API compatibility where reasonable
- Document any deviations from SciPy's API
scirs2/ # Main integration crate (re-exports all modules)
├── scirs2-core/ # Core utilities (MUST be used by all modules)
├── scirs2-linalg/ # Linear algebra
├── scirs2-stats/ # Statistics and distributions
├── scirs2-optimize/ # Optimization algorithms
├── scirs2-integrate/ # Integration and ODEs
├── scirs2-interpolate/ # Interpolation
├── scirs2-fft/ # Fast Fourier Transform
├── scirs2-special/ # Special functions
├── scirs2-signal/ # Signal processing
├── scirs2-sparse/ # Sparse matrices
├── scirs2-spatial/ # Spatial algorithms
├── scirs2-cluster/ # Clustering
├── scirs2-ndimage/ # N-dimensional images
├── scirs2-io/ # Input/output
├── scirs2-datasets/ # Sample datasets
├── scirs2-autograd/ # Automatic differentiation
├── scirs2-neural/ # Neural networks
# Note: scirs2-optim moved to independent OptiRS project from beta.2
├── scirs2-graph/ # Graph processing
├── scirs2-transform/ # Data transformation
├── scirs2-metrics/ # ML metrics
├── scirs2-text/ # Text processing
├── scirs2-vision/ # Computer vision
└── scirs2-series/ # Time series
- scirs2-core: No dependencies on other project crates
- scirs2: Depends on all crates via feature flags
- Use workspace inheritance:
dependency = { workspace = true }
Please READ ./SCIRS2_POLICY.md -- # SciRS2 Ecosystem Policy
Always use scirs2-core modules instead of implementing your own:
scirs2-core::validation- Parameter validation (check_positive, check_shape, check_finite)scirs2-core::error- Base error typesscirs2-core::numeric- Generic numerical operationsscirs2-core::cache- Caching mechanismsscirs2-core::constants- Mathematical/physical constantsscirs2-core::utils- Common utilities
- MANDATORY: Use
scirs2-core::simd_ops::SimdUnifiedOpstrait - FORBIDDEN: Direct use of
wide,packed_simd, or platform intrinsics - FORBIDDEN: Custom SIMD implementations in modules
// GOOD
use scirs2_core::simd_ops::SimdUnifiedOps;
let result = f32::simd_add(&a.view(), &b.view());
// BAD - NEVER do this
// let result = custom_simd_add(a, b);- MANDATORY: Use
scirs2-core::parallel_opsfor all parallelism - FORBIDDEN: Direct dependency on
rayonin modules - REQUIRED: Import via
use scirs2_core::parallel_ops::*
// GOOD
use scirs2_core::parallel_ops::*;
// BAD - NEVER do this
// use rayon::prelude::*;- MANDATORY: Use
scirs2-core::gpumodule - FORBIDDEN: Direct CUDA/OpenCL/Metal API calls
- FORBIDDEN: Custom kernel implementations
- MANDATORY: Use
scirs2-core::simd_ops::PlatformCapabilities::detect() - FORBIDDEN: Custom CPU feature detection
- Use core-provided optimizations first
- Provide scalar fallbacks for SIMD/parallel code
- Benchmark against SciPy for comparison
- Profile before optimizing
- Use chunked operations for large data
- Leverage ndarray's zero-copy views
- Minimize allocations in hot paths
- Use
ArrayViewMutinstead of cloning
- Keep files under 500 lines when possible
- Organize by functionality, not by type
- Use subdirectories for related functionality
- Separate public API from implementation
- Variables: Use
snake_casefor all variables and function parameters - Functions: Use
snake_casefor all functions and methods - Structs/Enums: Use
PascalCasefor types - Constants: Use
SCREAMING_SNAKE_CASEfor constants - Modules: Use
snake_casefor module names - File conventions:
mod.rs: Public interface and re-exportsimplementation.rs: Core implementationutils.rs: Module-specific utilities
- Follow Rust naming conventions strictly
- Document all public APIs
- Include usage examples in doc comments
- Add references to papers/algorithms
- Document performance characteristics
- Note thread-safety guarantees
use scirs2_core::error::Result;
pub fn my_function() -> Result<T> {
// Implementation
}use scirs2_core::validation::{check_positive, check_shape};
pub fn process(data: &Array2<f64>, k: usize) -> Result<()> {
check_positive(k, "k")?;
check_shape(data, (None, Some(3)), "data")?;
// Implementation
}[dependencies]
scirs2-core = { workspace = true, features = ["simd", "parallel", "gpu"] }
[features]
default = ["parallel"]
simd = ["scirs2-core/simd"]
parallel = ["scirs2-core/parallel"]
gpu = ["scirs2-core/gpu"]The project uses GitHub Actions with:
- Rust stable toolchain
- cargo-nextest for testing
- System dependencies: OpenBLAS, LAPACK, etc.
- Zero warnings enforcement
- Comprehensive test coverage
- Current version: 0.1.0-rc.2 (Release Candidate 2)
- Release date: October 19, 2025
- Repository: https://github.com/cool-japan/scirs
- Main branch: master
- ML Optimization: Independent OptiRS project
- SciRS2 POLICY: ✅ COMPLETE - All 23 crates compliant (v0.1.0-rc.2)