Science Workflow

Quantum Chemistry

VQE algorithms with uncertainty quantification for quantum computing research

Back to Science Hub

Quantum Chemistry: VQE Optimization

Adjust shot noise to see how Sounio tracks execution variance and aborts expensive quantum loops when NISQ hardware noise corrupts the optimizer landscape.

Increase measurement error to simulate noisy intermediate-scale quantum (NISQ) hardware.

Measured Optimization Path
Ideal Ground State Trajectory
Divergence Halt Trigger
Target Ground State
Sounio WASM Runtime

Quantum Chemistry with Sounio

Sounio provides tools for quantum chemistry simulations with built-in uncertainty quantification for variational quantum algorithms.

Quantum Computing Challenges

Quantum computations are inherently probabilistic:

  • Shot noise from finite measurements
  • Gate errors and decoherence
  • Variational parameter optimization
  • Hardware calibration uncertainty

Sounio’s epistemic types naturally model these uncertainties.

Variational Quantum Eigensolver

use std::quantum::{Circuit, Hamiltonian, Qubit}
use std::epistemic::{Knowledge, measure}

fn vqe_iteration(
    hamiltonian: &Hamiltonian,
    ansatz: &Circuit,
    params: Vec<f64>,
    shots: i32
) -> Knowledge<f64> with Quantum {
    // Prepare parameterized circuit
    let circuit = ansatz.bind(params)

    // Measure expectation value with shot noise
    let measurements = (0..shots).map(|_| {
        let state = circuit.execute()
        hamiltonian.expectation(state)
    })

    // Result includes statistical uncertainty
    Knowledge {
        value: measurements.mean(),
        uncertainty: measurements.std_dev() / (shots as f64).sqrt(),
        confidence: confidence_from_shots(shots),
        provenance: vec!["vqe_measurement"],
    }
}

Confidence-Gated Optimization

fn optimize_vqe(
    hamiltonian: &Hamiltonian,
    ansatz: &Circuit,
    initial_params: Vec<f64>
) -> OptimizationResult with Quantum, IO {
    var params = initial_params
    var energy = vqe_iteration(hamiltonian, ansatz, params, 1000)

    loop {
        let gradient = estimate_gradient(hamiltonian, ansatz, params)

        // Only update if gradient is confident
        if gradient.confidence > 0.90 {
            params = params - learning_rate * gradient.value
            let new_energy = vqe_iteration(hamiltonian, ansatz, params, 1000)

            // Check convergence with uncertainty
            if (energy.value - new_energy.value).abs() < energy.uncertainty {
                return OptimizationResult {
                    energy: new_energy,
                    params: params,
                    converged: true,
                }
            }

            energy = new_energy
        } else {
            // Need more shots for reliable gradient
            perform IO::log("Increasing shots for gradient estimation")
            gradient = estimate_gradient(hamiltonian, ansatz, params, shots: 10000)
        }
    }
}

Molecular Simulation

use std::chemistry::{Molecule, basis_set}

fn compute_ground_state(
    molecule: Molecule
) -> Knowledge<Hartree> with Quantum, IO {
    // Build molecular Hamiltonian
    let hamiltonian = molecule.hamiltonian(basis_set::STO3G)

    // Map to qubit representation
    let qubit_hamiltonian = jordan_wigner(hamiltonian)

    // Hardware-efficient ansatz
    let ansatz = hardware_efficient_ansatz(
        n_qubits: qubit_hamiltonian.n_qubits(),
        depth: 3,
    )

    // Run VQE
    let result = optimize_vqe(qubit_hamiltonian, ansatz, random_initial())

    perform IO::log(
        "Ground state energy: " + result.energy.to_string() +
        " (confidence: " + result.energy.confidence.to_string() + ")"
    )

    result.energy
}

Error Mitigation

fn mitigated_expectation(
    circuit: &Circuit,
    observable: &Observable,
    calibration: &NoiseCalibration
) -> Knowledge<f64> with Quantum {
    // Zero-noise extrapolation
    let noise_levels = vec![1.0, 1.5, 2.0]
    var results = vec![]

    for scale in noise_levels {
        let scaled_circuit = scale_noise(circuit, scale)
        let result = measure_expectation(scaled_circuit, observable)
        results.push((scale, result))
    }

    // Extrapolate to zero noise
    let mitigated = richardson_extrapolation(results)

    // Combine measurement and extrapolation uncertainty
    Knowledge {
        value: mitigated.value,
        uncertainty: (
            mitigated.measurement_uncertainty.pow(2) +
            mitigated.extrapolation_uncertainty.pow(2)
        ).sqrt(),
        confidence: mitigated.confidence,
        provenance: vec!["zne_mitigated"],
    }
}

Features for Quantum Chemistry

  • Shot noise modeling: Automatic uncertainty from finite samples
  • Gate error tracking: Propagate hardware imperfections
  • Optimizer integration: Confidence-aware parameter updates
  • Error mitigation: Built-in ZNE and other techniques
  • Backend agnostic: Works with simulators and real hardware

Supported Platforms

  • IBM Qiskit integration
  • Google Cirq support
  • Amazon Braket compatibility
  • Local simulators

Get Started

sounio new quantum-project --template quantum-chemistry
cd quantum-project
sounio run examples/h2_vqe.sio