Last Updated: November 2025
Qiskit Version: 2.x (>= 1.0.0)
Testing Status: 52/56 examples (93%) passing
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.
- 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 ✅
- 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
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'
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.pyexamples/module8_applications/02_financial_portfolio_optimization.pyexamples/module8_applications/03_supply_chain_logistics.pyexamples/module8_applications/05_materials_science_manufacturing.py
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'
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
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
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
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
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
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
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 totalFiles Updated:
examples/module3_programming/03_quantum_circuit_patterns.pyexamples/module5_error_correction/03_error_mitigation_techniques.py
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 skipFiles Updated:
examples/module7_hardware/03_hardware_optimized_circuits.py
Installation:
pip install networkx| 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 |
- Use
--quickflag when available for faster testing - Reduce iterations in VQE/QAOA for testing:
result = minimize(cost_function, initial_params, method='COBYLA', options={'maxiter': 5}) # Lower for testing
- Docker containers include all dependencies pre-configured
When encountering errors:
- ✅ Check Qiskit version:
pip show qiskit(should be >= 1.0.0) - ✅ Replace
bind_parameterswithassign_parameters - ✅ Add
.decompose()when composing library circuits - ✅ Use separate noise models for 1-qubit and 2-qubit gates
- ✅ Ensure measurements are present before running
- ✅ Use
density_matrixmethod for noisy simulations - ✅ Check for pre-created classical registers with
measure_all()
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
- Run full test suite:
python verify_examples.py - Check Qiskit release notes for API changes
- Update this compatibility guide
- Update module documentation headers
- Parameter binding API changes
- Noise model API updates
- Simulator backend changes
- Circuit library updates
- Measurement and classical control syntax
- Qiskit Migration Guide: https://docs.quantum.ibm.com/migration-guides
- Qiskit 2.x Documentation: https://docs.quantum.ibm.com/
- Qiskit API Reference: https://docs.quantum.ibm.com/api/qiskit
- Release Notes: https://github.com/Qiskit/qiskit/releases
For issues related to this codebase:
- Check this compatibility guide
- Run
python verify_examples.pyto diagnose - Review module-specific documentation in
modules/ - Check the troubleshooting section in README.md
Maintained by: Quantum Computing 101 Team
Last Tested: November 2025
Next Review: When Qiskit 3.x releases