qec-code 0.3.0

Rust primitives for constructing and analyzing quantum error-correcting codes
Documentation
use qec_code::codes::quantum_tanner::{
    quantum_tanner_css_checks, quantum_tanner_spec_from_json_str,
};
use qec_code::css::{CssCode, SparseRowsMatrix};
use qec_code::distance::compute_distance;
use qec_code::family_contract::{
    construct_css, parse_css_construction_json, verify_css_orthogonality, CssFamilySpec,
    RequestedFamilyId,
};
use qec_code::QecError;

fn canonical(mut rows: Vec<Vec<usize>>) -> Vec<Vec<usize>> {
    for row in &mut rows {
        row.sort_unstable();
    }
    rows
}

fn assert_canonical_sparse_rows(rows: &[Vec<usize>]) {
    for row in rows {
        assert!(row.windows(2).all(|window| window[0] < window[1]));
    }
}

fn quantum_tanner_request(spec_json: &str) -> String {
    format!(r#"{{"schema_version":1,"construction":"quantum_tanner","spec":{spec_json}}}"#)
}

#[test]
fn quantum_tanner_toric_d4_matches_legacy_constructor() {
    let fixture = include_str!("fixtures/quantum_tanner/toric_d4.json");
    let spec = quantum_tanner_spec_from_json_str(fixture).unwrap();
    let legacy = quantum_tanner_css_checks(&spec).unwrap();

    let common = construct_css(CssFamilySpec::QuantumTanner(spec).into()).unwrap();

    assert_eq!(common.construction_id, "quantum_tanner");
    assert_eq!(
        common.requested_family_id,
        Some(RequestedFamilyId::QuantumTanner)
    );
    assert_eq!(common.checks.h_x, canonical(legacy.hx));
    assert_eq!(common.checks.h_z, canonical(legacy.hz));
    assert_eq!(common.stats.n, 16);
    assert_eq!(common.stats.k, 2);
    assert!(common
        .checks
        .h_x
        .iter()
        .chain(common.checks.h_z.iter())
        .all(|row| row.len() == 4));
    assert_canonical_sparse_rows(&common.checks.h_x);
    assert_canonical_sparse_rows(&common.checks.h_z);
    verify_css_orthogonality(common.stats.n, &common.checks.h_x, &common.checks.h_z).unwrap();

    let hx = SparseRowsMatrix::new(common.stats.n, common.checks.h_x.clone())
        .unwrap()
        .to_dense_rows();
    let hz = SparseRowsMatrix::new(common.stats.n, common.checks.h_z.clone())
        .unwrap()
        .to_dense_rows();
    let css = CssCode::from_hx_hz(hx, hz).unwrap();
    let distance = compute_distance(css.code()).unwrap();
    assert_eq!(distance.distance, 4);
    assert_eq!(distance.witness.weight(), 4);

    assert_eq!(common.provenance.adapter, "quantum_tanner");
    assert_eq!(common.provenance.source, "CssFamilySpec::QuantumTanner");
    assert!(common
        .provenance
        .normalized_input_digest
        .starts_with("sha256:"));
    assert_eq!(
        common.provenance.normalized_input_digest.len(),
        "sha256:".len() + 64
    );

    let json_common =
        construct_css(parse_css_construction_json(&quantum_tanner_request(fixture)).unwrap())
            .unwrap();
    assert_eq!(
        json_common.provenance.normalized_input_digest,
        common.provenance.normalized_input_digest
    );
    assert_eq!(json_common.checks, common.checks);
}

#[test]
fn quantum_tanner_contract_preserves_typed_errors() {
    let non_symmetric = include_str!("fixtures/quantum_tanner/invalid_non_symmetric_a.json");
    let non_symmetric_spec = parse_css_construction_json(&quantum_tanner_request(non_symmetric))
        .expect("non-symmetric generator set parses before construction validation");
    assert!(matches!(
        construct_css(non_symmetric_spec),
        Err(QecError::InvalidQuantumTannerGeneratorSet { set: "A", .. })
    ));

    let bad_table = include_str!("fixtures/quantum_tanner/invalid_bad_table.json");
    assert!(matches!(
        parse_css_construction_json(&quantum_tanner_request(bad_table)),
        Err(QecError::InvalidQuantumTannerGroupTable { .. })
    ));
}