NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #4403 most downloaded on PyPI
An open-source SDK for working with quantum computers at the level of extended quantum circuits, operators, and primitives.
Last release 2 days ago
02 Oct 2026
Ships fairly regularly
a new release about every 3 weeks
Most releases are documented
notes for 48 of the last 60 stable releases
2 versions withdrawn
withdrawn after publishing
9 years old
209 releases · first in 2017
Nothing published for this version
Sum VF2Layout average errors in a deterministic order
substitute_node_with_dag (#15542) (#16744)rsgridsynth 0.2.2 (backport #16685) (#16711)DAGCircuit::remove_qubits (#16656) (#16658)One column per quarter.
Fix serial_layers global phase copying
sx resynthesis of negative angles in CommutativeCancellation (#16599) (#16615)Deprecations in qs_decomposition: opt_a* are not needed and decomposer_*q restrictions
classical.expr system (#16449)GateCount over Depth in Clifford+T pipeline (#16218)QubitSparsePauliList.commutes (#16194)qk_{circuit, dag}_global_phase in the C API (#16278)generate_clifford_t_pass_manager (#15918)uuid public on ParameterVector (#16216)TwoQubitControlledUDecomposer (#16123)PauliLindbladMap generators during parity_sample (#16072)ctypes bindings to C API (#16067)try_matrix & friends for PPR and PPM (#16011)lookahead to layer-based tracking (#14911)RemoveIdentityEquivalent and CommutativeOptimization with PauliProductRotations (#15810)LitinskiTransformation (#15773)Initialize.gates_to_uncompute for integer inputs (#16492) (#16519)SynthesizeRZRotations clear rsgridsynth global caches (#16392)CommutationChecker for controlled rotation gates (#16337)ConsolidateBlocks (#16237)ParameterVectors (#16222)ElidePermutations and StarPreRouting (#13945)CouplingMap (#16310)1.0 error in VF2Layout (#16285)InverseCancellation for symmetric pairs (#16153)synth_cz_depth_line_mr (#16154)RemoveIdentityEquivalent with ParameterVector global phase (#16054)remove_final_measurements (#16026) (#16037)remove_final_measurements (#16026)TemplateOptimization dropping the global_phase on substitution (#15943)ParameterExpression handling in pure Polish form (#15934) (#15961)ParameterExpression handling in pure Polish form (#15934)CommutationChecker (#15933) (#15936)CommutationChecker (#15933)BasisTranslator processing of nested ControlFlowOp (#15875) (#15884)BasisTranslator processing of nested ControlFlowOp (#15875)bindgen-cli (#16289)bindgen-c to bindgen-cli (#16096)Target::qargs (#16476) (#16479)GateCount over Depth in Clifford+T pipeline (#16218)ParameterVector to Rust (#16228)np.bitwise_count in BitArray.bitcount (#15836)SubstitutePi4Rotations (#16217)PauliProductRotationGate.to_matrix() from scipy to numpy (#16016)Deprecations in qs_decomposition: opt_a* are not needed and decomposer_*q restrictions
classical.expr system (#16449)GateCount over Depth in Clifford+T pipeline (#16218)QubitSparsePauliList.commutes (#16194)qk_{circuit, dag}_global_phase in the C API (#16278)generate_clifford_t_pass_manager (#15918)uuid public on ParameterVector (#16216)TwoQubitControlledUDecomposer (#16123)PauliLindbladMap generators during parity_sample (#16072)ctypes bindings to C API (#16067)try_matrix & friends for PPR and PPM (#16011)lookahead to layer-based tracking (#14911)RemoveIdentityEquivalent and CommutativeOptimization with PauliProductRotations (#15810)LitinskiTransformation (#15773)SynthesizeRZRotations clear rsgridsynth global caches (#16392)CommutationChecker for controlled rotation gates (#16337)ConsolidateBlocks (#16237)ParameterVectors (#16222)ElidePermutations and StarPreRouting (#13945)CouplingMap (#16310)1.0 error in VF2Layout (#16285)InverseCancellation for symmetric pairs (#16153)synth_cz_depth_line_mr (#16154)RemoveIdentityEquivalent with ParameterVector global phase (#16054)remove_final_measurements (#16026) (#16037)remove_final_measurements (#16026)TemplateOptimization dropping the global_phase on substitution (#15943)ParameterExpression handling in pure Polish form (#15934) (#15961)ParameterExpression handling in pure Polish form (#15934)CommutationChecker (#15933) (#15936)CommutationChecker (#15933)BasisTranslator processing of nested ControlFlowOp (#15875) (#15884)BasisTranslator processing of nested ControlFlowOp (#15875)bindgen-cli (#16289)bindgen-c to bindgen-cli (#16096)GateCount over Depth in Clifford+T pipeline (#16218)ParameterVector to Rust (#16228)np.bitwise_count in BitArray.bitcount (#15836)SubstitutePi4Rotations (#16217)PauliProductRotationGate.to_matrix() from scipy to numpy (#16016)Fix stack-overflow segfault in OpenQASM 2 expression parsers
CommutationChecker for controlled rotation gates (backport #16337) (#16395)ElidePermutations and StarPreRouting (#13945) (#16355)1.0 error in VF2Layout (#16285) (#16287)InverseCancellation for symmetric pairs (#16153) (#16211)synth_cz_depth_line_mr (#16154) (#16155)Fix QPY loading delay integers durations incorrectly
RemoveIdentityEquivalent with ParameterVector global phase (#16054) (#16055)Remove deprecated QISKIT_VERSION_NUMERIC symbol
Release notes: https://quantum.cloud.ibm.com/docs/en/api/qiskit/release-notes/2.4
qk_circuit_draw function to the C API (#15361)qk_api_version (#15831)SparseObservable.evolve (#15561)pyext (#15761)QkTranspileState in C transpile stages. (#15486)QuantumRegister and ClassicalRegister (#15768)QkObs (#15821)QkCircuit C/Python interoperation via QuantumCircuit._data (#15767)Target and DAGCircuit (#15337)qiskit.capi module (#15711)PauliProductRotationGate in LitinskiTransformation (#15753)PauliProductRotationGate (#15720)LitinskiTransformation (#15639)QuantumCircuit.compose (#15696)RCCXGate is self-inverse (#15686)SparseObservable addition with scalar multiplication (#15599)SubstitutePi4Rotations to 2q gates (#15483)OptimizeCliffordT (#15634)UnitarySynthesis to cache decomposers (#15492)QkObs (#15540)remove_final_measurements (#16026) (#16037)ParameterExpression handling in pure Polish form (#15934) (#15961)CommutationChecker (#15933) (#15936)BasisTranslator processing of nested ControlFlowOp (#15875) (#15884)PauliEvolutionGate trace and dim calculation (#15816)cargs in QuantumCircuit.append (#15789)QuantumCircuit.compose (#15696)QuantumCircuit.repeat with parameterized gates (#15646)coeffs type in SparsePauliOp.from_sparse_list (#15427)NaN for QkTargetOp (#15463) (#15525)NaN for QkTargetOp (#15463)QkObs (#15821)QkCircuit C/Python interoperation via QuantumCircuit._data (#15767)manylinux_2_28 (#15791)PauliProductRotationGate in LitinskiTransformation (#15753)bincode with binrw in basic_approximations serialization (#15693)QkParam as parameters for QkTargetOp. (#15538)QISKIT_VERSION_NUMERIC symbol (#15518)qk_transpiler_standalone_optimize_1q_sequences (#15627)manylinux_2_28 (#15791)qiskit.capi module (#15711)cbindgen logic into separate crate (#15679)requirements-*.txt with PEP 735 dependency groups (#15619)QISKIT_BUILD_PROFILE (#15242)Rewrite QPY ParameterExpression handling in pure Polish form
ParameterExpression handling in pure Polish form (#15934) (#15961)CommutationChecker (#15933) (#15936)QPY Rust and Python compatibility fixes
BasisTranslator processing of nested ControlFlowOp (#15875) (#15884)Remove deprecated QISKIT_VERSION_NUMERIC symbol
qk_circuit_draw function to the C API (#15361)qk_api_version (#15831)SparseObservable.evolve (#15561)pyext (#15761)QkTranspileState in C transpile stages. (#15486)QuantumRegister and ClassicalRegister (#15768)QkObs (#15821)QkCircuit C/Python interoperation via QuantumCircuit._data (#15767)Target and DAGCircuit (#15337)qiskit.capi module (#15711)PauliProductRotationGate in LitinskiTransformation (#15753)PauliProductRotationGate (#15720)LitinskiTransformation (#15639)QuantumCircuit.compose (#15696)RCCXGate is self-inverse (#15686)SparseObservable addition with scalar multiplication (#15599)SubstitutePi4Rotations to 2q gates (#15483)OptimizeCliffordT (#15634)UnitarySynthesis to cache decomposers (#15492)QkObs (#15540)PauliEvolutionGate trace and dim calculation (#15816)cargs in QuantumCircuit.append (#15789)QuantumCircuit.compose (#15696)QuantumCircuit.repeat with parameterized gates (#15646)coeffs type in SparsePauliOp.from_sparse_list (#15427)NaN for QkTargetOp (#15463) (#15525)NaN for QkTargetOp (#15463)QkObs (#15821)QkCircuit C/Python interoperation via QuantumCircuit._data (#15767)manylinux_2_28 (#15791)PauliProductRotationGate in LitinskiTransformation (#15753)bincode with binrw in basic_approximations serialization (#15693)QkParam as parameters for QkTargetOp. (#15538)QISKIT_VERSION_NUMERIC symbol (#15518)qk_transpiler_standalone_optimize_1q_sequences (#15627)manylinux_2_28 (#15791)qiskit.capi module (#15711)cbindgen logic into separate crate (#15679)requirements-*.txt with PEP 735 dependency groups (#15619)QISKIT_BUILD_PROFILE (#15242)Avoid panics in Quantum Shannon Decomposition Rust code (backport #15635)
QuantumCircuit.repeat with parameterized gates (#15646) (#15677)coeffs type in SparsePauliOp.from_sparse_list (#15427) (#15548)Deprecate unsafe legacy format in Solovay Kitaev
QkTarget (#15283)IfElseOp conditionals in OpenQASM 2 export (#14556)qk_dag_compose to the C API (#15329)Target in C. (#15208)fallback_on_default to UnitarySynthesis (#15287)instruction_supported to QkTarget. (#14566)QkDag instruction appliers and getter to C API (#15313)qk_dag_successors and qk_dag_predecessors to the C API (#15346)qk_circuit_to_dag and qk_dag_to_circuit to the C API (#15247)qk_dag_topological_op_nodes to C API (#15297)VF2PostLayout to Rust (#14863)UnitaryGate handling to QkDag C API (#15363)ParameterExpression.num_parameters attribute (#15354)call_limit to before and after first layout (#14862)LitinskiTransformation pass to handle measurements (#15217)PauliProductMeasurement instruction (#15126)OptimizeCliffordT transpiler pass. (#14996)Neighbors in the C API (#15236)QkDag with registers to the C API. (#15200)QkParam to the C API (#14837)SparseObservable in sampled_expectation_value (#14516)WrapAngles default registry (#15101)control methods (#15209)setuptools>=77.0 licence specification (#15128)VF2PostLayout in exact mode (#15068)NaN for QkTargetOp (#15463) (#15525)SparseObservable (#15263)generate_unroll_3q (#15401)Pauli.evolve() recognize common rotations by (n*pi/2) as Clifford gates (#15289)ConsolidateBlocks instances (#15258)ConsolidateBlocks input (#15110)ConsolidateBlocks control-flow blocks (#15083)BasisTranslator (#15143)Optimize1qGatesDecomposition (#15117)Delay expressions in QuantumCircuit.compose (#15020) (#15023)Delay expressions in QuantumCircuit.compose (#15020)Statevector.to_dict(decimals= 3) does not round results and ignores the decimals keyword (#12113)VF2PostLayout with uncoupled qubits in strict_direction=True (#14998) (#15001)VF2PostLayout with uncoupled qubits in strict_direction=True (#14998)Deprecate unsafe legacy format in Solovay Kitaev
QkTarget (#15283)IfElseOp conditionals in OpenQASM 2 export (#14556)qk_dag_compose to the C API (#15329)Target in C. (#15208)fallback_on_default to UnitarySynthesis (#15287)instruction_supported to QkTarget. (#14566)QkDag instruction appliers and getter to C API (#15313)qk_dag_successors and qk_dag_predecessors to the C API (#15346)qk_circuit_to_dag and qk_dag_to_circuit to the C API (#15247)qk_dag_topological_op_nodes to C API (#15297)VF2PostLayout to Rust (#14863)UnitaryGate handling to QkDag C API (#15363)ParameterExpression.num_parameters attribute (#15354)call_limit to before and after first layout (#14862)LitinskiTransformation pass to handle measurements (#15217)PauliProductMeasurement instruction (#15126)OptimizeCliffordT transpiler pass. (#14996)Neighbors in the C API (#15236)QkDag with registers to the C API. (#15200)QkParam to the C API (#14837)SparseObservable in sampled_expectation_value (#14516)WrapAngles default registry (#15101)control methods (#15209)setuptools>=77.0 licence specification (#15128)VF2PostLayout in exact mode (#15068)SparseObservable (#15263)generate_unroll_3q (#15401)Pauli.evolve() recognize common rotations by (n*pi/2) as Clifford gates (#15289)ConsolidateBlocks instances (#15258)ConsolidateBlocks input (#15110)ConsolidateBlocks control-flow blocks (#15083)BasisTranslator (#15143)Optimize1qGatesDecomposition (#15117)Delay expressions in QuantumCircuit.compose (#15020) (#15023)Delay expressions in QuantumCircuit.compose (#15020)Statevector.to_dict(decimals= 3) does not round results and ignores the decimals keyword (#12113)VF2PostLayout with uncoupled qubits in strict_direction=True (#14998) (#15001)VF2PostLayout with uncoupled qubits in strict_direction=True (#14998)Fix reuse of ConsolidateBlocks instances
ConsolidateBlocks instances (#15258) (#15266)Fix qpy.dump failure with gzip write streams in QPY v16 (backward seek unsupported)
ConsolidateBlocks input (#15110) (#15218)ConsolidateBlocks control-flow blocks (#15083) (#15214)BasisTranslator (#15143) (#15150)Optimize1qGatesDecomposition (#15117) (#15119)Lower limits on VF2PostLayout in exact mode
VF2PostLayout in exact mode (#15068) (#15075)Deprecate Remaining Legacy Circuit Library Classes and Update References
qk_obs_apply_layout to apply layouts to QkObs (#14106)defcal symbols in OpenQASM 3 export (#14800)QubitSparsePauliList.to_dense_array (#14791)BasisTranslator (#14874)QuantumCircuit.ensure_physical (#14779)ConsolidateBlocks (#14751)DAGCircuit.__deepcopy__ implementation (#14965)Optimize1qGatesDecomposition. (#14710)ApplyLayout to Rust (#14904)TranspileLayout and PropertySet (#14826)Duration for picoseconds. (#14588)RemoveDiagonalGatesBeforeMeasure to the C API (#14731)DAGCircuit (#14762)drop_qubits method to PauliLindbladMap (#14868)PassManager.run (#14825)XGate base gate (#14754)DAGCircuit.make_physical (#14587)SparsePauliOp.assign_parameters to cast coefficients to complex once all parameters are bound (#14611)PassManager.run (#14825)Delay expressions in QuantumCircuit.compose (#15020) (#15023)VF2PostLayout with uncoupled qubits in strict_direction=True (#14998) (#15001)VF2PostLayout after optimization loop at O3 (#14869)standard_operation for PyGate (#14978)CommutativeCancellation (#14956)QkCountOps creation. (#14930)TranspileLayout.initial_index_layout with unordered virtuals (#14939)final_layout (#14919)CommutativeCancellation (#14763)qk_circuit_get_instruction. (#14884)control method for the gates in the MCX family (#14728)qpy.dump (#14795)Target::py_instruction_supported and remove the py token parameter (#14765)CommutativeInverseCancellation transpiler pass (#14655)ElidePermutations pass in the presence of PermutationGates (#14603) (#14623)ElidePermutations pass in the presence of PermutationGates (#14603)ApplyLayout with empty layout (#14606) (#14613)ApplyLayout with empty layout (#14606)Deprecate Remaining Legacy Circuit Library Classes and Update References
qk_obs_apply_layout to apply layouts to QkObs (#14106)defcal symbols in OpenQASM 3 export (#14800)QubitSparsePauliList.to_dense_array (#14791)BasisTranslator (#14874)QuantumCircuit.ensure_physical (#14779)ConsolidateBlocks (#14751)DAGCircuit.__deepcopy__ implementation (#14965)Optimize1qGatesDecomposition. (#14710)ApplyLayout to Rust (#14904)TranspileLayout and PropertySet (#14826)Duration for picoseconds. (#14588)RemoveDiagonalGatesBeforeMeasure to the C API (#14731)DAGCircuit (#14762)drop_qubits method to PauliLindbladMap (#14868)PassManager.run (#14825)XGate base gate (#14754)DAGCircuit.make_physical (#14587)SparsePauliOp.assign_parameters to cast coefficients to complex once all parameters are bound (#14611)PassManager.run (#14825)VF2PostLayout after optimization loop at O3 (#14869)standard_operation for PyGate (#14978)CommutativeCancellation (#14956)QkCountOps creation. (#14930)TranspileLayout.initial_index_layout with unordered virtuals (#14939)final_layout (#14919)CommutativeCancellation (#14763)qk_circuit_get_instruction. (#14884)control method for the gates in the MCX family (#14728)qpy.dump (#14795)Target::py_instruction_supported and remove the py token parameter (#14765)CommutativeInverseCancellation transpiler pass (#14655)ElidePermutations pass in the presence of PermutationGates (#14603) (#14623)ElidePermutations pass in the presence of PermutationGates (#14603)ApplyLayout with empty layout (#14606) (#14613)ApplyLayout with empty layout (#14606)Deprecate Remaining Legacy Circuit Library Classes and Update References
Optimize1qGatesDecomposition. (#14710)ApplyLayout to Rust (#14904)TranspileLayout and PropertySet (#14826)Duration for picoseconds. (#14588)RemoveDiagonalGatesBeforeMeasure to the C API (#14731)DAGCircuit (#14762)drop_qubits method to PauliLindbladMap (#14868)PassManager.run (#14825)XGate base gate (#14754)DAGCircuit.make_physical (#14587)PassManager.run (#14825)CommutativeCancellation (#14956)QkCountOps creation. (#14930)TranspileLayout.initial_index_layout with unordered virtuals (#14939)final_layout (#14919)CommutativeCancellation (#14763)qk_circuit_get_instruction. (#14884)control method for the gates in the MCX family (#14728)qpy.dump (#14795)Target::py_instruction_supported and remove the py token parameter (#14765)CommutativeInverseCancellation transpiler pass (#14655)ElidePermutations pass in the presence of PermutationGates (#14603) (#14623)ElidePermutations pass in the presence of PermutationGates (#14603)ApplyLayout with empty layout (#14606) (#14613)ApplyLayout with empty layout (#14606)Fix composition of final_layout
final_layout (#14919) (#14920)qk_circuit_get_instruction. (#14884) (#14906)qpy.dump (#14795) (#14796)Target::py_instruction_supported and remove the py token parameter (#14765) (#14773)Add missing stacklevel to deprecation warning for 3.9
Move PendingDeprecations to Deprecations in the circuit library
Release notes: https://docs.quantum.ibm.com/api/qiskit/release-notes/2.1#210
box (#13899)Target C API (#14248)has_control_flow_op() to QuantumCircuit (#13936)QkComplex64 to the C API (#14340)ObservablesArray: sparse_observables_array and sparse_observables_array_slice (#14344)ObservablesArray.apply_layout and some additional methods (#14289)Var and Stretch in DAGCircuit (#14000)ElidePermutations pass in the presence of PermutationGates (#14603) (#14623)ApplyLayout with empty layout (#14606) (#14613)QPY (#13727)Var and Stretch (#14488)quantum_or.py (#14436)stretch variables (#14330)SolovayKitaevSynthesis plugin (#14304)SabreLayout (#14186)MCMTGate (#14096) (#14118)MCMTGate (#14096)generate_preset_pass_manager if dt is set (#14065) (#14098)generate_preset_pass_manager if dt is set (#14065)BasisTranslator Pass (backport #14078) (#14092)BasisTranslator Pass (#14078)DAGCircuit variable IO nodes (backport #14041) (#14044)DAGCircuit variable IO nodes (#14041)Move PendingDeprecations to Deprecations in the circuit library
box (#13899)Target C API (#14248)has_control_flow_op() to QuantumCircuit (#13936)QkComplex64 to the C API (#14340)ObservablesArray: sparse_observables_array and sparse_observables_array_slice (#14344)ObservablesArray.apply_layout and some additional methods (#14289)Var and Stretch in DAGCircuit (#14000)QPY (#13727)Var and Stretch (#14488)quantum_or.py (#14436)stretch variables (#14330)SolovayKitaevSynthesis plugin (#14304)SabreLayout (#14186)MCMTGate (#14096) (#14118)MCMTGate (#14096)generate_preset_pass_manager if dt is set (#14065) (#14098)generate_preset_pass_manager if dt is set (#14065)BasisTranslator Pass (backport #14078) (#14092)BasisTranslator Pass (#14078)DAGCircuit variable IO nodes (backport #14041) (#14044)DAGCircuit variable IO nodes (#14041)Fix classical bit mapping in HLS pass
ElidePermutations pass in the presence of PermutationGates (#14603) (#14621)ApplyLayout with empty layout (#14606) (#14616)Var and Stretch (#14488) (#14494)Fixed AND terms for OR in quantum_or.py
quantum_or.py (#14436) (#14462)Fix construction of IQP circuits (backport #14363)
stretch variables (backport #14330) (#14331)SolovayKitaevSynthesis plugin (#14304) (#14311)Duration. (backport #14174) (#14193)SabreLayout (#14186) (#14189)Extend deprecation of QuantumCircuit.duration and DAGCircuit.duration
Release notes: https://docs.quantum.ibm.com/api/qiskit/release-notes/2.0
dag in DAGNode constructor is deprecated (#13862)qiskit.circuit.classicalfunction (#13786)BackendProperties (BackendV1) in transpilation pipeline (#13719)atomic_evolution (#13603)Register and Bit (#13841)translation stage always outputs ISA circuits (#13792)BasicSimulator.run_experiment (#13750)show_idle and show_barrier in favor of idle_wires and plot_barriers (#13602)idle_wires default flipped to False in all circuit drawers (#13865)stretch variable support to QuantumCircuit. (#13852)BasePass.__call__ to PassManager.run (#13820)box (#13869)+, -, *, / operators for classical expressions. (#13850)SparseObservable evolution (#13836)SparseObservable.compose (#13766)Float type in classical expressions. (#13832)SparseObservable (#13694)const classical expressions. (#13811)ContractIdleWiresInControlFlow optimisation pass (#13779)BooleanExpression on tweedledum (#13769)default routing stage plugin (#13802)UnitarySynthesis transpiler pass (#13568)default translation stage plugin (#13794)SparseObservable to SparsePauliOp conversions (#13758)QuantumCircuit.noop for instructionless qubit use (#13774)get_control_flow_name_mapping function (#13472)max_block_width to CollectLinearFunctions and CollectClifford passes (#13661)BitArray into boolean array (#13653)collect_from_back to CollectMultiQBlocks (#13612)StabilizerState.expectation_value can also accept SparsePauliOp (#13539)idle_wires default flipped to False in all circuit drawers (#13865)BasePass.__call__ to PassManager.run (#13820)atomic_evolution signature in ProductFormula subclasses (#13918)DAGCircuit::control_flow_op_nodes (#13892)default routing stage plugin (#13802)QuantumCircuit (#13893)measure_active to meas (#13866)property_set kwarg to BasePassManger.run (#13821)translation stage always outputs ISA circuits (#13792)default translation stage plugin (#13794)BlueprintCircuit.copy_empty_like return an empty QuantumCircuit (#13782)BackendV1 elements, including base class, providers.models and qobj modules (#13793)BackendV1 and related tools (#13805)classical_function module and all tweedledum-related code (#13815)BackendProperties (BackendV1) in transpiler pipeline (#13722)assemble and assembler module (#13748)BasicSimulator (#13743)CXCancellation (deprecated in 1.1) (#13426)deprecate_function and deprecate_arguments decorators (deprecated in 0.24) (#13448)MCMTGate (#14096) (#14118)generate_preset_pass_manager if dt is set (#14065) (#14098)BasisTranslator Pass (backport #14078) (#14092)DAGCircuit variable IO nodes (backport #14041) (#14044)generate_basis_approximations (#13517) (#13964)generate_basis_approximations (#13517)BasePass.__call__ to PassManager.run (#13820)ConsolidateBlocks transpiler pass (#13884)ParameterExpression (backport #13890) (#13943)ParameterExpression (#13890)circuit_to_instruction is called (#13921)DAGCircuit.name in ApplyLayout (#13910) (#13920)DAGCircuit.name in ApplyLayout (#13910)PyGate and PyInstruction (#13777)unit in Delay comparisons (#13816) (#13827)unit in Delay comparisons (#13816)SabreSwap (#13790)CommutationChecker for 2q Pauli rotations (#13762) (#13804)CommutationChecker for 2q Pauli rotations (#13762)random_clifford (#13606) (#13710)CommutationChecker (#13670) (#13676)CommutationChecker (#13600) (#13677)CommutationChecker (#13670)PauliEvolutionGate (using product formulas) for all-identity Pauli terms (#13634) (#13658)PauliEvolutionGate (using product formulas) for all-identity Pauli terms (#13634)UnitarySynthesis pass bug when target contains global gates (#13651) (#13656)Target.instruction_supported when target.num_qubits == None (#13655) (#13657)Target.instruction_supported when target.num_qubits == None (#13655)UnitarySynthesis pass bug when target contains global gates (#13651)pauli_list.insert(..., qubit=True) for length-1 pauli_list (#13624) (#13637)pauli_list.insert(..., qubit=True) for length-1 pauli_list (#13624)CommutationChecker (#13600)UnitarySynthesis for 3+ qubits when compiled for a backend (#13591) (#13619)MCMTGate (#13596) (#13618)UnitarySynthesis for 3+ qubits when compiled for a backend (#13591)MCMTGate (#13596)random_clifford (#13606)SparsePauliOp initialization with dense Y labels (#13580) (#13611)SparsePauliOp initialization with dense Y labels (#13580)assign_parameters (#13557) (#13559)assign_parameters (#13557).decompose on control flow (#13545) (#13549).decompose on control flow (#13545)global_phase parameters when creating CircuitData (#13538) (#13541)global_phase parameters when creating CircuitData (#13538)add_control (#13475) (#13528)add_control (#13475)InverseCancellation to run in classical blocks (#13454) (#13496)InverseCancellation to run in classical blocks (#13454)NLocal(..., flatten=True) and standard gates (#13482) (#13495)NLocal(..., flatten=True) and standard gates (#13482)SparsePauliOp.to_matrix (#13439) (#13440)SparsePauliOp.to_matrix (#13439)Introduce custom sympy srepr parser [stable/2.0]
Extend deprecation of QuantumCircuit.duration and DAGCircuit.duration
dag in DAGNode constructor is deprecated (#13862)qiskit.circuit.classicalfunction (#13786)BackendProperties (BackendV1) in transpilation pipeline (#13719)atomic_evolution (#13603)Register and Bit (#13841)translation stage always outputs ISA circuits (#13792)BasicSimulator.run_experiment (#13750)show_idle and show_barrier in favor of idle_wires and plot_barriers (#13602)idle_wires default flipped to False in all circuit drawers (#13865)stretch variable support to QuantumCircuit. (#13852)BasePass.__call__ to PassManager.run (#13820)box (#13869)+, -, *, / operators for classical expressions. (#13850)SparseObservable evolution (#13836)SparseObservable.compose (#13766)SparseObservable (#13694)ContractIdleWiresInControlFlow optimisation pass (#13779)BooleanExpression on tweedledum (#13769)default routing stage plugin (#13802)default translation stage plugin (#13794)QuantumCircuit.noop for instructionless qubit use (#13774)get_control_flow_name_mapping function (#13472)max_block_width to CollectLinearFunctions and CollectClifford passes (#13661)BitArray into boolean array (#13653)collect_from_back to CollectMultiQBlocks (#13612)StabilizerState.expectation_value can also accept SparsePauliOp (#13539)idle_wires default flipped to False in all circuit drawers (#13865)BasePass.__call__ to PassManager.run (#13820)DAGCircuit::control_flow_op_nodes (#13892)default routing stage plugin (#13802)QuantumCircuit (#13893)property_set kwarg to BasePassManger.run (#13821)translation stage always outputs ISA circuits (#13792)default translation stage plugin (#13794)BlueprintCircuit.copy_empty_like return an empty QuantumCircuit (#13782)BackendV1 elements, including base class, providers.models and qobj modules (#13793)classical_function module and all tweedledum-related code (#13815)BackendProperties (BackendV1) in transpiler pipeline (#13722)assemble and assembler module (#13748)BasicSimulator (#13743)CXCancellation (deprecated in 1.1) (#13426)generate_basis_approximations (#13517)BasePass.__call__ to PassManager.run (#13820)ConsolidateBlocks transpiler pass (#13884)ParameterExpression (backport #13890) (#13943)ParameterExpression (#13890)DAGCircuit.name in ApplyLayout (#13910) (#13920)DAGCircuit.name in ApplyLayout (#13910)PyGate and PyInstruction (#13777)unit in Delay comparisons (#13816) (#13827)unit in Delay comparisons (#13816)SabreSwap (#13790)CommutationChecker for 2q Pauli rotations (#13762) (#13804)CommutationChecker for 2q Pauli rotations (#13762)random_clifford (#13606) (#13710)CommutationChecker (#13670) (#13676)CommutationChecker (#13600) (#13677)CommutationChecker (#13670)PauliEvolutionGate (using product formulas) for all-identity Pauli terms (#13634) (#13658)PauliEvolutionGate (using product formulas) for all-identity Pauli terms (#13634)UnitarySynthesis pass bug when target contains global gates (#13651) (#13656)Target.instruction_supported when target.num_qubits == None (#13655) (#13657)Target.instruction_supported when target.num_qubits == None (#13655)UnitarySynthesis pass bug when target contains global gates (#13651)pauli_list.insert(..., qubit=True) for length-1 pauli_list (#13624) (#13637)pauli_list.insert(..., qubit=True) for length-1 pauli_list (#13624)CommutationChecker (#13600)UnitarySynthesis for 3+ qubits when compiled for a backend (#13591) (#13619)MCMTGate (#13596) (#13618)UnitarySynthesis for 3+ qubits when compiled for a backend (#13591)MCMTGate (#13596)random_clifford (#13606)SparsePauliOp initialization with dense Y labels (#13580) (#13611)SparsePauliOp initialization with dense Y labels (#13580)assign_parameters (#13557) (#13559)assign_parameters (#13557).decompose on control flow (#13545) (#13549).decompose on control flow (#13545)global_phase parameters when creating CircuitData (#13538) (#13541)global_phase parameters when creating CircuitData (#13538)add_control (#13475) (#13528)add_control (#13475)InverseCancellation to run in classical blocks (#13454) (#13496)InverseCancellation to run in classical blocks (#13454)NLocal(..., flatten=True) and standard gates (#13482) (#13495)NLocal(..., flatten=True) and standard gates (#13482)SparsePauliOp.to_matrix (#13439) (#13440)SparsePauliOp.to_matrix (#13439)Fix stack-overflow segfault in OpenQASM 2 expression parsers
Fix control flow register mapping in BasisTranslator
BasisTranslator (#15156)Fix ApplyLayout with empty layout (backport #14606)
ApplyLayout with empty layout (backport #14606) (#14615)ElidePermutations pass in the presence of PermutationGates (#14603) (#14622)preserve_order=False (backport #14539) (#14547)Var and Stretch (backport #14488) (#14493)quantum_or.py (backport #14436) (#14477)Bug fixes in Solovay Kitaev Decomposition (backport #14217)
MCMTGate (#14096) (#14325)SolovayKitaevSynthesis plugin (#14304) (#14312)SabreLayout (backport #14186) (#14190)BasisTranslator Pass (backport #14078) (#14091)DAGCircuit variable IO nodes (backport #14041) (#14043)Introduce custom sympy srepr parser [stable/1.4]
generate_basis_approximations (#13517) (#13964)Fix qpy serialization of substitution of type ParameterExpression (backport #13890)
ParameterExpression (backport #13890) (#13943)DAGCircuit.name in ApplyLayout (#13910) (#13920)Address BackendV1 deprecation warning oversights
Release notes: https://docs.quantum.ibm.com/api/qiskit/release-notes/1.4#140
dag in DAGNode constructor is deprecated (#13862)qiskit.circuit.classicalfunction (#13786)BackendProperties (BackendV1) in transpilation pipeline (#13719)atomic_evolution (#13603)Register and Bit (#13841)BasicSimulator.run_experiment (#13750)show_idle and show_barrier in favor of idle_wires and plot_barriers (#13602)property_set kwarg to BasePassManger.run (#13821)unit in Delay comparisons (#13816) (#13827)CommutationChecker for 2q Pauli rotations (#13762) (#13804)random_clifford (#13606) (#13710)CommutationChecker (#13670) (#13676)CommutationChecker (#13600) (#13677)PauliEvolutionGate (using product formulas) for all-identity Pauli terms (#13634) (#13658)UnitarySynthesis pass bug when target contains global gates (#13651) (#13656)Target.instruction_supported when target.num_qubits == None (#13655) (#13657)pauli_list.insert(..., qubit=True) for length-1 pauli_list (#13624) (#13637)UnitarySynthesis for 3+ qubits when compiled for a backend (#13591) (#13619)MCMTGate (#13596) (#13618)SparsePauliOp initialization with dense Y labels (#13580) (#13611)assign_parameters (#13557) (#13559).decompose on control flow (#13545) (#13549)global_phase parameters when creating CircuitData (#13538) (#13541)add_control (#13475) (#13528)Applying a slight perturbation for ill-conditioned matrices
unit in Delay comparisons (#13816) (#13827)CommutationChecker for 2q Pauli rotations (#13762) (#13804)random_clifford (#13606) (#13710)Fix 4-pi periodicity of controlled rotations in the CommutationChecker
CommutationChecker (#13670) (#13676)CommutationChecker (#13600) (#13677)PauliEvolutionGate (using product formulas) for all-identity Pauli terms (#13634) (#13658)UnitarySynthesis pass bug when target contains global gates (#13651) (#13656)Target.instruction_supported when target.num_qubits == None (#13655) (#13657)pauli_list.insert(..., qubit=True) for length-1 pauli_list (#13624) (#13637)UnitarySynthesis for 3+ qubits when compiled for a backend (#13591) (#13619)MCMTGate (#13596) (#13618)SparsePauliOp initialization with dense Y labels (#13580) (#13611)Discard cache for standard gates in assign_parameters
assign_parameters (#13557) (#13559).decompose on control flow (#13545) (#13549)global_phase parameters when creating CircuitData (#13538) (#13541)add_control (#13475) (#13528)Deprecate loose custom basis gates in preset pm pipieline
Release notes: https://docs.quantum.ibm.com/api/qiskit/release-notes/1.3
qiskit.result.mitigation (#13351)BasicSimulator.configuration (#13367)instruction_durations, timing_constraints and backend_properties (#13338)PassManagerConfig.from_backend (#12931)StochasticSwap and suggests the use of SabreSwap (#12983)qiskit.providers.models (backport #12629) (#12864)qiskit.providers.models (#12629)PauliEvolutionGate (#13301)NLocal & family (#13310)grover_operator function (#13365)SparseObservable (#13370)PauliEvolutionGate for Rustiq & port it to Rust (#13295)SparsePauliOp.from_operator (#11557)SparseObservable.apply_layout (#13372)Pauli.to_label (#13379)SparseObservable (#13298)SparseObservable (#12671)__eq__ for remaining standard-library gates except mcx (#13327)QuantumCircuit.decompose for high-level objects (#13311)MCMTGate & plugins (#13150)ElidePermutations transpiler pass to Rust (#13094)qasm3.CustomGate accessible from Python space (#13187)PauliFeatureMap (#13045)rzz and cp (#13019)CONTROL_FLOW_OP_NAMES to public API (#13057)DAGCircuit to Rust (#12550)synth_cz_depth_line_mr to Rust (#12949)HighLevelSynthesis (#12911)star_preroute to rust (backport #12761) (#12846)star_preroute to rust (#12761)AnnotatedOperation.params and fix some control issues (#12752) (#12828)AnnotatedOperation.params and fix some control issues (#12752)DAGCircuit to Rust (#12550)routing_method to sabre (#12806) (#12847)routing_method to sabre (#12806)InverseCancellation to run in classical blocks (#13454) (#13496)NLocal(..., flatten=True) and standard gates (#13482) (#13495)SparsePauliOp.to_matrix (#13439) (#13440)assume_unitary to Operator.power. (#13319)QuantumCircuit.assign_parameters (#13337)basis_gates in BasicSimulator configuration (#13385)gate definitions following a shadowed built-in gate (#13340)QuantumCircuit.decompose for high-level objects (#13311)Split2QUnitaries to run on UnitaryGate (#13095)HoareOptimizer (#13083)node.op in Split2QUnitaries (#13015)UnitaryGate.repeat() method (#12986)DAGCircuit to Rust (#12550)TwoQubitBasisDecomposer for non-standard KAK gate (#13014)from_backend method of InstructionDurations to support both BackendV1 and BackendV2 (#12941)seed_transpiler in generate_preset_pass_manager (#12980)SparsePauliOp.paulis.phase stays zero (#12884)PadDynamicalDecoupling (#12952) (#12954)PadDynamicalDecoupling (#12952)basis_gates argument (#12945) (#12946)basis_gates argument (#12945)Estimator and StatevectorEstimator (#12862)StatevectorSampler to raise an error if a circuit with c_if is passed (#12842) (#12851)StatevectorSampler to raise an error if a circuit with c_if is passed (#12842)BitArray.{slice_bits,slice_shots,__getitem__} raise IndexError when indices are not valid (#12755) (#12845)BitArray.{slice_bits,slice_shots,__getitem__} raise IndexError when indices are not valid (#12755)AnnotatedOperation.params and fix some control issues (#12752) (#12828)AnnotatedOperation.params and fix some control issues (#12752)BitArray.from_counts/from_samples to not fail for input with only 0 outcome and num_bits=None (#12800) (#12820)BitArray.from_counts/from_samples to not fail for input with only 0 outcome and num_bits=None (#12800)HLS fix to not synthesize instructions already supported
SparsePauliOp.to_matrix (#13439) (#13440)ConsolidateBlocks behavior (#13450) (#13453)Deprecate loose custom basis gates in preset pm pipieline
qiskit.result.mitigation (#13351)BasicSimulator.configuration (#13367)instruction_durations, timing_constraints and backend_properties (#13338)PassManagerConfig.from_backend (#12931)StochasticSwap and suggests the use of SabreSwap (#12983)qiskit.providers.models (backport #12629) (#12864)qiskit.providers.models (#12629)PauliEvolutionGate (#13301)NLocal & family (#13310)grover_operator function (#13365)SparseObservable (#13370)PauliEvolutionGate for Rustiq & port it to Rust (#13295)SparsePauliOp.from_operator (#11557)SparseObservable.apply_layout (#13372)Pauli.to_label (#13379)SparseObservable (#13298)SparseObservable (#12671)__eq__ for remaining standard-library gates except mcx (#13327)QuantumCircuit.decompose for high-level objects (#13311)MCMTGate & plugins (#13150)ElidePermutations transpiler pass to Rust (#13094)qasm3.CustomGate accessible from Python space (#13187)PauliFeatureMap (#13045)rzz and cp (#13019)CONTROL_FLOW_OP_NAMES to public API (#13057)DAGCircuit to Rust (#12550)synth_cz_depth_line_mr to Rust (#12949)HighLevelSynthesis (#12911)star_preroute to rust (backport #12761) (#12846)star_preroute to rust (#12761)AnnotatedOperation.params and fix some control issues (#12752) (#12828)AnnotatedOperation.params and fix some control issues (#12752)DAGCircuit to Rust (#12550)routing_method to sabre (#12806) (#12847)routing_method to sabre (#12806)assume_unitary to Operator.power. (#13319)QuantumCircuit.assign_parameters (#13337)basis_gates in BasicSimulator configuration (#13385)gate definitions following a shadowed built-in gate (#13340)QuantumCircuit.decompose for high-level objects (#13311)Split2QUnitaries to run on UnitaryGate (#13095)HoareOptimizer (#13083)node.op in Split2QUnitaries (#13015)UnitaryGate.repeat() method (#12986)DAGCircuit to Rust (#12550)TwoQubitBasisDecomposer for non-standard KAK gate (#13014)from_backend method of InstructionDurations to support both BackendV1 and BackendV2 (#12941)seed_transpiler in generate_preset_pass_manager (#12980)SparsePauliOp.paulis.phase stays zero (#12884)PadDynamicalDecoupling (#12952) (#12954)PadDynamicalDecoupling (#12952)basis_gates argument (#12945) (#12946)basis_gates argument (#12945)Estimator and StatevectorEstimator (#12862)StatevectorSampler to raise an error if a circuit with c_if is passed (#12842) (#12851)StatevectorSampler to raise an error if a circuit with c_if is passed (#12842)BitArray.{slice_bits,slice_shots,__getitem__} raise IndexError when indices are not valid (#12755) (#12845)BitArray.{slice_bits,slice_shots,__getitem__} raise IndexError when indices are not valid (#12755)AnnotatedOperation.params and fix some control issues (#12752) (#12828)AnnotatedOperation.params and fix some control issues (#12752)BitArray.from_counts/from_samples to not fail for input with only 0 outcome and num_bits=None (#12800) (#12820)BitArray.from_counts/from_samples to not fail for input with only 0 outcome and num_bits=None (#12800)Deprecates StochasticSwap and suggests the use of SabreSwap
StochasticSwap and suggests the use of SabreSwap (#12983)qiskit.providers.models (backport #12629) (#12864)qiskit.providers.models (#12629)rzz and cp (#13019)CONTROL_FLOW_OP_NAMES to public API (#13057)DAGCircuit to Rust (#12550)star_preroute to rust (backport #12761) (#12846)star_preroute to rust (#12761)AnnotatedOperation.params and fix some control issues (#12752) (#12828)AnnotatedOperation.params and fix some control issues (#12752)DAGCircuit to Rust (#12550)routing_method to sabre (#12806) (#12847)routing_method to sabre (#12806)Split2QUnitaries to run on UnitaryGate (#13095)HoareOptimizer (#13083)node.op in Split2QUnitaries (#13015)UnitaryGate.repeat() method (#12986)DAGCircuit to Rust (#12550)TwoQubitBasisDecomposer for non-standard KAK gate (#13014)from_backend method of InstructionDurations to support both BackendV1 and BackendV2 (#12941)SparsePauliOp.paulis.phase stays zero (#12884)PadDynamicalDecoupling (#12952) (#12954)PadDynamicalDecoupling (#12952)basis_gates argument (#12945) (#12946)basis_gates argument (#12945)Estimator and StatevectorEstimator (#12862)StatevectorSampler to raise an error if a circuit with c_if is passed (#12842) (#12851)StatevectorSampler to raise an error if a circuit with c_if is passed (#12842)BitArray.{slice_bits,slice_shots,__getitem__} raise IndexError when indices are not valid (#12755) (#12845)BitArray.{slice_bits,slice_shots,__getitem__} raise IndexError when indices are not valid (#12755)AnnotatedOperation.params and fix some control issues (#12752) (#12828)AnnotatedOperation.params and fix some control issues (#12752)BitArray.from_counts/from_samples to not fail for input with only 0 outcome and num_bits=None (#12800) (#12820)BitArray.from_counts/from_samples to not fail for input with only 0 outcome and num_bits=None (#12800)Fix bug in QPY symengine payload version handling (backport #13259)
> This release was yanked from PyPI due to a bug in its only changed behaviour. The release is kept here for posterity, but there is little reason to
[!WARNING] This release was yanked from PyPI due to a bug in its only changed behaviour. The release is kept here for posterity, but there is little reason to use this.
Don't run ElidePermutation if routing is disabled
Fix an edge case in Sabre's release valve
Split2QUnitaries to run on UnitaryGate (#13095) (#13097)HoareOptimizer (#13083) (#13087)node.op in Split2QUnitaries (backport #13015) (#13062)TwoQubitBasisDecomposer for non-standard KAK gate (#13014) (#13026)from_backend method of InstructionDurations to support both BackendV1 and BackendV2 (#12941) (#13009)Initialize.gates_to_uncompute method (#12976) (#13000)seed_transpiler in generate_preset_pass_manager (backport #12980) (#12996)normalize in StatePreparation (#12988) (#12992)copy argument to __array__ (#12979) (#12987)Deprecate BackendV1 and qiskit.providers.models (backport #12629)
Release notes: https://docs.quantum.ibm.com/api/qiskit/release-notes/1.2
qiskit.providers.models (backport #12629) (#12864)ProductFormula synthesizers (#12724)justify input, in circuit_drawer (#12458)CircuitInstruction (#12640)star_preroute to rust (backport #12761) (#12846)AnnotatedOperation.params and fix some control issues (#12752) (#12828)generate_preset_pass_manager to a standalone file (#12762)synth_permutation_depth_lnn_kms to Rust (#12746)synth_clifford_bm to Rust. (#12714)ProductFormula synthesizers (#12724)synth_cnot_count_full_pmh (#12588)synth_clifford_greedy to Rust (#12601)synth_permutation_acg (#12543)quantum_causal_cone method in python (#12668)idle_wires in circuit drawer (#12462)transpile() and generate_preset_pass_manager to convert loose input of constraints to a Target with Target.from_configuration() (#12185)DenseLayout trial to SabreLayout (#12453)routing_method to sabre (#12806) (#12847)PadDynamicalDecoupling (#12952) (#12954)basis_gates argument (#12945) (#12946)StatevectorSampler to raise an error if a circuit with c_if is passed (#12842) (#12851)BitArray.{slice_bits,slice_shots,__getitem__} raise IndexError when indices are not valid (#12755) (#12845)AnnotatedOperation.params and fix some control issues (#12752) (#12828)BitArray.from_counts/from_samples to not fail for input with only 0 outcome and num_bits=None (#12800) (#12820)order kwarg in BitArray.from_bool_array() (#12686)Estimator calculates stds (#12670)C3SXGate to_matrix method (#12742)synth_cnot_count_full_pmh (#12588)replace_block_with_op on operations with wrong number of qubits (#12637)parameters cache on circuit copy (#12619)QuantumCircuit.depth with zero-operands and Expr nodes (#12429)Target.has_calibration for instruction without properties (#12526)__array__ for qasm2._DefinedGate (#12119)PassManager in serial contexts (#12410) (#12413)PassManager in serial contexts (#12410)SparsePauliOp.apply_layout (#12375) (#12402)SparsePauliOp.apply_layout (#12375)Commuting2qGateRouter (#12137) (#12383)Commuting2qGateRouter (#12137)Deprecate BackendV1 and qiskit.providers.models (backport #12629)
qiskit.providers.models (backport #12629) (#12864)ProductFormula synthesizers (#12724)justify input, in circuit_drawer (#12458)CircuitInstruction (#12640)star_preroute to rust (backport #12761) (#12846)AnnotatedOperation.params and fix some control issues (#12752) (#12828)generate_preset_pass_manager to a standalone file (#12762)synth_permutation_depth_lnn_kms to Rust (#12746)synth_clifford_bm to Rust. (#12714)ProductFormula synthesizers (#12724)synth_cnot_count_full_pmh (#12588)synth_clifford_greedy to Rust (#12601)synth_permutation_acg (#12543)quantum_causal_cone method in python (#12668)idle_wires in circuit drawer (#12462)transpile() and generate_preset_pass_manager to convert loose input of constraints to a Target with Target.from_configuration() (#12185)DenseLayout trial to SabreLayout (#12453)routing_method to sabre (#12806) (#12847)StatevectorSampler to raise an error if a circuit with c_if is passed (#12842) (#12851)BitArray.{slice_bits,slice_shots,__getitem__} raise IndexError when indices are not valid (#12755) (#12845)AnnotatedOperation.params and fix some control issues (#12752) (#12828)BitArray.from_counts/from_samples to not fail for input with only 0 outcome and num_bits=None (#12800) (#12820)order kwarg in BitArray.from_bool_array() (#12686)Estimator calculates stds (#12670)C3SXGate to_matrix method (#12742)synth_cnot_count_full_pmh (#12588)replace_block_with_op on operations with wrong number of qubits (#12637)parameters cache on circuit copy (#12619)QuantumCircuit.depth with zero-operands and Expr nodes (#12429)Target.has_calibration for instruction without properties (#12526)__array__ for qasm2._DefinedGate (#12119)PassManager in serial contexts (#12410) (#12413)PassManager in serial contexts (#12410)SparsePauliOp.apply_layout (#12375) (#12402)SparsePauliOp.apply_layout (#12375)Commuting2qGateRouter (#12137) (#12383)Commuting2qGateRouter (#12137)Fix dag visualization with Var wires
BitArray.{slice_bits,slice_shots,__getitem__} raise IndexError when indices are not valid (backport #12755) (#12844)BitArray.from_counts/from_samples to not fail for input with only 0 outcome and num_bits=None (#12800) (#12821)C3SXGate to_matrix method (backport #12742) (#12745)replace_block_with_op on operations with wrong number of qubits (#12637) (#12700)parameters cache on circuit copy (backport #12619) (#12621)Fix a bug in isometry.rs (backport #12469)
__array__ for qasm2._DefinedGate (backport #12119) (https://github.com/Qiskit/qiskit/pull/12523)Target.has_calibration for instruction without properties (backport #12526) (https://github.com/Qiskit/qiskit/pull/12527)QuantumCircuit.depth with zero-operands and Expr nodes (backport #12429) (https://github.com/Qiskit/qiskit/pull/12528)ParameterVector (backport #12561) (https://github.com/Qiskit/qiskit/pull/12565)Deprecating Provider ABC, as abstraction is not very useful
Release notes: https://docs.quantum.ibm.com/api/qiskit/release-notes/1.1#110
Var throughout transpiler (#12322)Vars in OQ3 exporter (#12308)Var to visualisers (#12307)Var in circuit-substitution methods (#12215)expr.Var to DAGCircuit (#12204)expr.Var in QPY (#11651)SparsePauliOp.to_matrix and Miri tests (#11388)show_idle and show_barrier to idle_wires and plot_barriers (#11878)NLocal (#12099)two_local.py (#12009).apply_layout()method to Pauli class (#12066)QuantumVolume (#12097)copy keyword argument to QuantumCircuit.append (#12098)transpile with BackendV2 (#12042)PauliList.noncommutation_graph in public API (#11795)Schedule/ScheduleBlock doable through parameter name (#12088)transpile() to convert BackendV1 inputs to BackendV2 with BackendV2Converter (#11996)QuantumVolume (#12097)Pauli.evolve(QuantumCircuit) (#12095)init plugin was not properly raising when called with an invalid optimization level (#12170)copy keyword argument to QuantumCircuit.append (#12098)transpile with BackendV2 (#12042)qDRIFT synthesis (#11321)EquivalenceLibrary.set_entry (#11959)Instruction.repeat with conditionals (#11940)qcstyle that modified custom style dict (#11874)PropertySet re-use in BasePassManager.run (#11787)PassManager in serial contexts (#12410)SparsePauliOp.apply_layout (#12375)QuantumCircuit.compose with Index exprs (#12396)Commuting2qGateRouter (#12137)Deprecating Provider ABC, as abstraction is not very useful
Var throughout transpiler (#12322)Vars in OQ3 exporter (#12308)Var to visualisers (#12307)Var in circuit-substitution methods (#12215)expr.Var to DAGCircuit (#12204)expr.Var in QPY (#11651)SparsePauliOp.to_matrix and Miri tests (#11388)show_idle and show_barrier to idle_wires and plot_barriers (#11878)NLocal (#12099)two_local.py (#12009).apply_layout()method to Pauli class (#12066)QuantumVolume (#12097)copy keyword argument to QuantumCircuit.append (#12098)transpile with BackendV2 (#12042)PauliList.noncommutation_graph in public API (#11795)Schedule/ScheduleBlock doable through parameter name (#12088)transpile() to convert BackendV1 inputs to BackendV2 with BackendV2Converter (#11996)QuantumVolume (#12097)Pauli.evolve(QuantumCircuit) (#12095)init plugin was not properly raising when called with an invalid optimization level (#12170)copy keyword argument to QuantumCircuit.append (#12098)transpile with BackendV2 (#12042)qDRIFT synthesis (#11321)EquivalenceLibrary.set_entry (#11959)Instruction.repeat with conditionals (#11940)qcstyle that modified custom style dict (#11874)PropertySet re-use in BasePassManager.run (#11787)Release notes: https://docs.quantum.ibm.com/api/qiskit/release-notes/1.0
Release notes: https://docs.quantum.ibm.com/api/qiskit/release-notes/1.0
BindingsArray in EstimatorPub.coerce() (#11871) (https://github.com/Qiskit/qiskit/pull/11881)StatevectorEstimator.default_precision (#11910) (https://github.com/Qiskit/qiskit/pull/11918)EquivalenceLibrary.set_entry (#11959) (https://github.com/Qiskit/qiskit/pull/11962)Qiskit 1.0.2 is a minor bugfix release for the 1.0 series.
Fixed an issue with convert_to_target() where the converter would incorrectly ignore control flow instructions if they were specified in the BackendConfiguration.supported_instructions attribute, which is the typical location that control flow instructions are specified in a BackendConfiguration object. Fixed #11872 .
Calling EquivalenceLibrary.set_entry() will now correctly update the internal graph object of the library. Previously, the metadata would be updated, but the graph structure would be unaltered, meaning that users like BasisTranslator would still use the old rules. Fixed #11958 .
The EvolvedOperatorAnsatz now correctly handles the case where the operators argument is an empty list. Previously, this would result in an error.
Fixed a consistency issue with EvolvedOperatorAnsatz instances with zero qubits. Previously, such instances would contain a single QuantumRegister in qregs with zero qubits, but now no registers are created. This behavior aligns more consistently with its superclass QuantumCircuit .
Fixed a crash in convert_to_target() which would occur when qubit properties (either T1, T2 or frequency) were missing. The missing property values in QubitProperties are now filled with None .
Fixed a performance issue in the qpy.load() function when deserializing QPY payloads with large numbers of qubits or clbits in a circuit.
Fixed a bug where EstimatorPub.coerce() and SamplerPub.coerce() improperly handled a parameter of type BindingsArray . Previously a ValueError exception was falsely raised.
The preset pass managers used by transpile() will no longer fail on circuits with control flow when no hardware target or basis-gate set is specified. They will now treat such abstract targets as permitting all control-flow operations. Fixed #11906 .
Fixed coerce() so that it returns a 0-d array when the input is a single, unnested observable. Previously, it erroneously upgraded to a single dimension, with shape (1,) .
Parameter was updated so that instances that compare equal always have the same hash. Previously, only the Parameter.uuid was compared, so Parameter instances with different names could compare equal if they had been constructed using a common value for the uuid parameter (which is usually not passed explicitly).
Fixed bug in QuantumCircuit.draw() that was causing custom style dictionaries for the Matplotlib drawer to be modified upon execution.
Release notes: https://docs.quantum.ibm.com/api/qiskit/release-notes/1.0
Release notes: https://docs.quantum.ibm.com/api/qiskit/release-notes/1.0
PropertySet re-use in BasePassManager.run (#11787)Qiskit 1.0.1 is a patch release fixing a small number of bugs identified in the Qiskit 1.0.0 release.
Fixed a bug in the conversion of custom pulse instructions to the legacy qiskit.qobj format. The bug was introduced in Qiskit 1.0.0 and caused conversion of instructions with custom pulse shapes to raise an error. After the fix, the conversion is carried out correctly, and the custom pulse is converted to a pulse.Waveform as it should. Fixed #11828 .
Fixed an issue in the InverseCancellation transpiler pass where in some cases it would incorrectly cancel a self-inverse parameterized gate even if the parameter value didn’t match. Fixed #11815 .
BasePassManager.run() will no longer leak the previous PropertySet into new workflows when called more than once. Previously, the same PropertySet as before would be used to initialize follow-on runs, which could mean that invalid property information was being given to tasks. The behavior now matches that of Qiskit 0.44. Fixed #11784 .
A bug has been fixed in convert_durations_to_dt() where the function assumed its inputs were all in seconds, rather than reading the actual unit. This could lead to wrong orders of magnitude in the reported circuit durations.
Add qpy deprecation warning class
Release notes: https://docs.quantum.ibm.com/api/qiskit/release-notes/1.0
switch (#11417)BasicAer to BasicProvider and refactor interface to follow BackendV2 (#11422)CommutativeInverseCancellation to cancel pairs of gates up-to-phase (#11248)SparsePauliOp.from_operator (#11133)QuantumCircuit.assign_parameters (#11432)QuantumCircuit.get_parameter to retrieve by name (#11431)ParameterExpression.numeric to cast to number (#11109)QuantumCircuit.append validates captures in control-flow (#10974)Var nodes (#10944)QuantumCircuit._data and intern CircuitInstruction args (#10827)Measure and Reset instructions (#11170)gate.inverse() to return AnnotatedOperation (#11593)gate.control() to return AnnotatedOperation (#11433)Operator.power (#11534)approximation_degree default in generate_preset_pass_maanger (#11695)qiskit metapackage with qiskit-terra (#11271)FakeProvider class and related tools in 1.0 (#11376)BasicAer to BasicProvider and refactor interface to follow BackendV2 (#11422)Aer and imports from qiskit.providers.aer (#11442)qiskit.extensions (#11488)ConfigurableFakeBackend (#11568)qiskit.test (#11445)iqp the matplotlib default style (#11536)classicalfunction imports (#11486)QuantumCircuit.bind_parameters (#11434)opflow module, QuantumInstance and related utils (#11111)IntegerComparator.num_ancilla_qubits (#11306)0.23 (qiskit.visualization.pulse) (#11213)qiskit.algorithms module (#11086)qargs=None in DAG appends (#11190)qiskit.test (#10998)ScalableSymbolicPulse (#11403)QuantumCircuit.delay (#11447)QuantumCircuit.compose (#11451)InstructionDurations from backend (#11501)BlueprintCircuits (#11456)TemplateOptimization returns native-symbolic objects (#11107)Instruction.condition_bits for runtime classical expressions (#11325)QuantumCircuit.barrier argument conversion (#11272)Channel.__hash__ in multiprocessing contexts (#11251)BlueprintCircuit._append (#11181)Optimizer in AQC (#11099)We are very pleased to release Qiskit 1.0.0. This release is the culmination of 7 years of development to mature Qiskit into a stable, high- performance SDK for quantum computing, and is the start of a new era for the Qiskit project and community. Besides general performance and stability improvements, the most significant changes with the 1.0.0 release relate to the stability policy, release cycles, and versioning. Qiskit is now formally using semantic versioning , and this means that, for the entire lifecycle of the 1.x release series, the project is committed to maintaining backwards compatibility in its public documented APIs. We’re also now starting to offer bugfix support for major versions, so that you continue to have a supported branch for 6 months after the release of the next major version. This starts now with the 1.x and 0.x major series: the 0.46.x release will continue to be supported, with periodic patch releases that contain bug fixes, for 6 months after the release of 1.0. That is, 0.46.x will be supported until 2024-08. You can see the full details of the new policy here:
start/install#qiskit-versioning
Also of key importance in this release is the change in packaging. Since the Qiskit 0.7 release in 2018-12, when Qiskit introduced its elements model, the qiskit package you would install has been a meta-package (or package of packages) that installs the combined elements comprising Qiskit. As announced in previous releases (for more details see the 0.44.0 , 0.45.3 , and 0.46.0 release notes, along with this blog post ) with the 1.0 release we’re completing a transition to have a single qiskit package exposing only the core SDK (what was previously qiskit-terra ). This means that for releases >= 1.0.0, we have stopped using the qiskit-terra package and will only be publishing qiskit . As this change in packaging structure is not fully supported by the Python package installer pip , it is not possible to just use pip install -U qiskit to upgrade from qiskit 0.46.0 to 1.0.0. It is strongly recommended that to upgrade to Qiskit 1.0.0 you create a separate virtual environment to isolate the installation. There is a detailed migration guide that explains the packaging changes and how to install Qiskit 1.0.0 in different scenarios which can be found here:
https://qisk.it/1-0-packaging-migration
As with all of our major releases, Qiskit 1.0.0 also has a plethora of new features, the highlights for this release are:
The QuantumCircuit class’s internal data structure has been rewritten in Rust to greatly improve the memory efficiency of the QuantumCircuit objects by caching the arguments of the instructions.
A new version of the primitives interface definition in qiskit.primitives with the BaseSamplerV2 and BaseEstimatorV2 abstract classes. This new version of the interface adds support for performing vectorized calls to the primitive so that sweeps over parameter value sets and observables can be efficiently specified.
A new experimental native OpenQASM 3 parser qiskit.qasm3.loads_experimental() and qiskit.qasm3.load_experimental() . This new parser is still under development and still has several limitations and is still experimental. However, for where it is usable, the new parser is significantly faster and has better diagnostic error message that allows to debug where an OpenQASM 3 program is invalid. This new parser is written in Rust and based on a newly developed Rust library for parsing OpenQASM3 which can be found here: https://github.com/Qiskit/openqasm3_parser
Finally, the Qiskit 1.0.0 release was an opportunity to clean up some technical debt accumulated over the past 7 years of development. You’ll notice that the Qiskit 1.0.0 release is virtually free of DeprecationWarning s being emitted, and, at the same time, the upgrade section of the 1.0.0 release notes is longer than usual. These are direct consequences of the technical debt cleanup. To help with the migration from 0.46.x to 1.0.0, besides the release notes, we have also published a dedicated migration guide which can be found here:
Qiskit 1.0 feature changes
This guide is meant to complement the release notes and have a targeted advice for how to migrate the API changes after the removal of the deprecated functionality from the 0.46.0 release.
Added a new argument, annotated , to the methods QuantumCircuit.inverse() , circuit.Instruction.inverse() and .inverse() methods of Instruction subclasses (such as SwapGate or SGate ) to optionally return an AnnotatedOperation . The default value of annotated is False and corresponds to the pre-existing behavior of the method. Furthermore, for standard gates with an explicitly defined inverse method, the argument annotated has no effect, for example, both:
SwapGate (). inverse (annotated = False ) SwapGate (). inverse (annotated = True )
return a SwapGate , and both:
SGate (). inverse (annotated = False ) SGate (). inverse (annotated = True )
return an SdgGate . The difference manifests for custom instructions without an explicitly defined inverse. With annotated=False , the method returns a fresh instruction with the recursively inverted definition, just as before. While annotated=True returns an AnnotatedOperation that represents the instruction modified with the InverseModifier .
Added a commutation library to the CommutationChecker . This library stores all the commutation relations of unparameterizable standard gates into a dictionary that allows for efficient lookup at runtime. This speeds up the execution of the CommutationChecker class and, by extension, the CommutationAnalysis transpiler pass, as instead of computing whether two unparameterizable standard gates commute it just has to look it up from the library.
Additionally, the CommutationChecker was refactored and now has an upper limit set on the number of cached commutation relations that are not in the commutation library. This addressed: #8020 and #7101
QuantumCircuit.assign_parameters() now accepts string keys in the mapping form of input. These names are used to look up the corresponding Parameter instance using get_parameter() . This lets you do:
from qiskit . circuit import QuantumCircuit , Parameter a = Parameter ( "a" ) qc = QuantumCircuit ( 1 ) qc . rx (a, 0 ) qc . assign_parameters ({ "a" : 1 }) == qc . assign_parameters ({a: 1 })
QuantumCircuit has two new methods, get_parameter() and has_parameter() , which respectively retrieve a Parameter instance used in the circuit by name, and return a boolean of whether a parameter with a matching name (or the exact instance given) are used in the circuit.
A uuid property was added to the qiskit.circuit.Parameter class. In advanced use cases, this property can be used for creating qiskit.circuit.Parameter instances that compare equal to each other.
Added a new method, ParameterExpression.numeric() , which converts a fully bound parameter expression into the most restrictive built-in Python numeric type that accurately describes the result of the symbolic evaluation. For example, a symbolic integer will become an int , while a symbolic real number will become a float and a complex number will become a complex . This method includes several workarounds for peculiarities of the evaluation contexts of symengine , which can sometimes lead to spurious results when calling complex or float on an expression directly.
Version 2 of the primitives is introduced via a new base class for both the sampler and the estimator, along with new types for their inputs and outputs. The emphasis of this new version is on performing vectorized calls to the primitive run() methods, so that sweeps over parameter value sets and observables can be efficiently specified. See StatevectorSampler and StatevectorEstimator for reference implementations of the V2 primitives.
Moreover, the estimator has gained a precision argument in the run() method that specifies the targeted precision of the expectation value estimates. Analogously, the sampler has moved shots out of the options and into the arguments of the run() method. The sampler has also been changed to return the outputs (e.g. bitstrings) from every shot, rather than providing a Counts -like return, and also to store data from separate ClassicalRegister s . This enables derived classes to implement sampler support for circuits with classical control flow.
The primitive V2 base classes are:
BaseSamplerV2
BaseEstimatorV2
The new types which are used for inputs and outputs are:
SamplerPubLike : primitive unified bloc (PUB) of sampler inputs; a union type of allowed inputs to a sampler
EstimatorPubLike : Primitive unified bloc (PUB) of estimator inputs; a union type of allowed inputs to an estimator
PubResult : the data and metadata resulting from a single PUB’s execution
DataBin : A namespace to hold data from a single PUB’s execution
BitArray : an array-valued collection of bit values in a dense format
PrimitiveResult : an iterable of PubResult s along with metadata
The reference implementation StatevectorEstimator of BaseEstimatorV2 was added. As seen in the example below, this estimator (and all V2 estimators) supports providing arrays of observables and/or arrays of parameter value sets that are attached to particular circuits.
Each tuple of (circuit, observables, <optional> parameter values, <optional> precision) , called an estimator primitive unified bloc (PUB), produces its own array-based result. The run() method can be given many pubs at once.
from qiskit . circuit import Parameter , QuantumCircuit from qiskit . primitives import StatevectorEstimator from qiskit . quantum_info import Pauli , SparsePauliOp import matplotlib . pyplot as plt import numpy as np # Define a circuit with two parameters. circuit = QuantumCircuit ( 2 ) circuit . h ( 0 ) circuit . cx ( 0 , 1 ) circuit . ry ( Parameter ( "a" ), 0 ) circuit . rz ( Parameter ( "b" ), 0 ) circuit . cx ( 0 , 1 ) circuit . h ( 0 ) # Define a sweep over parameter values, where the second axis is over # the two parameters in the circuit. params = np . vstack ([ np. linspace ( - np.pi, np.pi, 100 ), np. linspace ( - 4 * np.pi, 4 * np.pi, 100 ) ]). T # Define three observables. Many formats are supported here including # classes such as qiskit.quantum_info.SparsePauliOp. The inner length-1 # lists cause this array of observables to have shape (3, 1), rather # than shape (3,) if they were omitted. observables = [ [ SparsePauliOp ([ "XX" , "IY" ], [ 0.5 , 0.5 ]) ] , [ Pauli ( "XX" ) ] , [ Pauli ( "IY" ) ] ] # Instantiate a new statevector simulation based estimator object. estimator = StatevectorEstimator () # Estimate the expectation value for all 300 combinations of # observables and parameter values, where the pub result will have # shape (3, 100). This shape is due to our array of parameter # bindings having shape (100,), combined with our array of observables # having shape (3, 1) pub = (circuit , observables , params) job = estimator . run ([pub]) # Extract the result for the 0th pub (this example only has one pub). result = job . result () [ 0 ] # Error-bar information is also available, but the error is 0 # for this StatevectorEstimator. result . data . stds # Pull out the array-based expectation value estimate data from the # result and plot a trace for each observable. for idx , pauli in enumerate (observables): plt . plot (result.data.evs[idx], label = pauli) plt . legend ()
The reference implementation StatevectorSampler of BaseSamplerV2 was added. As seen in the example below, this sampler (and all V2 samplers) supports providing arrays of parameter value sets to bind against a single circuit.
Each tuple of (circuit, <optional> parameter values, <optional> shots) , called a sampler primitive unified bloc (PUB), produces its own array-based result. The run() method can be given many pubs at once.
from qiskit . circuit import ( Parameter , QuantumCircuit , ClassicalRegister , QuantumRegister ) from qiskit . primitives import StatevectorSampler import matplotlib . pyplot as plt import numpy as np # Define our circuit registers, including classical registers # called 'alpha' and 'beta'. qreg = QuantumRegister ( 3 ) alpha = ClassicalRegister ( 2 , "alpha" ) beta = ClassicalRegister ( 1 , "beta" ) # Define a quantum circuit with two parameters. circuit = QuantumCircuit (qreg, alpha, beta) circuit . h ( 0 ) circuit . cx ( 0 , 1 ) circuit . cx ( 1 , 2 ) circuit . ry ( Parameter ( "a" ), 0 ) circuit . rz ( Parameter ( "b" ), 0 ) circuit . cx ( 1 , 2 ) circuit . cx ( 0 , 1 ) circuit . h ( 0 ) circuit . measure ([ 0 , 1 ], alpha) circuit . measure ([ 2 ], beta) # Define a sweep over parameter values, where the second axis is over. # the two parameters in the circuit. params = np . vstack ([ np. linspace ( - np.pi, np.pi, 100 ), np. linspace ( - 4 * np.pi, 4 * np.pi, 100 ) ]). T # Instantiate a new statevector simulation based sampler object. sampler = StatevectorSampler () # Start a job that will return shots for all 100 parameter value sets. pub = (circuit , params) job = sampler . run ([pub], shots = 256 ) # Extract the result for the 0th pub (this example only has one pub). result = job . result () [ 0 ] # There is one BitArray object for each ClassicalRegister in the # circuit. Here, we can see that the BitArray for alpha contains data # for all 100 sweep points, and that it is indeed storing data for 2 # bits over 256 shots. assert result . data . alpha . shape == ( 100 , ) assert result . data . alpha . num_bits == 2 assert result . data . alpha . num_shots == 256 # We can work directly with a binary array in performant applications. raw = result . data . alpha . array # For small registers where it is anticipated to have many counts # associated with the same bitstrings, we can turn the data from, # for example, the 22nd sweep index into a dictionary of counts. counts = result . data . alpha . get_counts ( 22 ) # Or, convert into a list of bitstrings that preserve shot order. bitstrings = result . data . alpha . get_bitstrings ( 22 ) print (bitstrings)
Added a new class, GenericBackendV2 , to the qiskit.providers.fake_provider module. This class is configurable, and builds a BackendV2 backend instance that can be run locally (in the spirit of fake backends). Users can configure the number of qubits, basis gates, coupling map, ability to run dynamic circuits (control flow instructions), instruction calibrations and measurement timestep of the backend without having to deal with manual target construction. Qubit and gate properties (duration, error) are generated by randomly sampling from default ranges. The seed for this random generation can be fixed to ensure the reproducibility of the backend output. It’s important to note that this backend only supports gates in the standard library. If you need a more flexible backend, there is always the option to directly instantiate a Target object to use for transpilation.
Example usage 1:
from qiskit import QuantumCircuit , transpile from qiskit . providers . fake_provider import GenericBackendV2 # Create a simple circuit circuit = QuantumCircuit ( 3 ) circuit . h ( 0 ) circuit . cx ( 0 , 1 ) circuit . cx ( 0 , 2 ) circuit . measure_all () circuit . draw ( 'mpl' ) # Define backend with 3 qubits backend = GenericBackendV2 (num_qubits = 3 ) # Transpile and run transpiled_circuit = transpile (circuit, backend) result = backend . run (transpiled_circuit). result ()
Example usage 2:
from qiskit import QuantumCircuit , ClassicalRegister , transpile from qiskit . providers . fake_provider import GenericBackendV2 # Create a circuit with classical control creg = ClassicalRegister ( 19 ) qc = QuantumCircuit ( 25 ) qc . add_register (creg) qc . h ( 0 ) for i in range ( 18 ): qc . cx ( 0 , i + 1 ) for i in range ( 18 ): qc . measure (i, creg[i]) with qc . if_test ((creg, 0 )): qc . ecr ( 20 , 21 ) # Define backend with custom basis gates and control flow instructions backend = GenericBackendV2 ( num_qubits = 25 , basis_gates = [ "ecr" , "id" , "rz" , "sx" , "x" ], control_flow = True , ) #Transpile transpiled_qc = transpile (qc, backend)
Note
The noise properties generated by these class do not mimic any concrete quantum device, and should not be used to measure any concrete behaviors. They are “reasonable defaults” that can be used to test backend-interfacing functionality not tied specific noise values of real quantum systems. For a more accurate simulation of existing devices, you can manually build a noise model from the real backend using the functionality offered in qiskit_aer .
The qiskit.providers.fake_provider module now includes a series of generic fake backends following the BackendV1 interface. They have been introduced as an alternative to the snapshot-based fake backends exposed in the deprecated FakeProvider ( FakeVigo , FakeTokyo , etc). The list of new fake backends includes:
Backends without pulse capabilities:
Fake5QV1
Fake20QV1
Backends with pulse capabilities:
Fake7QPulseV1
Fake27QPulseV1
Fake127QPulseV1
They can be imported following the pattern: from qiskit.providers.fake_provider import Fake5QV1 . More details on the backend properties can be found on each backend’s API documentation.
The qiskit.qasm3 package now contains a built-in, Rust-based parser for reading OpenQASM 3 programs into QuantumCircuit s, found at qiskit.qasm3.load_experimental() and loads_experimental() . These are typically several times faster than the existing, pure Python load() and loads() functions, which additionally require qiskit-qasm3-import to be installed.
For example, we can create a 20,000-instruction entangling QuantumCircuit :
import numpy as np import qiskit . qasm3 from qiskit . circuit . library import RealAmplitudes qc = RealAmplitudes ( 100 , reps = 100 , flatten = True ) qc = qc . assign_parameters (np.random. rand (qc.num_parameters)) oq3 = qiskit . qasm3 . dumps (qc)
The old qasm3.loads() took about 7.3s to load the resulting OpenQASM 3 program, whereas qasm3.loads_experimental() took under 300ms on a consumer Macbook Pro (i7, 2020)–a speedup of 25x!
The supported feature set of the experimental parser is very limited in this preview version, but this will expand as both the Qiskit side and the native Rust-based parser improve.
One of our main goals with this new parser, alongside the huge speed improvements, is to provide top-quality error diagnostics. As with other parts of the parser, these are a work in progress, but you’ll start to see much higher quality error messages displayed when parsing invalid OpenQASM 3 programs with the experimental parser.
The OpenQASM 3 exporter (see dump() and dumps() functions in qiskit.qasm3 ) now supports the stabilized syntax of the switch statement in OpenQASM 3 by default. The pre-certification syntax of the switch statement is still available by using the ExperimentalFeatures.SWITCH_CASE_V1 flag in the experimental argument of the exporter. There is no feature flag required for the stabilized syntax, but if you are interfacing with other tooling that is not yet updated, you may need to pass the experimental flag.
The syntax of the stabilized form is slightly different with regards to terminating break statements (no longer required nor permitted), and multiple cases are now combined into a single case line, rather than using C-style fall-through. For more detail, see the OpenQASM 3 documentation on the switch-case construct .
Added a new warning class, QPYLoadingDeprecatedFeatureWarning , to the QPY module. This class allows for deprecation warnings to surface even if the deprecated feature is accessed at a variable point in the call stack, as is the case for many QPY loading functions that are called recursively.
Added a new flag, version , to the qpy.dump() function. This allows qpy.dump() to optionally take an integer value for the QPY Format version to emit. This is useful if you need to generate a QPY file that will be loaded by an older version of Qiskit. However, the supported versions to emit are limited, only versions between the latest QPY version (which is the default), and the compatibility QPY version which is Version 10 (which was introduced in Qiskit 0.45.0) can be used. The compatibility version will remain fixed for the entire 1.x.y major version release series. This does not change the backwards compatibility guarantees of the QPY format when calling qpy.load() , it just enables users to emit an older version of QPY to maintain compatibility and interoperability between the 0.x and 1.x release series.
Added a qiskit.quantum_info.StabilizerState.from_stabilizer_list() method that generates a stabilizer state from a list of stabilizers:
from qiskit . quantum_info import StabilizerState stabilizer_list = [ "ZXX" , "-XYX" , "+ZYY" ] stab = StabilizerState . from_stabilizer_list (stabilizer_list)
SparsePauliOp.from_operator() now uses an implementation of the “tensorized Pauli decomposition algorithm” presented in Hatznko, Binkowski and Gupta (2023) . The method is now several orders of magnitude faster; for example, it is possible to decompose a random 10-qubit operator in around 250ms on a consumer Macbook Pro (Intel i7, 2020).
Added a qiskit.synthesis.synth_circuit_from_stabilizers() function that returns a circuit that outputs the state stabilized by a series of given stabilizers.
The AQC unitary synthesis plugin method now uses a faster objective function evaluation by default, which results in substantial improvement in synthesis time.
Add a new synthesis method synth_qft_line() of a QFT circuit for linear nearest-neighbor connectivity, which significantly reduces the number of SWAPs for large numbers of qubits compared to SABRE.
The class TwoQubitWeylDecomposition has been added to the public API in qiskit.synthesis . This class allows to apply the Weyl decomposition of two-qubit unitaries. If you were previously importing this while it was a non-public class in the now-removed qiskit.quantum_info.synthesis module, you should update your import paths.
Added a new exception class: InvalidLayoutError . This is a TranspilerError subclass which is raised when a user provided layout is invalid (mismatched size, duplicate qubits, etc).
Added a new keyword argument, num_processes , to transpile() and the PassManager.run() method. This allows for overriding both QISKIT_NUM_PROCS and the num_processes field in user configuration files on a per-transpile basis. For example:
from qiskit import transpile , QuantumCircuit qc = QuantumCircuit ( 2 ) qc . h ( 0 ) qc . cx ( 0 , 1 ) qc . measure_all () transpile ([qc] * 10 , basis_gates = [ 'u' , 'cz' ], num_processes = 2 )
will run the transpile over the 10 input circuits using only 2 processes and will override the system default, environment variable, or user configuration file for that transpile() call.
Added a new transpiler pass, OptimizeAnnotated , that optimizes annotated operations on a quantum circuit.
Consider the following example:
from qiskit . circuit import QuantumCircuit from qiskit . circuit . annotated_operation import ( AnnotatedOperation , InverseModifier , ControlModifier , ) from qiskit . circuit . library import CXGate , SwapGate from qiskit . transpiler . passes import OptimizeAnnotated # Create a quantum circuit with multiple annotated gates gate1 = AnnotatedOperation ( SwapGate (), [ InverseModifier (), ControlModifier ( 2 ), InverseModifier (), ControlModifier ( 1 )], ) gate2 = AnnotatedOperation ( SwapGate (), [ InverseModifier (), InverseModifier ()] ) gate3 = AnnotatedOperation ( AnnotatedOperation ( CXGate (), ControlModifier ( 2 )), ControlModifier ( 1 ) ) qc = QuantumCircuit ( 6 ) qc . append (gate1, [ 3 , 2 , 4 , 0 , 5 ]) qc . append (gate2, [ 1 , 5 ]) qc . append (gate3, [ 5 , 4 , 3 , 2 , 1 ]) # Optimize the circuit using OptimizeAnnotated transpiler pass qc_optimized = OptimizeAnnotated ()(qc) # This is how the optimized circuit should look like gate1_expected = AnnotatedOperation ( SwapGate (), ControlModifier ( 3 )) gate2_expected = SwapGate () gate3_expected = AnnotatedOperation ( CXGate (), ControlModifier ( 3 )) qc_expected = QuantumCircuit ( 6 ) qc_expected . append (gate1_expected, [ 3 , 2 , 4 , 0 , 5 ]) qc_expected . append (gate2_expected, [ 1 , 5 ]) qc_expected . append (gate3_expected, [ 5 , 4 , 3 , 2 , 1 ]) assert qc_optimized == qc_expected
In the case of gate1 , the modifiers of the annotated swap gate are brought into the canonical form: the two InverseModifier s cancel out, and the two ControlModifier s are combined. In the case of gate2 , all the modifiers get removed and the annotated operation is replaced by its base operation. In the case of gate3 , multiple layers of annotations are combined into one.
The constructor of the OptimizeAnnotated pass accepts optional arguments target , equivalence_library , basis_gates and recurse . When recurse is True (the default value) and when either target or basis_gates are specified, the pass recursively descends into the gate’s definition circuits, with the exception of gates that are already supported by the target or that belong to the equivalence library. On the other hand, when neither target nor basis_gates are specified, or when recurse is set to False , the pass synthesizes only the “top-level” annotated operations, i.e. does not recursively descend into the definition circuits. This behavior is consistent with that of the HighLevelSynthesis transpiler pass, which needs to be called in order to “unroll” the annotated operations into 1-qubit and 2-qubits gates.
Added a new HighLevelSynthesisPlugin for PermutationGate objects based on Qiskit’s token swapper algorithm. To use this plugin, specify token_swapper when defining high-level-synthesis config.
This synthesis plugin is able to run before or after the layout is set. When synthesis succeeds, the plugin outputs a quantum circuit consisting only of swap gates. When synthesis does not succeed, the plugin outputs None .
The following code illustrates how the new plugin can be run:
from qiskit . circuit import QuantumCircuit from qiskit . circuit . library import PermutationGate from qiskit . transpiler import PassManager , CouplingMap from qiskit . transpiler . passes . synthesis . high_level_synthesis import HighLevelSynthesis , HLSConfig # This creates a circuit with a permutation gate. qc = QuantumCircuit ( 8 ) perm_gate = PermutationGate ([ 0 , 1 , 4 , 3 , 2 ]) qc . append (perm_gate, [ 3 , 4 , 5 , 6 , 7 ]) # This defines the coupling map. coupling_map = CouplingMap . from_ring ( 8 ) # This high-level-synthesis config specifies that we want to use # the "token_swapper" plugin for synthesizing permutation gates, # with the option to use 10 trials. synthesis_config = HLSConfig (permutation = [( "token_swapper" , { "trials" : 10 })]) # This creates the pass manager that runs high-level-synthesis on our circuit. # The option use_qubit_indices=True indicates that synthesis is run after the layout is set, # and hence should preserve the specified coupling map. pm = PassManager ( HighLevelSynthesis ( synthesis_config, coupling_map = coupling_map, target = None , use_qubit_indices = True ) ) qc_transpiled = pm . run (qc)
Added two new arguments, matrix_based and max_qubits , to the constructor of the CommutativeInverseCancellation transpiler pass. When matrix_based is True , the pass uses matrix representations to check whether two operations are the inverse of each other. This makes the checks more powerful, and in addition allows for cancelling pairs of operations that are inverse up to a phase, while updating the global phase of the circuit accordingly. This generally leads to more reductions at the expense of increased runtime. The argument max_qubits limits the number of qubits in matrix-based commutativity and inverse checks. For example:
import numpy as np from qiskit . circuit import QuantumCircuit from qiskit . transpiler import PassManager from qiskit . transpiler . passes import CommutativeInverseCancellation circuit = QuantumCircuit ( 1 ) circuit . rz (np.pi / 4 , 0 ) circuit . p ( - np.pi / 4 , 0 ) passmanager = PassManager ( CommutativeInverseCancellation (matrix_based = True )) new_circuit = passmanager . run (circuit)
The pass is able to cancel the RZ and P gates, while adjusting the circuit’s global phase to 15 π 8 \frac{15 \pi}{8} 8 15 π .
Added a new function, high_level_synthesis_plugin_names() , that can be used to get the list of installed high level synthesis plugins for a given operation name.
The text and mpl outputs for the QuantumCircuit.draw() and circuit_drawer() circuit drawer functions will now display detailed information for operations of AnnotatedOperation . If the AnnotatedOperation.modifiers contains a ControlModifier , the operation will be displayed the same way as controlled gates. If the InverseModifier or PowerModifier is used, these will be indicated with the base operation name. For example:
from qiskit . circuit import ( AnnotatedOperation , ControlModifier , PowerModifier , InverseModifier , QuantumCircuit ) from qiskit . circuit . library import SGate annotated_op = AnnotatedOperation ( SGate (), [ PowerModifier ( 3.4 ), ControlModifier ( 3 ), InverseModifier ()]) qc = QuantumCircuit ( 4 ) qc . append (annotated_op, range ( 4 )) qc . draw ( "mpl" )
Added a new warning base class, QiskitWarning . While Qiskit will continue to use built-in Python warnings (such as DeprecationWarning ) when those are most appropriate, for cases that are more specific to Qiskit, the warnings will be subclasses of QiskitWarning .
The optional-functionality testers ( qiskit.utils.optionals ) will now distinguish an optional dependency that was completely not found (a normal situation) with one that was found, but triggered errors during its import. In the latter case, they will now issue an OptionalDependencyImportWarning telling you what happened, since it might indicate a failed installation or an incompatible version.
Qiskit 1.0 now requires version 0.14.0 of rustworkx . The minimum version requirement was raised to support the new token_swapper PermutationGate synthesis plugin for HighLevelSynthesisPlugin .
The minimum supported Rust version for building Qiskit from source is now 1.70. This has been raised from the previous minimum supported Rust version of 1.64 in the Qiskit 0.45.x and 0.46.0 release series.
The dependency on psutil has been removed. The psutil library was previously only used for detecting the number of physical CPUs and total system memory, however this information provided does not add sufficient value to justify the additional dependencies and overhead so it has been removed. This does mean that the default number of processes used by parallel_map() and functions that internally can use parallel_map() such as transpile() and PassManager.run() may use more or less parallel processes than in previous releases. If you’d like to adjust the number of processes used you can use the new num_processes argument to those functions, or the QISKIT_NUM_PROCS environment variable or num_processes field in a user configuration file (see the local configuration guide for more details) if you need to adjust the number of processes that Qiskit potentially uses.
The scoped_parameters and search_parameters methods have been removed from the ScheduleBlock class. These methods returned Parameter objects that partially linked to the parameters in the ScheduleBlock instance but assigning values using these objects did not work correctly. Users should use ScheduleBlock.parameters instead and iterate through ScheduleBlock.references and compare to the Schedule.parameters attributes of the subreferences when needing to distinguish which subroutine a parameter is used in. See #11654 for more information.
Removed logic for injecting QuantumCircuit and Gate operations into the pulse context (such as in pulse.builder.call() ), which was legacy behavior deprecated in Qiskit 0.46. Pulse schedules should be built up as a full schedule context; circuits and gates are a higher level of abstraction.
This includes the removal of the related functions:
pulse.builder.call_gate
pulse.builder.cx
pulse.builder.u1
pulse.builder.u2
pulse.builder.u3
pulse.builder.x
pulse.builder.active_transpiler_settings
pulse.builder.active_circuit_scheduler_settings
pulse.builder.transpiler_settings
pulse.builder.circuit_scheduler_settings
The default_transpiler_settings and default_circuit_scheduler_settings arguments to pulse.builder.build() are similarly removed.
from qiskit import transpile , schedule , QuantumCircuit , pulse from qiskit . providers . fake_provider import Fake7QPulseV1 backend = Fake7QPulseV1 () # Create a schedule from a hardware-based circuit. qc = QuantumCircuit ( 2 ) qc . cx ( 0 , 1 ) qc = transpile (qc, backend) sched = schedule (qc, backend) # These pulse schedules can still be called in builder contexts. with pulse . build (backend) as qc_sched : pulse . call (sched) # Schedules for certain operations can also be directly retrieved # from BackendV1 instances: sched = backend . defaults (). instruction_schedule_map . get ( 'x' , ( 0 ,)) # ... and from BackendV2 instances: sched = backend . target [ 'x' ] [( 0 , )] . calibration
The minimum version required for symengine was bumped to >=0.11.
Removed the Instruction.qasm method, which was deprecated in Qiskit 0.45.0. Use qiskit.qasm2.dump() with a complete QuantumCircuit instead.
The properties Bit.register and Bit.index are removed. They were deprecated in Qiskit 0.25 (released in 2021-04). The qubits and bits now live only in the context of a QuantumCircuit . The alternative to the properties is to use QuantumCircuit.find_bit() to find all the containing registers within a circuit and the index of the bit within the circuit.
The method QuantumCircuit.bind_parameters has been removed, following its deprecation in Qiskit 0.45. You can use QuantumCircuit.assign_parameters() as a drop-in replacement with all its defaults, and it also exposes additional features over the old method.
Importing Int1 , Int2 , BooleanFunction , classical_function() from qiskit.circuit is now disabled. Instead, import the objects from the qiskit.circuit.classicalfunction submodule, which requires the tweedledum package.
The header and extension_lib data-only attributes from QuantumCircuit are removed following their deprecation in Qiskit 0.45. These were internal details of the OpenQASM 2 exporter which are no longer used.
Removed the qiskit.extensions module, which has been pending deprecation since the 0.45 release and has been fully deprecated in the 0.46 release. The following operations from this module are available in qiskit.circuit.library :
DiagonalGate ,
HamiltonianGateGate ,
Initialize ,
Isometry ,
MCGupDiag ,
UCGate ,
UCPauliRotGate ,
UCRXGate ,
UCRYGate ,
UCRZGate ,
UnitaryGate .
The following objects have been removed:
SingleQubitUnitary (instead use library.UnitaryGate ),
Snapshot (superseded by Aer’s save instructions),
ExtensionError ,
along with the following circuit methods:
QuantumCircuit.snapshot ,
QuantumCircuit.squ ,
QuantumCircuit.diagonal ,
QuantumCircuit.hamiltonian ,
QuantumCircuit.isometry and QuantumCircuit.iso ,
QuantumCircuit.uc ,
QuantumCircuit.ucrx ,
QuantumCircuit.ucry ,
QuantumCircuit.ucrz .
These operations can still be performed by appending the appropriate instruction to a quantum circuit.
Removed deprecated, duplicated QuantumCircuit methods. These include:
QuantumCircuit.cnot , instead use QuantumCircuit.cx() ,
QuantumCircuit.toffoli , instead use QuantumCircuit.ccx() ,
QuantumCircuit.fredkin , instead use QuantumCircuit.cswap() ,
QuantumCircuit.mct , instead use QuantumCircuit.mcx() ,
QuantumCircuit.i , instead use QuantumCircuit.id() .
You can no longer set QuantumCircuit.metadata to be None , following deprecation in Qiskit 0.43.0. Its type is dict , so to clear it, set it to {} .
The attribute .Register.name_format has been removed following its deprecation in Qiskit 0.40.0. There is no restriction on register names any more, and the regular expression there was simply [a-z][a-zA-Z0-9_]* .
Changed default value of two arguments ( add_delay and filter_faulty ) in the convert_to_target() function. This conversion function now adds delay instructions and removes faulty instructions by default.
The BackendProperties and PulseDefaults model objects used by the FakeOpenPulse2Q have been updated to be internally consistent and add missing instructions. If you were relying on the previous model objects as a compilation target you can use the backend with Qiskit 0.46 and export a QuantumCircuit generated with transpile() and serialize it using qpy.dump to access it in this release.
The qiskit.providers.basicaer module, exposed as qiskit.BasicAer , has been removed following it deprecation on the 0.46 release. Its functionality has been replaced by the qiskit.quantum_info module and the new qiskit.providers.basic_provider module.
The migration from using qiskit.providers.basicaer ( qiskit.BasicAer ) to qiskit.providers.basic_provider can be performed as follows:
Migrate from
Replace with
qiskit.BasicAer The new provider doesn’t have a global instance, imports should be from qiskit.providers.basic_provider
qiskit.providers.basicaer basic_provider
BasicAerProvider BasicProvider
BasicAerJob BasicProviderJob
QasmSimulatorPy BasicSimulator
UnitarySimulatorPy use Operator
StatevectorSimulatorPy use Statevector
A notable difference is that the new provider is no longer exposed through a global instance (like BasicAer ), so it will not be valid to do from qiskit import BasicProvider . Instead, the provider class must be imported from its submodule and instantiated manually:
from qiskit . providers . basic_provider import BasicProvider provider = BasicProvider () backend = provider . get_backend ( "basic_simulator" )
The following examples show the migration paths of the three simulators in BasicAer .
Statevector simulator:
from qiskit import QuantumCircuit qc = QuantumCircuit ( 3 ) qc . h ( 0 ) qc . h ( 1 ) qc . cx ( 1 , 2 ) # Former path from qiskit import BasicAer backend = BasicAer . get_backend ( "statevector_simulator" ) statevector = backend . run (qc). result (). get_statevector () # New path from qiskit . quantum_info import Statevector statevector = Statevector (qc)
Unitary simulator:
from qiskit import QuantumCircuit qc = QuantumCircuit ( 3 ) qc . h ( 0 ) qc . h ( 1 ) qc . cx ( 1 , 2 ) # Former path from qiskit import BasicAer backend = BasicAer . get_backend ( "unitary_simulator" ) result = backend . run (qc). result () # New path from qiskit . quantum_info import Operator result = Operator (qc). data
Qasm simulator:
from qiskit import QuantumCircuit qc = QuantumCircuit ( 3 ) qc . h ( 0 ) qc . h ( 1 ) qc . cx ( 1 , 2 ) qc . measure_all () # Former path from qiskit import BasicAer backend = BasicAer . get_backend ( "qasm_simulator" ) result = backend . run (qc). result () # New path from qiskit . providers . basic_provider import BasicProvider backend = BasicProvider (). get_backend ( "basic_simulator" ) result = backend . run (qc). result () # or, directly from qiskit . providers . basic_provider import BasicSimulator backend = BasicSimulator () result = backend . run (qc). result ()
Removed the ConfigurableFakeBackend class deprecated in Qiskit 0.46.0. Instead, a suitable FakeBackend can be used.
The deprecated qiskit.providers.fake_provider module has been migrated to the qiskit-ibm-runtime Python package. For this reason, the following elements in the qiskit.providers.fake_provider have been removed following their deprecation in Qiskit 0.46:
qiskit.providers.fake_provider.FakeProvider
qiskit.providers.fake_provider.FakeProviderForBackendV2
qiskit.providers.fake_provider.FakeProviderFactory
qiskit.providers.fake_provider.fake_backends.FakeBackendV2
any fake backend contained in qiskit.providers.fake_provider.backends (accessible through the provider)
qiskit.providers.fake_provider.FakeQasmSimulator
qiskit.providers.fake_provider.FakeJob
qiskit.providers.fake_provider.FakeQobj
To use the new fake provider module, you can run pip install qiskit-ibm-runtime and replace the qiskit import path ( qiskit.providers.fake_provider ) with the new import path ( qiskit_ibm_runtime.fake_provider ). Migration example:
Additionally, the following fake backends designed for special testing purposes have been superseded by the new GenericBackendV2 class, and are also removed following their deprecation in Qiskit 0.46:
qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2
`qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2LegacyQubitProps
qiskit.providers.fake_provider.fake_backend_v2.FakeBackend5QV2
qiskit.providers.fake_provider.fake_backend_v2.FakeBackendSimple
Migration example to the new GenericBackendV2 class:
Removed the deprecated class qiskit.pulse.instructions.Call No alternative pulse instruction is provided.
Removed deprecated methods in InstructionToQobjConverter and QobjToInstructionConverter . This includes
InstructionToQobjConverter.convert_acquire()
InstructionToQobjConverter.convert_bundled_acquires()
InstructionToQobjConverter.convert_set_frequency()
InstructionToQobjConverter.convert_shift_frequency()
InstructionToQobjConverter.convert_set_phase()
InstructionToQobjConverter.convert_shift_phase()
InstructionToQobjConverter.convert_delay()
InstructionToQobjConverter.convert_play()
InstructionToQobjConverter.convert_snapshot()
QobjToInstructionConverter.convert_acquire()
QobjToInstructionConverter.convert_set_phase()
QobjToInstructionConverter.convert_shift_phase()
QobjToInstructionConverter.convert_set_frequency()
QobjToInstructionConverter.convert_shift_frequency()
QobjToInstructionConverter.convert_delay()
QobjToInstructionConverter.bind_pulse()
QobjToInstructionConverter.convert_parametric()
QobjToInstructionConverter.convert_snapshot()
These public methods are all replaced with protected ones which are implicitly called from the single entry point, i.e. calling the class as like a function.
The class qiskit.pulse.library.ParametricPulse and all subclasses are removed. These were deprecated since Qiskit 0.39 (with qiskit-terra 0.22), released in 2022-10. Instead, use SymbolicPulse and check its documentation for details.
The latest format version of QPY is now Version 11 and this is what is emitted by default when running qpy.dump() .
The module path qiskit.circuit.qpy_serialization has been removed, following its deprecation in Qiskit 0.40.0. For QPY serialization, use qiskit.qpy , which is the new location.
Removed the deprecated getitem / setitem magic methods of Clifford . The methods were deprecated since Qiskit 0.44, released in 2023-07. Instead, index or iterate through the Clifford.tableau attribute.
Removed the qiskit.quantum_info.synthesis module, which has been deprecated since the 0.46 release. The following objects have been moved to qiskit.synthesis :
OneQubitEulerDecomposer has been moved to qiskit.synthesis.one_qubit
TwoQubitBasisDecomposer has been moved to qiskit.synthesis.two_qubits
XXDecomposer has been moved to qiskit.synthesis.two_qubits
two_qubit_cnot_decompose() has been moved to qiskit.synthesis.two_qubits
This function was removed, since it has already been deprecated in the 0.46 release: * cnot_rxx_decompose
These functions were removed, since they have already been deprecated in a previous release: * decompose_clifford (use synth_clifford_full() instead) * decompose_cnotdihedral (use synth_cnotdihedral_full() instead)
The functions process_fidelity() , average_gate_fidelity() , gate_error() and diamond_norm() will no longer attempt to coerce arbitrary inputs to their marked expected types, following the deprecation in Qiskit 0.25.0. Pass inputs of the marked types to each argument directly.
The following deprecated functions previously in qiskit.quantum_info have been removed. These functions were marked as deprecated in the Qiskit 0.40.0 release in 2023-01.
decompose_clifford : you should use the qiskit.synthesis.synth_clifford_full() function instead.
decompose_cnotdihedral : you should use the qiskit.synthesis.synth_cnotdihedral_full() function instead.
The deprecated method Target.aquire_alignment has been removed. It was marked as deprecated in Qiskit 0.43 (released 2023-05). The method Target.acquire_alignment() should be used instead.
Removed deprecated function qiskit.transpiler.preset_passmanagers.common.get_vf2_call_limit . Instead, use get_vf2_limits() .
The implicit use of approximation_degree!=1.0 by default in the generate_preset_pass_manager() function has been disabled. The previous default could cause undue and unexpected approximations, especially in workloads involving Trotterization or similar runs of operations that are close, but decidedly not equal, to the identity.
This change brings the inner pass-manager generation defaults in line with transpile() , which was always the intention. See #8595 for more detail.
Removed the deprecated Unroller class in qiskit.transpiler.passes.basis . This class was deprecated in Qiskit 0.45 and use of it can be replaced by the combination usage of BasisTranslator and UnrollCustomDefinitions .
Note that BasisTranslator and UnrollCustomDefinitions take different arguments than Unroller , as they requires a EquivalenceLibrary object to be passed in.
Where previously Unroller(basis_gates) could be used, you can now use:
from qiskit . circuit . library . standard_gates . equivalence_library import ( StandardEquivalenceLibrary as std_eqlib , ) pm = PassManager ([ UnrollCustomDefinitions (std_eqlib, basis_gates) BasisTranslator (std_eqlib, basis_gates), ]) translated = pm . run (circuit)
The deprecated NoiseAdaptiveLayout transpiler pass has been removed. It was marked as deprecated in Qiskit 0.46.0. This pass has been largely superseded by VF2Layout and VF2PostLayout which will set a layout based on the reported noise characteristics of a backend. Along with the pass, the layout_method plugin "noise_adaptive" has been removed.
The deprecated CrosstalkAdaptiveSchedule transpiler pass has been removed. It was marked as deprecated in Qiskit 0.46.0. This pass was not usable any longer because its internal operation was dependent on custom properties being set in the BackendProperties payload of a BackendV1 instance. As no backends are setting these fields, the pass was removed. If you depend on the pass for a custom workflow you can use the version in Qiskit 0.46.x.
Removed the qiskit.transpiler.synthesis module, which has been deprecated since the 0.46 release. The following objects have been moved:
qiskit.transpiler.synthesis.aqc has been moved to qiskit.synthesis.unitary.aqc (except of qiskit.synthesis.unitary.aqc.AQCSynthesisPlugin ).
qiskit.synthesis.unitary.aqc.AQCSynthesisPlugin has been moved to qiskit.transpiler.passes.synthesis.AQCSynthesisPlugin .
qiskit.transpiler.synthesis.graysynth() has been moved to qiskit.synthesis.synth_cnot_phase_aam() .
qiskit.transpiler.synthesis.cnot_synth() has been moved to qiskit.synthesis.synth_cnot_count_full_pmh() .
The target keyword alias when calling TwoQubitBasisDecomposer instances as functions has been removed following its deprecation in Qiskit 0.40.0. You should pass the argument positionally as the first argument, or use the new name unitary .
The specialized transpiler pass LinearFunctionsSynthesis has been removed following its deprecation in Qiskit 0.40.0. Since its deprecation it just has been a very thin wrapper around HighLevelSynthesis , which you should use instead.
The import path qiskit.transpiler.passes.scheduling.calibration_creators is removed. The transpiler passes it housed, RZXCalibrationBuilder and RZXCalibrationBuilderNoEcho can be imported directly from qiskit.transpiler.passes .
The import path qiskit.transpiler.passes.scheduling.rzx_templates is removed. You should import rzx_templates() from qiskit.transpiler.passes directly.
A pattern for the pass piepline construction was upgraded. The syntactic sugar shown below for instantiation of flow controller was removed.
from qiskit . transpiler import PassManager pm = PassManager () pm . append (my_pass, condition = condition_callable, do_while = do_while_callable)
Instead of using this keyword argument pattern, you should explicitly instantiate the flow controller.
from qiskit . passmanager import ConditionalController , DoWhileController from qiskit . transpiler import PassManager pm = PassManager () pm . append ( ConditionalController ( DoWhileController (my_pass, do_while = do_while_callable), condition = condition_callable, ) )
Note that you can manage the pecking order of controllers when you want to nest them, which was not possible with keyword arguments. You can also build the pipeline with the constructor of the pass manager like below because there is no reason to call the append method now.
pm = PassManager ( ConditionalController ( DoWhileController (my_pass, do_while = do_while_callable), condition = condition_callable, ) )
The append method of built-in flow controllers was removed. This includes
ConditionalController.append
DoWhileController.append
FlowControllerLinear.append
The task pipeline in a flow controller is frozen, and it must be passed when the controller instance is created.
Removed the passess methods of PassManager and StagedPassManager that returned a representation of included passes in the form of list of dictionaries. However, this format doesn’t efficiently represent more complicated pass pipeline, which may include conditional branching and nested conditions. Instead of using this representation, please use following pattern
pm = PassManager (...) pm . to_flow_controller (). tasks
This directly returns a linearized base task instances in tuple format.
The max_iteration argument was removed from PassManager.append() and PassManager.replace() .
The following legacy classes were removed from the pass manager and transpiler modules following their deprecation in Qiskit 0.46:
qiskit.passmanager.flow_controllers.FlowController
qiskit.transpiler.fencedobjs.FencedObject
qiskit.transpiler.fencedobjs.FencedPropertySet
qiskit.transpiler.fencedobjs.FencedDAGCircuit
qiskit.transpiler.runningpassmanager.RunningPassManager
The default style for the circuit visualization using Matplotlib has been changed to "iqp" , matching the IBM Quantum Platform.
The deprecated module qiskit.visualization.qcstyle has been removed. This module has been marked as deprecated since Qiskit 0.39.0. Instead you should use the qiskit.visualization.circuit.qcstyle .
The deprecated support for passing a QuasiDistribution , ProbDistribution , or a distribution dictionary to the data argument of the plot_histogram() visualization has been removed. This functionality was marked as deprecated in the Qiskit 0.39.0 release (2022-10). Instead if you would like to plot a histogram from a QuasiDistribution , ProbDistribution , or a distribution dictionary you should use the plot_distribution() function instead.
The link_interval_dt key of QiskitTimelineStyle has been removed. You should use the new name link_interval_percent .
The object qiskit.Aer has been removed following its deprecation in Qiskit 0.46. You can instead use qiskit_aer.Aer , which is a drop-in replacement.
Importing from qiskit.providers.aer will no longer work, following its deprecation in Qiskit 0.46. You should instead import from qiskit_aer , which is a drop-in replacement.
Pulse jobs are no longer supported in fake backends, following the deprecation and removal of the underlying simulation functionality in Aer. For pulse-level simulation, outside the context of circuit objects, consider using a special-purpose library such as Qiskit Dynamics .
Qiskit’s execute() function is removed. This function served as a high-level wrapper around transpiling a circuit with some transpile options and running it on a backend with some run options. To do the same thing, you can explicitly use the transpile() function (with appropriate transpile options) followed by backend.run() (with appropriate run options).
For example, instead of running:
from qiskit import execute job = execute (circuit, backend)
you can run:
from qiskit import transpile new_circuit = transpile (circuit, backend) job = backend . run (new_circuit)
Alternatively, the Sampler primitive is semantically equivalent to the deprecated execute() function. The class BackendSampler is a generic wrapper for backends that do not support primitives:
from qiskit . primitives import BackendSampler sampler = BackendSampler (backend) job = sampler . run (circuit)
The deprecated qiskit.IBMQ object has been removed. This alias object was marked as deprecated in the Qiskit 0.40.0 release. This alias object lazily redirected attribute access to qiskit.providers.ibmq.IBMQ . As the qiskit-ibmq-provider package has now been retired and superseded by qiskit-ibm-provider package which maintains its own namespace, maintaining this alias is no longer relevant. If you were relying on the qiskit.IBMQ alias you should migrate your usage to the qiskit-ibm-provider package, see the migration guide for more details.
Removed the deprecated module qiskit.tools.jupyter which previously included Jupyter magics and widgets for interactively visualizing some data from Qiskit. This module was deprecated in Qiskit 0.46.0. Most of this functionality was directly tied to the legacy qiskit-ibmq-provider package and was no longer valid so the module was removed. Similar functionality is available from the qiskit_ibm_provider.jupyter module in the qiskit-ibm-provider package.
Removed the deprecated module qiskit.tools.monitor which previously included tools for tracking JobV1 job instances, primarily from the legacy qiskit-ibm-provider package. This module was marked as deprecated in Qiskit 0.46.0. It is being removed because it was directly tied to the legacy qiskit-ibm-provider package.
Removed the deprecated import path qiskit.test.mock which previously was used to redirect imports for the mock backends to their newer location in the qiskit.providers.fake_provider . This module was marked as deprecated in Qiskit 0.37.0. If you were using this module you should update your imports from qiskit.test.mock to qiskit.providers.fake_provider instead.
The qiskit.test module is no longer a public module. This was never intended to be public, nor used outside of Qiskit’s own test suite. All functionality was specific to Qiskit and no alternative is provided; if you needed similar functionality, you should include it in your own test harnesses.
The deprecated qiskit.tools.visualization module has removed. This module was deprecated in the Qiskit 0.46.0 release. This module was a legacy redirect from the original location of Qiskit’s visualization module and was moved to qiskit.visualization in Qiskit 0.8.0. If you’re still using this path you can just update your imports from qiskit.tools.visualization to qiskit.visualization .
The deprecated qiskit.tools.events module and the corresponding qiskit.tools.progressbar utility it exposed has been removed. It was deprecated in the Qiskit 0.46.0 release. This module’s functionality was not widely used and better covered by dedicated packages such as tqdm .
The qiskit.tools module has been removed. This module was deprecated in Qiskit 0.46.0. All the contents from this module have been removed except for the qiskit.tools.parallel_map function which now can be used from qiskit.utils.parallel_map() instead.
Fixed the return of improper measurement schedules when only a subset of qubits was requested. Previously, a measurement schedule for all qubits would be returned.
Fixed an issue in the text circuit drawer when displaying operations that were not circuit.instruction.Instruction class. These operations would cause the drawer to fail. Examples were Clifford and AnnotatedOperation .
Fixed an issue with the SetLayout transpiler pass where an invalid integer list input that contained duplicate entries which would result in an invalid Layout being generated and subsequent transpiler passes would fail with a cryptic error. This is now caught when SetLayout.run() is called an InvalidLayoutError error will be raised indicating there are duplicate entries in the integer list.
QPY (using qpy.dump() and qpy.load() ) will now correctly serialize and deserialize quantum circuits with annotated operations ( AnnotatedOperation ).
Calling copy() or copy_empty_like() on a BlueprintCircuit will now correctly propagate the global_phase to the copy. Previously, the global phase would always be zero after the copy.
QuantumCircuit.compose() will now correctly raise a CircuitError when there are duplicates in the qubits or clbits arguments.
QPY (using qpy.dump() and qpy.load() ) will now correctly serialize and deserialize quantum circuits with Clifford operators ( Clifford ).
Fixed an issue in the mpl circuit drawer where the text would print beyond the end of the box for a SwitchCaseOp if the default case was empty.
The qubit-argument broadcasting of QuantumCircuit.delay() now correctly produces individual Delay instructions for each qubit, as intended. Previously, when given certain iterables (s
Add qpy deprecation warning class
switch (#11417)BasicAer to BasicProvider and refactor interface to follow BackendV2 (#11422)CommutativeInverseCancellation to cancel pairs of gates up-to-phase (#11248)SparsePauliOp.from_operator (#11133)QuantumCircuit.assign_parameters (#11432)QuantumCircuit.get_parameter to retrieve by name (#11431)ParameterExpression.numeric to cast to number (#11109)QuantumCircuit.append validates captures in control-flow (#10974)Var nodes (#10944)QuantumCircuit._data and intern CircuitInstruction args (#10827)Measure and Reset instructions (#11170)BasePrimitiveJob class and deprecate PrimitiveJob.submit method (#11552)primitives.containers.BitArray container class (#11542)Operator.power (#11534)gate.inverse() to return AnnotatedOperation (#11593)gate.control() to return AnnotatedOperation (#11433)approximation_degree default in generate_preset_pass_maanger (#11695)qiskit metapackage with qiskit-terra (#11271)FakeProvider class and related tools in 1.0 (#11376)BasicAer to BasicProvider and refactor interface to follow BackendV2 (#11422)Aer and imports from qiskit.providers.aer (#11442)qiskit.extensions (#11488)ConfigurableFakeBackend (#11568)qiskit.test (#11445)iqp the matplotlib default style (#11536)classicalfunction imports (#11486)QuantumCircuit.bind_parameters (#11434)opflow module, QuantumInstance and related utils (#11111)IntegerComparator.num_ancilla_qubits (#11306)0.23 (qiskit.visualization.pulse) (#11213)qiskit.algorithms module (#11086)qargs=None in DAG appends (#11190)ScalableSymbolicPulse (#11403)qiskit.test (#10998)QuantumCircuit.delay (#11447)QuantumCircuit.compose (#11451)InstructionDurations from backend (#11501)BlueprintCircuits (#11456)TemplateOptimization returns native-symbolic objects (#11107)Instruction.condition_bits for runtime classical expressions (#11325)QuantumCircuit.barrier argument conversion (#11272)Channel.__hash__ in multiprocessing contexts (#11251)BlueprintCircuit._append (#11181)Optimizer in AQC (#11099)Deprecate PauliList estimator observables
PauliList estimator observables (#11055)QuantumCircuit.append validates captures in control-flow (#10974)Var nodes (#10944)QuantumCircuit._data and intern CircuitInstruction args (#10827)Measure and Reset instructions (#11170)qiskit metapackage with qiskit-terra (#11271)opflow module, QuantumInstance and related utils (#11111)IntegerComparator.num_ancilla_qubits (#11306)0.23 (qiskit.visualization.pulse) (#11213)qiskit.algorithms module (#11086)qargs=None in DAG appends (#11190)Instruction.condition_bits for runtime classical expressions (#11325)QuantumCircuit.barrier argument conversion (#11272)Channel.__hash__ in multiprocessing contexts (#11251)BlueprintCircuit._append (#11181)Optimizer in AQC (#11099)Release notes: https://docs.quantum.ibm.com/api/qiskit/release-notes/0.46#0463
Release notes: https://docs.quantum.ibm.com/api/qiskit/release-notes/0.46#0463
This is the final release in the 0.x release series marking the end-of-life of the release series.
C3SXGate to_matrix method (backport #12742) (#12744)replace_block_with_op on operations with wrong number of qubits (#12637) (#12699)parameters cache on circuit copy (backport #12619) (#12620)Your coding agent can read these notes before it upgrades. Set up the MCP server →