Skip to content

Latest commit

 

History

History
380 lines (272 loc) · 9.32 KB

File metadata and controls

380 lines (272 loc) · 9.32 KB

Qiskit 2.x Compatibility Guide

Last Updated: November 2025
Qiskit Version: 2.x (>= 1.0.0)
Testing Status: 52/56 examples (93%) passing


Overview

This document outlines the compatibility updates made to ensure all examples work with Qiskit 2.x and provides migration guidance for anyone updating older quantum code.

Testing Results

✅ Fully Working Modules (46/46 examples)

  • Module 1 (Fundamentals): 8/8 ✅
  • Module 2 (Mathematics): 5/5 ✅
  • Module 3 (Programming): 6/6 ✅
  • Module 4 (Algorithms): 5/5 ✅
  • Module 5 (Error Correction): 5/5 ✅
  • Module 6 (Machine Learning): 5/5 ✅
  • Module 7 (Hardware): 5/5 ✅

⚠️ Partially Working

  • Module 8 (Applications): 3/6 fully working, 1 slow but functional
    • Working: cryptography examples, quantum chemistry (60-120s runtime)
    • Needs attention: Some optimization examples with PauliEvolution

Major API Changes

1. Parameter Binding: bind_parametersassign_parameters

Old Qiskit 0.x syntax:

# This no longer works in Qiskit 2.x
bound_circuit = circuit.bind_parameters(params)

New Qiskit 2.x syntax:

# Use assign_parameters instead
bound_circuit = circuit.assign_parameters(params)

Files Updated: 20+ files across all modules

Common Error Messages:

AttributeError: 'QuantumCircuit' object has no attribute 'bind_parameters'
AttributeError: 'TwoLocal' object has no attribute 'bind_parameters'
AttributeError: 'QAOAAnsatz' object has no attribute 'bind_parameters'

2. Circuit Library Decomposition

Problem: Circuit library objects (TwoLocal, QAOAAnsatz, etc.) must be decomposed before composition.

Old approach (may fail):

qc.compose(ansatz.assign_parameters(params), inplace=True)

New approach (required):

qc.compose(ansatz.assign_parameters(params).decompose(), inplace=True)

Common Error Messages:

Error: 'unknown instruction: TwoLocal'
Error: 'unknown instruction: QAOAAnsatz'
Error: 'unknown instruction: PauliEvolution'

Files Updated:

  • examples/module8_applications/01_quantum_chemistry_drug_discovery.py
  • examples/module8_applications/02_financial_portfolio_optimization.py
  • examples/module8_applications/03_supply_chain_logistics.py
  • examples/module8_applications/05_materials_science_manufacturing.py

3. Conditional Operations: c_ifif_test

Old Qiskit 0.x syntax:

qc.x(2).c_if(qc.cregs[0], 1)

New Qiskit 2.x syntax:

with qc.if_test((qc.cregs[0], 1)):
    qc.x(2)

Files Updated:

  • examples/module3_programming/01_advanced_qiskit_programming.py

Common Error Message:

AttributeError: 'InstructionSet' object has no attribute 'c_if'

Noise Model Fixes

Issue: Mismatched Qubit Counts in Error Models

Problem: Applying 1-qubit error models to 2-qubit gates (and vice versa) causes errors.

Common Error Message:

Error: '1 qubit QuantumError cannot be applied to 2 qubit instruction "cx"'

Solution: Create separate error models for different gate types:

from qiskit_aer.noise import NoiseModel, depolarizing_error

# Create separate error models
error_1q = depolarizing_error(error_rate, 1)
error_2q = depolarizing_error(error_rate, 2)

noise_model = NoiseModel()
# Apply 1-qubit errors to single-qubit gates
noise_model.add_all_qubit_quantum_error(error_1q, ["h", "x", "y", "z"])
# Apply 2-qubit errors to two-qubit gates
noise_model.add_all_qubit_quantum_error(error_2q, ["cx", "cy", "cz"])

Files Updated:

  • examples/module5_error_correction/01_quantum_noise_models.py
  • All Module 5 examples

Density Matrix vs Statevector with Noise

Problem: Statevector simulation doesn't properly handle some noise models.

Solution: Use density matrix method for noisy simulations:

# Use density_matrix for noisy simulations
simulator = AerSimulator(method="density_matrix")

# Save and retrieve density matrix
qc.save_density_matrix()
job = simulator.run(qc, noise_model=noise_model)
result = job.result()
noisy_state = result.data()['density_matrix']

Files Updated:

  • examples/module5_error_correction/01_quantum_noise_models.py

