# SymClaw Expansion Plan ## Quantum Computing · Genomic Biology · Quantum Chemistry · Materials Science **Rust edition:** `2024` (rust-version `1.94.0`) **Methodology:** Strict TDD — tests written first, no `todo!()`, no `unimplemented!()`, no mock/stub types, every function fully implemented before it is committed. **File limit:** 1 250 lines per `.rs` source file. Files that grow beyond this are split at the nearest logical boundary into a `mod/` directory. **Date drafted:** 2026-03-19 --- ## 0. Immediate Housekeeping (before any new work) ### 0.1 Bump workspace Rust version In `Cargo.toml` (workspace root): ```toml [workspace.package] edition = "2024" rust-version = "1.94.0" # was 1.93.0 ``` Verify: `rustup install 1.94.0 && cargo +1.94.0 check` ### 0.2 Split files already over 1 250 lines These files violate the 1 250-line rule and must be split **before** any new modules are added: | File | Lines | Split plan | |------|-------|------------| | `crates/symclaw-core/src/integrate_advanced/mod.rs` | 1 844 | Split into `rational.rs`, `risch.rs`, `special.rs`, `mod.rs` (re-exports only) | | `crates/symclaw-core/src/step_by_step.rs` | 1 267 | Split into `step_by_step/render.rs`, `step_by_step/trace.rs`, `step_by_step/mod.rs` | Each split must preserve all existing tests, which move with the code they test. ### 0.3 Fix all existing `unused_*` warnings Run `cargo fix --lib -p symclaw-core` and then manually resolve the remaining warnings in `factor.rs`, `galois.rs`, `modular_gcd`, `packed_poly.rs`, and `streaming.rs`. All warnings become errors in CI by adding to `Cargo.toml`: ```toml [workspace.lints.rust] unused = "deny" ``` --- ## 1. Architecture Overview ``` symclaw/ ├── crates/ │ ├── symclaw-core/ existing — extended heavily │ ├── symclaw-quantum/ NEW — ZX-calculus, Clifford, Pauli, circuits │ ├── symclaw-bio/ NEW — structural identifiability, reaction networks │ ├── symclaw-qchem/ NEW — second quantization, molecular integrals │ ├── symclaw-materials/ NEW — crystallography, space groups, band theory │ ├── symclaw-gpu/ existing — add tensor-network + Clifford GPU modules │ ├── symclaw-cli/ existing — add new REPL commands for each domain │ ├── symclaw-python/ existing — add PyO3 bindings for new crates │ ├── symclaw-wasm/ existing — add WASM exports for quantum + bio │ ├── symclaw-skill/ existing — add skill actions for new domains │ └── symclaw-collab/ existing — unchanged └── PLAN.md ``` All new crates are **workspace members** and share `[workspace.dependencies]`. --- ## 2. Core Extensions (`symclaw-core`) These extend the existing engine rather than being separate crates. They must be done first because later crates depend on them. ### 2.1 Clifford / Geometric Algebra (`clifford.rs` → split at 1 250) **Purpose:** `Cl(p,q)` multivector algebra — generalises complex numbers, quaternions, spinors, and spacetime algebra. Required by both `symclaw-quantum` (Clifford gate algebra) and `symclaw-qchem` (Dirac equation). **Module layout:** ``` clifford/ ├── mod.rs re-exports, top-level docs ≤ 100 lines ├── basis.rs BasisBlade, grade, dimension, metric signature ≤ 400 lines ├── multivector.rs Multivector type, add/sub/mul/neg ≤ 600 lines ├── products.rs geometric, inner, outer, left/right contraction ≤ 500 lines ├── involute.rs reverse, grade-involution, conjugate ≤ 250 lines └── symbolic.rs Multivector over Expr (symbolic coefficients)≤ 400 lines ``` **TDD test requirements (all must pass before any commit):** ```rust // clifford/basis.rs #[test] fn grade_of_scalar_is_zero() #[test] fn grade_of_vector_is_one() #[test] fn basis_blade_count_for_dim_n() // 2^n blades #[test] fn metric_signature_euclidean() #[test] fn metric_signature_minkowski() // clifford/multivector.rs #[test] fn add_multivectors() #[test] fn mul_two_vectors_gives_scalar_plus_bivector() #[test] fn complex_numbers_as_cl_0_1() // i² = -1 #[test] fn quaternions_as_cl_0_2() // i²=j²=k²=ijk=-1 #[test] fn pauli_algebra_as_cl_3_0() // clifford/products.rs #[test] fn outer_product_grade_adds() #[test] fn inner_product_grade_subtracts() #[test] fn geometric_product_associative() #[test] fn reversion_involution() // clifford/symbolic.rs #[test] fn symbolic_multivector_diff_wrt_scalar() #[test] fn symbolic_multivector_latex_output() ``` ### 2.2 Exterior / Grassmann Algebra (`exterior.rs`) **Purpose:** Antisymmetric tensor algebra — fermionic operators in QChem, differential forms in geometry, determinant computation. ``` exterior/ ├── mod.rs ├── form.rs DifferentialForm, wedge product ≤ 500 lines └── algebra.rs ExteriorAlgebra, grade decomposition ≤ 500 lines ``` **TDD tests:** ```rust #[test] fn wedge_anticommutes() // α∧β = -β∧α #[test] fn wedge_with_self_is_zero() // α∧α = 0 #[test] fn wedge_associativity() #[test] fn n_form_on_n_dim_space_is_scalar_multiple() #[test] fn exterior_derivative_of_zero_form() #[test] fn d_squared_is_zero() // d(dω) = 0 ``` ### 2.3 Permutation Group (`permutation.rs`) **Purpose:** Symmetric group Sₙ — genome rearrangements, Young tableaux, representation theory (needed for crystallography). ``` permutation/ ├── mod.rs ├── perm.rs Permutation, cycle notation, order, sign ≤ 400 lines ├── group.rs SymmetricGroup, subgroups, cosets, conjugacy ≤ 500 lines └── young.rs YoungTableau, hook length formula, RSK ≤ 400 lines ``` **TDD tests:** ```rust #[test] fn identity_permutation() #[test] fn cycle_decomposition() #[test] fn permutation_order() #[test] fn permutation_sign() // even/odd #[test] fn composition_is_associative() #[test] fn inverse_undoes_permutation() #[test] fn young_tableau_hook_length() #[test] fn rsk_correspondence_bijection() ``` ### 2.4 Cyclotomic Fields (`cyclotomic.rs`) **Purpose:** Exact arithmetic in `ℚ(ζₙ)` — quantum gate angles (π/4, π/8 etc.), number fields for Kochen-Specker proofs, minimal polynomial computation. ``` cyclotomic/ ├── mod.rs ├── field.rs CyclotomicField, elements as Q-polynomials ≤ 600 lines └── minimal.rs minimal polynomial, conjugate, norm, trace ≤ 400 lines ``` **TDD tests:** ```rust #[test] fn cyclotomic_4_gives_gaussian_integers() #[test] fn cyclotomic_element_add() #[test] fn cyclotomic_element_mul() #[test] fn cyclotomic_element_norm() #[test] fn minimal_polynomial_degree() #[test] fn sqrt2_in_cyclotomic_8() #[test] fn euler_phi_degree() ``` ### 2.5 New `FuncId` variants and `Expr` variants Extend `crates/symclaw-core/src/ast/functions.rs`: ```rust // Quantum / Clifford FuncId::PauliX, FuncId::PauliY, FuncId::PauliZ, FuncId::Hadamard, FuncId::CNOT, FuncId::Dagger, // Hermitian conjugate † // Chemistry FuncId::Create, // a† fermionic creation FuncId::Annihilate, // a fermionic annihilation // Biology / special FuncId::HeavisideTheta, FuncId::DiracDelta, FuncId::Commutator, // [A,B] = AB - BA FuncId::AntiCommutator, // {A,B} = AB + BA ``` Extend `crates/symclaw-core/src/ast/expr.rs` — new variants: ```rust /// Bra-ket: ⟨φ| (bra), |ψ⟩ (ket), or ⟨φ|ψ⟩ (inner product) BraKet { kind: BraKetKind, // Bra | Ket | InnerProduct | OuterProduct label: Arc, // state label label2: Option>, // second label for inner/outer products }, /// Quantum operator acting on a state OperatorApply { op: Arc, state: Arc, }, ``` Every new `Expr` variant requires: - A `Display` arm in `ast/display.rs` - A `LaTeX` arm in `latex.rs` - A simplification arm in `simplify.rs` - A differentiation arm (or explicit "not differentiable" error) in `differentiate.rs` - A parse arm in `parser.rs` (or documented that parsing is via construction API) - A full unit test in its own `#[cfg(test)]` block ### 2.6 Code generation targets — extend `codegen.rs` Add new language targets: ```rust pub enum Language { // existing... OpenQASM3, // quantum circuit export Qiskit, // Python + Qiskit PennyLane, // Python + PennyLane Cirq, // Python + Cirq SBML, // Systems Biology Markup Language (XML) Julia, // already exists } ``` **TDD tests per target:** ```rust #[test] fn openqasm3_hadamard() #[test] fn openqasm3_cnot() #[test] fn qiskit_circuit_export() #[test] fn sbml_reaction_network_export() ``` --- ## 3. New Crate: `symclaw-quantum` ### Dependency on `symclaw-core` ```toml [dependencies] symclaw-core = { path = "../symclaw-core" } ``` ### Module map ``` symclaw-quantum/src/ ├── lib.rs ├── pauli/ │ ├── mod.rs │ ├── group.rs Pauli group P_n, multiplication table ≤ 600 lines │ ├── stabilizer.rs Stabilizer formalism, generator sets ≤ 700 lines │ └── tableau.rs Binary symplectic tableau, Gaussian elim ≤ 600 lines ├── clifford_gates/ │ ├── mod.rs │ ├── gates.rs Single-qubit Clifford gates as Cl(2,0) elements ≤ 500 lines │ └── compose.rs Gate composition, adjoint, conjugation ≤ 400 lines ├── zx/ │ ├── mod.rs │ ├── diagram.rs ZXDiagram: nodes (Z/X/H), edges (wires) ≤ 700 lines │ ├── rewrite.rs ZX rewrite rules (spider, bialgebra, etc.) ≤ 800 lines │ ├── simplify.rs Graph simplification via e-graph-style search ≤ 600 lines │ ├── extract.rs Circuit extraction from simplified ZX diagram ≤ 500 lines │ └── to_circuit.rs ZXDiagram → QuantumCircuit ≤ 400 lines ├── circuit/ │ ├── mod.rs │ ├── gate.rs Gate enum: H, X, Y, Z, CNOT, T, S, Rz(θ)… ≤ 500 lines │ ├── circuit.rs QuantumCircuit: DAG of gates + qubits ≤ 700 lines │ ├── optimize.rs Gate cancellation, commutation, T-count red. ≤ 800 lines │ └── simulate.rs State-vector simulation (up to ~20 qubits) ≤ 700 lines └── codegen/ ├── mod.rs ├── openqasm3.rs QuantumCircuit → OpenQASM 3 ≤ 400 lines ├── qiskit.rs QuantumCircuit → Qiskit Python ≤ 400 lines ├── pennylane.rs QuantumCircuit → PennyLane Python ≤ 300 lines └── cirq.rs QuantumCircuit → Cirq Python ≤ 300 lines ``` ### ZX-Calculus Design The ZX-calculus is a complete graphical calculus for quantum computing. SymClaw's e-graph is the ideal engine for it because ZX simplification is graph rewriting to a normal form — exactly what equality saturation does. **Key types:** ```rust /// A node in a ZX diagram. pub enum ZXNode { Z { phase: Arc }, // Z-spider (green), phase in [0, 2π) X { phase: Arc }, // X-spider (red), phase in [0, 2π) H, // Hadamard box Input(usize), // boundary input wire n Output(usize), // boundary output wire n } /// A ZX diagram: hypergraph of nodes connected by wires. pub struct ZXDiagram { nodes: Vec, wires: Vec<(NodeId, NodeId)>, // undirected edges inputs: Vec, outputs: Vec, } ``` **Rewrite rules (all 11 core rules plus derived):** | Rule | Description | |------|-------------| | Spider fusion | Two same-colour spiders → one (phases add) | | Identity | Zero-phase spider with ≤ 2 legs → wire | | π-copy | X-spider copies Z-spider through Hadamard | | Bialgebra | Green-red bialgebra law | | Hopf | Hadamard self-inverse | | Euler decomposition | Z-X-Z = Euler angle | | Phase teleportation | Move phases through wires | | Supplementarity | Phase π/2 spiders | | Local complementation | Graph state rewrite | | Pivot | Graph state pivot | | GS rule | Gflow preservation | Each rule implemented as a `fn(ZXDiagram) -> Option` with a matching unit test showing before and after. ### TDD test plan for `symclaw-quantum` **pauli/** ```rust #[test] fn pauli_multiplication_table() #[test] fn pauli_group_order_is_16() // ±{I,X,Y,Z} #[test] fn pauli_commutator() #[test] fn stabilizer_from_generators() #[test] fn stabilizer_measurement() #[test] fn tableau_gaussian_elimination() ``` **zx/** ```rust #[test] fn spider_fusion_z() #[test] fn spider_fusion_x() #[test] fn identity_removal() #[test] fn hadamard_self_inverse() #[test] fn pi_copy_rule() #[test] fn bialgebra_rule() #[test] fn euler_decomposition() #[test] fn cnot_zx_representation() #[test] fn hadamard_zx_representation() #[test] fn t_gate_zx_representation() #[test] fn circuit_roundtrip() // circuit → ZX → simplify → extract → circuit #[test] fn t_count_reduction_example() // concrete circuit from literature ``` **circuit/** ```rust #[test] fn bell_state_circuit() #[test] fn quantum_fourier_transform_3q() #[test] fn grover_2q() #[test] fn circuit_depth() #[test] fn gate_cancellation_hh() // H·H = I #[test] fn gate_cancellation_cnot_cnot() #[test] fn simulate_bell_state_statevector() #[test] fn simulate_ghz_state() #[test] fn openqasm3_roundtrip() #[test] fn qiskit_output_compiles() // string contains valid Python keywords ``` --- ## 4. New Crate: `symclaw-bio` Builds on existing `symclaw-core` ODE, Gröbner, and polynomial modules. The central algorithm is **SIAN-style structural identifiability analysis**, which uses characteristic sets / Gröbner bases to determine whether ODE model parameters are identifiable from input-output observations. ### Module map ``` symclaw-bio/src/ ├── lib.rs ├── ode_model/ │ ├── mod.rs │ ├── model.rs OdeModel: states, inputs, outputs, params ≤ 600 lines │ ├── io_equations.rs Input-output equations via Lie derivatives ≤ 700 lines │ └── validate.rs Dimension checks, variable name validation ≤ 300 lines ├── identifiability/ │ ├── mod.rs │ ├── sian.rs SIAN algorithm (Gröbner basis approach) ≤ 900 lines │ ├── differential.rs Differential algebra toolkit ≤ 700 lines │ └── report.rs IdentifiabilityReport: globally/locally/not ≤ 300 lines ├── reactions/ │ ├── mod.rs │ ├── network.rs ReactionNetwork: species, reactions, rates ≤ 600 lines │ ├── kinetics.rs MassAction, MichaelisMenten, HillFunction ≤ 500 lines │ ├── stoichiometry.rs Stoichiometry matrix, nullspace, deficiency ≤ 500 lines │ └── sbml.rs SBML XML import/export ≤ 600 lines ├── population/ │ ├── mod.rs │ ├── genetics.rs Hardy-Weinberg, drift ODEs, selection eqs ≤ 500 lines │ └── phylo.rs Cavender-Farris-Neyman model, JC69, K80 ≤ 500 lines └── genome/ ├── mod.rs ├── rearrangement.rs Sorting by reversals/transpositions (symbolic)≤ 600 lines └── codon.rs Genetic code algebra, degeneracy classes ≤ 400 lines ``` ### SIAN Algorithm Detail The structural identifiability analysis for an ODE system: ``` ẋ = f(x, p, u) x: states, p: parameters, u: inputs y = g(x, p) y: observed outputs ``` is determined by: 1. Compute Lie derivatives `L_f^k g` for each output `y_i` up to order equal to the number of states plus parameters. 2. Form the **input-output equations** by eliminating state variables from the system using resultants / Gröbner bases. 3. Compute a Gröbner basis of the characteristic ideal with respect to a block `lex` ordering (parameter block > state block). 4. For each parameter `p_j`, check if the colon ideal `I : (∂/∂p_j)^∞` yields a unique solution → globally identifiable. 5. Collect results into `IdentifiabilityReport`. The existing `poly`, `modular_gcd`, and `groebner` modules provide the computational backend. The `ode` module provides Lie derivative computation. The **monomial ordering trick** from arXiv:2202.xxxxx: using `grevlex` within the parameter block and `lex` between blocks gives 3-10× speedup over pure `lex` on biological models. ### TDD test plan for `symclaw-bio` **ode_model/** ```rust #[test] fn simple_sir_model_construction() #[test] fn io_equations_for_linear_compartment() #[test] fn lie_derivative_first_order() #[test] fn lie_derivative_chain_rule() ``` **identifiability/** ```rust #[test] fn globally_identifiable_linear_ode() #[test] fn not_identifiable_symmetric_model() #[test] fn locally_identifiable_example() #[test] fn sir_parameter_identifiability() #[test] fn lotka_volterra_identifiability() #[test] fn grevlex_ordering_faster_than_lex() // property: same result, measured time ``` **reactions/** ```rust #[test] fn mass_action_kinetics() #[test] fn michaelis_menten_quasi_steady() #[test] fn stoichiometry_matrix_construction() #[test] fn network_deficiency_zero() #[test] fn sbml_roundtrip_simple_network() ``` **population/** ```rust #[test] fn hardy_weinberg_equilibrium() #[test] fn allele_frequency_drift_ode() #[test] fn jc69_substitution_matrix() ``` **genome/** ```rust #[test] fn sorting_by_reversals_pancake() #[test] fn transposition_distance_lower_bound() #[test] fn codon_degeneracy_classes() #[test] fn stop_codons_excluded() ``` --- ## 5. New Crate: `symclaw-qchem` Second quantization algebra + molecular integral symbolic framework. No chemistry library dependencies — all symbolic, with numeric evaluation delegated to `symclaw-core::eval` and `symclaw-gpu::eval`. ### Module map ``` symclaw-qchem/src/ ├── lib.rs ├── second_quant/ │ ├── mod.rs │ ├── operators.rs FermionOp, BosonOp, creation/annihilation ≤ 600 lines │ ├── algebra.rs Anticommutation relations, normal ordering ≤ 700 lines │ ├── wick.rs Wick's theorem: automated normal ordering ≤ 800 lines │ └── hamiltonian.rs One/two-body Hamiltonian symbolic form ≤ 600 lines ├── integrals/ │ ├── mod.rs │ ├── gaussian.rs Gaussian basis function symbolic forms ≤ 700 lines │ ├── overlap.rs Overlap integrals (analytical formulae) ≤ 500 lines │ ├── kinetic.rs Kinetic energy integrals ≤ 400 lines │ ├── nuclear.rs Nuclear attraction integrals (Boys function) ≤ 500 lines │ └── eri.rs Electron repulsion integrals (analytical) ≤ 700 lines ├── spin/ │ ├── mod.rs │ ├── spinor.rs Two-component spinors, Pauli matrices ≤ 400 lines │ └── coupling.rs Clebsch-Gordan coefficients, angular momentum ≤ 600 lines └── vqe/ ├── mod.rs ├── ansatz.rs UCC, UCCSD, HF reference state symbolic form ≤ 600 lines └── gradient.rs Symbolic parameter-shift gradients ≤ 500 lines ``` ### Second Quantization Design Fermionic operators `â†ᵢ`, `âᵢ` satisfy the anticommutation relations: ``` {âᵢ, â†ⱼ} = δᵢⱼ {âᵢ, âⱼ} = 0 {â†ᵢ, â†ⱼ} = 0 ``` In SymClaw these are symbolic terms in an `Expr` tree using `FuncId::Create` and `FuncId::Annihilate`. The `simplify` module is extended with a fermionic normal-ordering pass that uses the anticommutation relations as rewrite rules, implemented as pattern-matching over the `Expr` tree. **Wick's theorem** is implemented as a recursive algorithm that expresses a product of operators as a sum over all possible contractions. Each contraction is represented as an `Expr` tree node. The algorithm terminates because each step reduces the number of operators by 2 (one contraction at a time). **Molecular integrals:** Gaussian basis functions have the form: ``` φ(r; α, l, m, n, A) = N · (x-Ax)^l (y-Ay)^m (z-Az)^n · exp(-α|r-A|²) ``` All one-electron integrals (overlap, kinetic, nuclear attraction) have closed symbolic forms via the McMurchie-Davidson recurrence. SymClaw will implement these recursions symbolically, yielding exact closed-form expressions as `Expr` trees that can then be evaluated numerically via `symclaw-gpu::eval` for batch computation. ### TDD test plan for `symclaw-qchem` **second_quant/** ```rust #[test] fn anticommutation_relation_same_index() #[test] fn anticommutation_relation_diff_index() #[test] fn normal_order_single_product() #[test] fn normal_order_two_body() #[test] fn wick_theorem_one_body() #[test] fn wick_theorem_two_body_vacuum() #[test] fn one_body_hamiltonian_form() #[test] fn two_body_hamiltonian_hermitian() ``` **integrals/** ```rust #[test] fn gaussian_s_orbital_normalization() #[test] fn overlap_ss_same_center() // = 1 when normalized #[test] fn overlap_ss_far_apart_is_zero() // limiting behaviour #[test] fn kinetic_s_orbital() #[test] fn nuclear_attraction_s_orbital() #[test] fn eri_ssss() // (ss|ss) integral #[test] fn mcmurchie_davidson_recursion_base_case() ``` **spin/** ```rust #[test] fn pauli_matrices_from_spinors() #[test] fn clebsch_gordan_half_half() // 1/2 ⊗ 1/2 = 0 ⊕ 1 #[test] fn angular_momentum_algebra() // [Jx,Jy] = iJz ``` **vqe/** ```rust #[test] fn uccsd_ansatz_parameterised() #[test] fn parameter_shift_gradient_rule() #[test] fn hf_reference_state() ``` --- ## 6. New Crate: `symclaw-materials` Crystallographic group algebra and band structure symbolic tools. ### Module map ``` symclaw-materials/src/ ├── lib.rs ├── groups/ │ ├── mod.rs │ ├── point_group.rs 32 crystallographic point groups (Schoenflies)≤ 800 lines │ ├── space_group.rs 230 space groups, Wyckoff positions ≤ 900 lines │ └── character.rs Character tables, irreducible representations ≤ 700 lines ├── lattice/ │ ├── mod.rs │ ├── bravais.rs 14 Bravais lattices, reciprocal vectors ≤ 500 lines │ └── miller.rs Miller indices, plane spacing, diffraction ≤ 400 lines ├── structure/ │ ├── mod.rs │ ├── crystal.rs Crystal structure: unit cell + basis atoms ≤ 500 lines │ └── factor.rs Structure factor F(hkl), extinction rules ≤ 400 lines └── bonding/ ├── mod.rs └── descriptor.rs ICOHP-style bonding descriptors (symbolic) ≤ 500 lines ``` ### TDD test plan for `symclaw-materials` ```rust // groups/ #[test] fn point_group_oh_order_48() #[test] fn point_group_td_order_24() #[test] fn space_group_225_fcc_structure() #[test] fn wyckoff_positions_for_sg_229() #[test] fn character_table_c2v() #[test] fn great_orthogonality_theorem() // lattice/ #[test] fn fcc_reciprocal_lattice() #[test] fn bcc_miller_indices_110() #[test] fn bragg_law() // structure/ #[test] fn nacl_structure_factor() #[test] fn diamond_systematic_absences() ``` --- ## 7. GPU Extensions (`symclaw-gpu`) Add two new GPU modules to the existing crate: ### 7.1 `tensor_network.rs` — Tensor Network Contraction (≤ 900 lines) Contract arbitrary tensor networks on GPU — required for quantum circuit simulation beyond ~20 qubits and for lattice QCD. ```rust pub struct TensorNetwork { tensors: Vec, contractions: Vec<(usize, usize, Vec<(usize, usize)>)>, // (t1, t2, [(i1,i2)]) } impl TensorNetwork { pub fn contract_all(&self, runtime: &CubeclRuntime) -> GpuTensor; pub fn optimal_order(&self) -> Vec<(usize, usize)>; // greedy min-cut ordering } ``` **TDD tests:** ```rust #[test] fn matrix_multiply_as_tensor_contraction() #[test] fn trace_as_tensor_contraction() #[test] fn bell_state_tensor_network() #[test] fn ghz_tensor_network_3q() #[test] fn optimal_contraction_order_star_graph() ``` ### 7.2 `clifford_sim.rs` — GPU Clifford Circuit Simulation (≤ 600 lines) Clifford circuits can be simulated in polynomial time via tableau methods. GPU-parallelise the binary symplectic Gaussian elimination for large qubit counts. **TDD tests:** ```rust #[test] fn clifford_sim_100_qubits() #[test] fn clifford_sim_bell_state() #[test] fn tableau_gpu_matches_cpu() ``` --- ## 8. CLI Extensions (`symclaw-cli`) Add new REPL commands for each domain: | Command | Description | |---------|-------------| | `:quantum circuit ` | Parse and display circuit | | `:zx simplify ` | ZX-calculus simplification | | `:bio sian ` | Run structural identifiability | | `:bio reaction ` | Load and analyse reaction network | | `:qchem hamiltonian ` | Build second-quantized Hamiltonian | | `:mat spacegroup ` | Look up space group info | | `:clifford ` | Evaluate Clifford algebra expression | Each command must have: - A `#[test]` that exercises the command with a concrete valid input - A `#[test]` that returns a meaningful error on invalid input --- ## 9. Python Bindings (`symclaw-python`) Add PyO3 bindings for each new crate: ```python # quantum from symclaw import QuantumCircuit, ZXDiagram, PauliGroup circ = QuantumCircuit(3) circ.h(0); circ.cnot(0, 1); circ.cnot(1, 2) zx = ZXDiagram.from_circuit(circ) simplified = zx.simplify() print(simplified.to_circuit().to_openqasm3()) # bio from symclaw.bio import OdeModel, sian model = OdeModel(states=["S","I","R"], params=["β","γ"]) model.add_ode("S", "-β*S*I") model.add_ode("I", "β*S*I - γ*I") model.add_ode("R", "γ*I") model.add_output("I") report = sian(model) print(report) # {"β": "globally_identifiable", "γ": "globally_identifiable"} # qchem from symclaw.qchem import FermionOp, wick_normal_order a, adag = FermionOp.annihilate, FermionOp.create expr = adag(0) * adag(1) * a(1) * a(0) print(wick_normal_order(expr)) ``` Each Python-facing function must have a Python-level docstring and a corresponding `#[test]` in Rust that exercises the same logic. --- ## 10. WASM Extensions (`symclaw-wasm`) Add browser-accessible exports for quantum and bio: ```typescript // quantum export function zx_simplify(circuit_json: string): string; export function circuit_to_openqasm3(circuit_json: string): string; export function simulate_statevector(circuit_json: string, n_qubits: number): Float64Array; // bio export function run_sian(model_json: string): string; export function reaction_network_odes(sbml_xml: string): string; ``` --- ## 11. Skill Actions (`symclaw-skill`) Add 14 new JSON-RPC skill actions: | Action | Input | Output | |--------|-------|--------| | `quantum_circuit` | `{"gates": [...]}` | Circuit diagram + metrics | | `zx_simplify` | `{"circuit": {...}}` | Simplified diagram + T-count | | `zx_extract` | `{"diagram": {...}}` | Extracted circuit | | `pauli_product` | `{"ops": ["X","Y","Z"]}` | Product with phase | | `sian` | `{"model": {...}}` | Identifiability report | | `reaction_network` | `{"reactions": [...]}` | ODEs + stoichiometry | | `normal_order` | `{"expr": "..."}` | Normal-ordered expression | | `wick_contract` | `{"expr": "..."}` | Contracted expression | | `molecular_integral` | `{"type": "overlap", "basis": [...]}` | Closed-form integral | | `spacegroup` | `{"symbol": "Fm-3m"}` | Group info + Wyckoff | | `point_group` | `{"symbol": "Oh"}` | Character table | | `structure_factor` | `{"crystal": {...}, "hkl": [1,1,0]}` | F(hkl) | | `clifford_eval` | `{"pq": [3,0], "expr": "..."}` | Multivector result | | `cyclotomic` | `{"n": 8, "expr": "..."}` | Exact cyclotomic arithmetic | --- ## 12. Implementation Phases & Sequencing ### Phase 0 — Housekeeping (1–2 days) 1. Bump `rust-version = "1.94.0"` and `edition = "2024"` in workspace 2. Split `integrate_advanced/mod.rs` → `rational.rs` + `risch.rs` + `special.rs` 3. Split `step_by_step.rs` → `step_by_step/trace.rs` + `step_by_step/render.rs` 4. Fix all `unused_*` warnings → promote to `deny` 5. CI: add `--deny warnings` flag ### Phase 1 — Core extensions (1 week) Order matters — later phases depend on these: 1. `clifford/` — multivector algebra 2. `exterior/` — Grassmann algebra 3. `permutation/` — symmetric group 4. `cyclotomic/` — exact field arithmetic 5. New `FuncId` variants + `Expr` variants (BraKet, OperatorApply) 6. `codegen.rs` — OpenQASM3, Qiskit, SBML targets 7. TDD: **all tests in §2 must pass before Phase 2 begins** ### Phase 2 — `symclaw-quantum` (2 weeks) 1. `pauli/` — Pauli group + stabilizer 2. `clifford_gates/` — gates as Clifford algebra elements 3. `circuit/` — gate DAG + state-vector simulator 4. `zx/` — diagram, rewrites, simplifier, extractor 5. `codegen/` — OpenQASM3 / Qiskit / PennyLane / Cirq emitters 6. GPU: `clifford_sim.rs` 7. TDD: **all tests in §3 must pass before Phase 3 begins** ### Phase 3 — `symclaw-bio` (1.5 weeks) 1. `ode_model/` — model builder + Lie derivative engine 2. `identifiability/sian.rs` — core SIAN algorithm 3. `reactions/` — reaction networks + SBML 4. `population/` + `genome/` 5. TDD: **all tests in §4 must pass before Phase 4 begins** ### Phase 4 — `symclaw-qchem` (2 weeks) 1. `second_quant/` — operators, algebra, Wick 2. `integrals/` — Gaussian basis, McMurchie-Davidson 3. `spin/` — spinors, Clebsch-Gordan 4. `vqe/` — UCCSD ansatz, parameter-shift gradient 5. TDD: **all tests in §5 must pass before Phase 5 begins** ### Phase 5 — `symclaw-materials` (1 week) 1. `groups/` — 32 point groups, 230 space groups (data-driven) 2. `lattice/` + `structure/` + `bonding/` 3. TDD: **all tests in §6 must pass before Phase 6 begins** ### Phase 6 — GPU extensions (1 week) 1. `tensor_network.rs` 2. `clifford_sim.rs` 3. Benchmark: compare CPU vs GPU for 10, 20, 50 qubit circuits ### Phase 7 — Surface layers (1 week) 1. CLI commands 2. Python bindings (PyO3) 3. WASM exports 4. Skill actions (22 → 36) 5. Update README, ARCHITECTURE.md, CHANGELOG.md ### Phase 8 — Integration & documentation (3 days) 1. End-to-end example notebooks (Jupyter via PyO3) 2. Web app: add quantum circuit visualizer, ZX diagram renderer 3. Update comparison table vs Mathematica/SymPy/PyZX 4. Tag release: `v0.2.0` **Total estimated time: ~9 weeks solo, ~4–5 weeks with parallel workstreams.** --- ## 13. TDD Discipline Rules These are non-negotiable for every commit: 1. **Test first:** Write the `#[test]` that calls the function before writing the function. 2. **No `todo!()`:** If a function can't be fully implemented, don't commit it. Draft on a branch. 3. **No `unimplemented!()`:** Same rule. 4. **No mock types:** Test against real implementations. If a dependency is heavy, use a small concrete example, not a stub. 5. **No `#[ignore]`:** If a test is slow, optimise it or gate it behind `#[cfg(feature = "slow_tests")]` — never ignore. 6. **Property tests:** Every algebraic law (associativity, commutativity, distributivity) must be covered by a `proptest!` macro test, not just hand-picked examples. 7. **No `unwrap()` / `expect()` in library code:** Use `?` and `thiserror`. The lint `clippy::unwrap_used = "deny"` is already in the workspace — enforce it. 8. **Error types:** Every new module gets its own `Error` enum via `thiserror`. No `anyhow` in library code (only in CLI/tests). 9. **File limit enforcement:** CI step runs `find crates -name '*.rs' | xargs wc -l | awk '$1 > 1250'` and fails if any file exceeds 1 250 lines. --- ## 14. CI Pipeline Additions Add to `.github/workflows/ci.yml`: ```yaml - name: Check file line counts run: | OVER=$(find crates -name '*.rs' | xargs wc -l 2>/dev/null \ | awk '$1 > 1250 && $2 != "total" {print $0}') if [ -n "$OVER" ]; then echo "Files exceed 1250 lines:" echo "$OVER" exit 1 fi - name: Check no todo/unimplemented run: | if grep -rn 'todo!()\\|unimplemented!()' crates/; then echo "Found todo!/unimplemented! macros" exit 1 fi - name: Clippy deny warnings run: cargo clippy --all-targets --all-features -- -D warnings - name: Test all workspace members run: cargo test --workspace --all-features ``` --- ## 15. Dependency Additions Add to `[workspace.dependencies]` in root `Cargo.toml`: ```toml # Quantum / ZX petgraph = "0.6" # graph data structure for ZX diagrams, circuit DAGs # Biology quick-xml = "0.36" # SBML XML import/export # Quantum chemistry / spin half = "2" # f16 for GPU integral batches (already present) # Proptest for algebraic law testing proptest = { version = "1", features = ["std"] } # promote from dev-dep ``` No new dependencies beyond these. All math is implemented from scratch in Rust to maintain the zero-dependency-on-commercial-CAS guarantee. --- ## 16. Versioning & Changelog - Current: `v0.1.0` - After Phase 2 (quantum): `v0.2.0` - After Phase 4 (bio + qchem): `v0.3.0` - After Phase 5+ (materials + GPU): `v0.4.0` - After Phase 7 (all surfaces): `v0.5.0` Each phase's completion is tagged in git. CHANGELOG.md is updated at each tag. --- ## 17. README / Documentation Updates After each phase, update: - `README.md`: module table, stats (line count, test count, crate count) - `ARCHITECTURE.md`: new crate dependency graph - `docs/quantum.md` (new) - `docs/bio.md` (new) - `docs/qchem.md` (new) - `docs/materials.md` (new) Comparison table additions: | Feature | SymClaw v0.5 | PyZX | SIAN | OpenFermion | ASE | |---------|-------------|------|------|-------------|-----| | ZX-calculus | ✅ GPU | ✅ | ❌ | ❌ | ❌ | | Structural identifiability | ✅ GPU Gröbner | ❌ | ✅ Maple | ❌ | ❌ | | Second quantization | ✅ | ❌ | ❌ | ✅ | ❌ | | Molecular integrals | ✅ symbolic | ❌ | ❌ | ❌ | ❌ | | Space group algebra | ✅ | ❌ | ❌ | ❌ | ✅ partial | | AI agent integration | ✅ | ❌ | ❌ | ❌ | ❌ | | GPU acceleration | ✅ 11 modules | ❌ | ❌ | ❌ | ❌ | | Open source | ✅ MIT/Apache | ✅ MIT | ❌ Maple | ✅ Apache | ✅ LGPL | --- *End of PLAN.md — Last updated 2026-03-19*