baselines 0.1.0

Baseline correction algorithms for signals, spectra, and images
Documentation
# Rust API

The recommended API is method-chain based. It is a thin ergonomic layer over
the family modules, so defaults, validation, references, and numerical behavior
are the same as the underlying functions.

## 1D signals

```rust
use baselines::prelude::*;

let fit = Baseline::new(&y)
    .asls()
    .lambda(1.0e6)
    .p(0.01)
    .max_iter(50)
    .tol(1.0e-3)
    .fit()?;

let corrected = fit.corrected(&y)?;
# Ok::<(), baselines::BaselineError>(())
```

## 2D row-major data

```rust
use baselines::prelude::*;

let fit = Baseline2D::row_major(&data, rows, cols)?
    .asls()
    .lambda(8.0e3)
    .p(0.01)
    .cg_tol(1.0e-6)
    .fit()?;

let corrected = fit.corrected(&data)?;
# Ok::<(), baselines::BaselineError>(())
```

## Full parameter structs

Use `with_params` when params are easier to construct directly.

```rust
use baselines::prelude::*;
use baselines::whittaker::{AslsParams, WhittakerParams};

let params = AslsParams {
    whittaker: WhittakerParams {
        lambda: 1.0e6,
        max_iter: 50,
        tol: 1.0e-3,
    },
    p: 0.01,
};

let fit = Baseline::new(&y).asls().with_params(params).fit()?;
# Ok::<(), baselines::BaselineError>(())
```

## Low-level API

The family modules remain public and are still useful for advanced workflows,
including reusable workspaces and exact parameter struct calls.

```rust
use baselines::whittaker::{AslsParams, WhittakerWorkspace, asls_into};

let mut baseline = vec![0.0; y.len()];
let mut workspace = WhittakerWorkspace::new(y.len());
let report = asls_into(
    &y,
    AslsParams::default(),
    &mut baseline,
    &mut workspace,
)?;
# Ok::<(), baselines::BaselineError>(())
```

Algorithm references are documented on the underlying family functions. The
builder docs intentionally point back to those functions instead of duplicating
citations.