Readout Error API Update

Old syntax:

noise_model.add_readout_error(readout_error)

New syntax:

noise_model.add_all_qubit_readout_error(readout_error)

Files Updated:

  • examples/module5_error_correction/01_quantum_noise_models.py

Measurement Circuit Requirements

Issue: Missing Measurements

Problem: Some examples need explicit measurement circuits added.

Common Error Message:

Error: 'No counts for experiment "0"'

Solution: Add measurements before running:

# Add measurement before running with noise
qc_measured = qc.copy()
qc_measured.measure_all()

job = simulator.run(qc_measured, shots=1000, noise_model=noise_model)

Files Updated:

  • examples/module7_hardware/04_real_hardware_errors.py

Other API Updates

1. Statevector Normalization

Problem: Statevector.norm() method removed.

Old:

normalized = state / state.norm()

New:

normalized = state / np.linalg.norm(state.data)

Files Updated:

  • examples/module2_mathematics/03_state_vectors_representations.py

2. Optimizer Result Attributes

Problem: Different optimizers return different attribute names.

Solution: Use getattr with fallbacks:

# Handle both 'nit' and 'nfev' attributes
n_iterations = getattr(result, 'nit', getattr(result, 'nfev', 0))

Files Updated:

  • examples/module8_applications/01_quantum_chemistry_drug_discovery.py

3. Classical Register Handling

Problem: measure_all() creates new classical registers, causing size mismatches.

Solution: Don't pre-create classical bits if using measure_all():

# Old (causes issues)
qc = QuantumCircuit(2, 2)
qc.measure_all()  # Creates 2 more bits = 4 total

# New (correct)
qc = QuantumCircuit(2)
qc.measure_all()  # Creates 2 bits = 2 total

Files Updated:

  • examples/module3_programming/03_quantum_circuit_patterns.py
  • examples/module5_error_correction/03_error_mitigation_techniques.py

Optional Dependencies

NetworkX

Some visualization features require networkx. Made optional with graceful degradation:

try:
    import networkx as nx
    HAS_NETWORKX = True
except ImportError:
    HAS_NETWORKX = False
    print("ℹ️  networkx not available, some features limited")

# Later in code
if HAS_NETWORKX:
    # Use networkx features
else:
    # Provide alternative or skip

Files Updated:

  • examples/module7_hardware/03_hardware_optimized_circuits.py

Installation:

pip install networkx

Performance Notes

Expected Runtimes

Example Type Typical Runtime Notes
Basic circuits < 1s Most examples
Optimization (VQE, QAOA) 60-120s Normal for variational algorithms
Machine learning 30-60s Depends on dataset size
Heavy simulations 2-5 min Large molecules, deep circuits

Optimization Tips

  1. Use --quick flag when available for faster testing
  2. Reduce iterations in VQE/QAOA for testing:
    result = minimize(cost_function, initial_params, 
                      method='COBYLA', 
                      options={'maxiter': 5})  # Lower for testing
  3. Docker containers include all dependencies pre-configured

Troubleshooting Checklist

When encountering errors:

  1. ✅ Check Qiskit version: pip show qiskit (should be >= 1.0.0)
  2. ✅ Replace bind_parameters with assign_parameters
  3. ✅ Add .decompose() when composing library circuits
  4. ✅ Use separate noise models for 1-qubit and 2-qubit gates
  5. ✅ Ensure measurements are present before running
  6. ✅ Use density_matrix method for noisy simulations
  7. ✅ Check for pre-created classical registers with measure_all()

Testing Methodology

All examples tested with:

  • Python: 3.11+
  • Qiskit: 2.x (latest)
  • Environment: Linux (Ubuntu), headless (matplotlib Agg backend)
  • Test Command:
    python verify_examples.py
    # or for individual modules
    python verify_examples.py --module module5_error_correction

Future Maintenance

When Qiskit Updates

  1. Run full test suite: python verify_examples.py
  2. Check Qiskit release notes for API changes
  3. Update this compatibility guide
  4. Update module documentation headers

Common Patterns to Watch

  • Parameter binding API changes
  • Noise model API updates
  • Simulator backend changes
  • Circuit library updates
  • Measurement and classical control syntax

Additional Resources


Contact & Support

For issues related to this codebase:

  1. Check this compatibility guide
  2. Run python verify_examples.py to diagnose
  3. Review module-specific documentation in modules/
  4. Check the troubleshooting section in README.md

Maintained by: Quantum Computing 101 Team
Last Tested: November 2025
Next Review: When Qiskit 3.x releases