qec-code 0.3.0

Rust primitives for constructing and analyzing quantum error-correcting codes
Documentation
# qec-code

`qec-code` provides Rust data structures and algorithms for constructing and
analyzing quantum error-correcting codes. Its dependency-facing APIs include:

- CSS matrix validation and construction;
- exact distance through optional HiGHS or Gurobi ILP backends;
- randomized CSS distance upper bounds; and
- packed GF(2) row operations, reduced row spaces, and reusable kernel
  workspaces under `qec_code::packed_gf2`.

## Installation

Add the library from crates.io:

```toml
[dependencies]
qec-code = "0.3.0"
```

Enable the open-source exact ILP backend only when it is needed:

```toml
qec-code = { version = "0.3.0", features = ["distance-ilp-highs"] }
```

The default build is a library-only build with no command-line parser or native
solver dependency. Available opt-in features are:

- `cli` exposes `qec_code::cli` and builds the `qec-code` binary;
- `distance-ilp-highs` enables exact distance with HiGHS; and
- `distance-ilp-gurobi` enables exact distance with Gurobi without also pulling
  in HiGHS.

Applications that previously invoked the package binary or imported
`qec_code::cli` must add `features = ["cli"]`. Features compose, so a CLI using
HiGHS can enable both `cli` and `distance-ilp-highs`.

This crate is covered by the repository-wide
[Apache-2.0 license](LICENSE), which is also declared in the workspace
package metadata. Enable the distance features above only when needed.

## Deterministic regular matrices

`qec_code::regular_classical` provides the versioned pure-Rust generator for
regular binary parity-check matrices used by random code families. The exact
version-1 stream, bounded-index rule, retry behavior, and seed-7 fixture are
documented in [`doc/regular_classical.md`](doc/regular_classical.md).

## Packed GF(2) example

```rust
use qec_code::packed_gf2::{PackedRow, ReducedRowSpace};

let generators = vec![vec![1, 1, 0], vec![0, 1, 1]];
let space = ReducedRowSpace::from_dense_rows(&generators, 3)?;
let target = PackedRow::from_dense(&[1, 0, 1])?;
assert!(space.contains(&target)?);
# Ok::<(), qec_code::QecError>(())
```

The public wrappers intentionally hide the packed storage layout so internal
elimination code can evolve without breaking downstream crates.