qiskit 1.3.0b1__cp39-abi3-win32.whl → 1.3.0rc2__cp39-abi3-win32.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +20 -1
- qiskit/_accelerate.pyd +0 -0
- qiskit/assembler/assemble_schedules.py +2 -0
- qiskit/circuit/__init__.py +44 -1
- qiskit/circuit/_standard_gates_commutations.py +585 -0
- qiskit/circuit/barrier.py +2 -0
- qiskit/circuit/controlflow/builder.py +3 -3
- qiskit/circuit/controlflow/if_else.py +13 -5
- qiskit/circuit/controlflow/while_loop.py +10 -2
- qiskit/circuit/delay.py +20 -3
- qiskit/circuit/equivalence.py +13 -214
- qiskit/circuit/gate.py +3 -1
- qiskit/circuit/instruction.py +32 -11
- qiskit/circuit/instructionset.py +2 -0
- qiskit/circuit/library/__init__.py +110 -14
- qiskit/circuit/library/arithmetic/__init__.py +9 -2
- qiskit/circuit/library/arithmetic/adders/__init__.py +1 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +154 -2
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +20 -56
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +14 -1
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +21 -91
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +1 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +8 -1
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +94 -3
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +8 -1
- qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
- qiskit/circuit/library/basis_change/qft.py +20 -38
- qiskit/circuit/library/blueprintcircuit.py +64 -0
- qiskit/circuit/library/boolean_logic/__init__.py +4 -4
- qiskit/circuit/library/boolean_logic/inner_product.py +81 -4
- qiskit/circuit/library/boolean_logic/quantum_and.py +107 -4
- qiskit/circuit/library/boolean_logic/quantum_or.py +107 -3
- qiskit/circuit/library/boolean_logic/quantum_xor.py +97 -3
- qiskit/circuit/library/data_preparation/__init__.py +6 -3
- qiskit/circuit/library/data_preparation/{z_feature_map.py → _z_feature_map.py} +45 -34
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +342 -29
- qiskit/circuit/library/fourier_checking.py +72 -11
- qiskit/circuit/library/generalized_gates/__init__.py +1 -1
- qiskit/circuit/library/generalized_gates/diagonal.py +45 -51
- qiskit/circuit/library/generalized_gates/gms.py +67 -14
- qiskit/circuit/library/generalized_gates/gr.py +4 -4
- qiskit/circuit/library/generalized_gates/isometry.py +2 -2
- qiskit/circuit/library/generalized_gates/linear_function.py +12 -6
- qiskit/circuit/library/generalized_gates/mcmt.py +167 -107
- qiskit/circuit/library/generalized_gates/permutation.py +8 -6
- qiskit/circuit/library/generalized_gates/rv.py +8 -9
- qiskit/circuit/library/graph_state.py +93 -10
- qiskit/circuit/library/grover_operator.py +270 -2
- qiskit/circuit/library/hidden_linear_function.py +83 -20
- qiskit/circuit/library/iqp.py +99 -20
- qiskit/circuit/library/n_local/__init__.py +19 -7
- qiskit/circuit/library/n_local/efficient_su2.py +118 -5
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +259 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +130 -6
- qiskit/circuit/library/n_local/n_local.py +406 -5
- qiskit/circuit/library/n_local/pauli_two_design.py +106 -4
- qiskit/circuit/library/n_local/qaoa_ansatz.py +80 -1
- qiskit/circuit/library/n_local/real_amplitudes.py +127 -7
- qiskit/circuit/library/n_local/two_local.py +14 -7
- qiskit/circuit/library/overlap.py +91 -26
- qiskit/circuit/library/pauli_evolution.py +17 -15
- qiskit/circuit/library/phase_estimation.py +80 -4
- qiskit/circuit/library/quantum_volume.py +72 -20
- qiskit/circuit/library/standard_gates/__init__.py +20 -1
- qiskit/circuit/library/standard_gates/dcx.py +2 -1
- qiskit/circuit/library/standard_gates/ecr.py +2 -2
- qiskit/circuit/library/standard_gates/h.py +4 -3
- qiskit/circuit/library/standard_gates/i.py +2 -1
- qiskit/circuit/library/standard_gates/iswap.py +2 -2
- qiskit/circuit/library/standard_gates/p.py +20 -12
- qiskit/circuit/library/standard_gates/r.py +1 -1
- qiskit/circuit/library/standard_gates/rx.py +4 -3
- qiskit/circuit/library/standard_gates/rxx.py +2 -2
- qiskit/circuit/library/standard_gates/ry.py +4 -3
- qiskit/circuit/library/standard_gates/ryy.py +2 -2
- qiskit/circuit/library/standard_gates/rz.py +13 -12
- qiskit/circuit/library/standard_gates/rzx.py +6 -6
- qiskit/circuit/library/standard_gates/rzz.py +1 -1
- qiskit/circuit/library/standard_gates/s.py +4 -4
- qiskit/circuit/library/standard_gates/swap.py +3 -3
- qiskit/circuit/library/standard_gates/sx.py +4 -3
- qiskit/circuit/library/standard_gates/t.py +2 -2
- qiskit/circuit/library/standard_gates/u.py +11 -3
- qiskit/circuit/library/standard_gates/u1.py +65 -15
- qiskit/circuit/library/standard_gates/u2.py +4 -1
- qiskit/circuit/library/standard_gates/u3.py +31 -3
- qiskit/circuit/library/standard_gates/x.py +7 -5
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -2
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -2
- qiskit/circuit/library/standard_gates/y.py +4 -3
- qiskit/circuit/library/standard_gates/z.py +3 -3
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +9 -7
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +10 -9
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +9 -7
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +10 -8
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +16 -14
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +14 -12
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +14 -12
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +12 -10
- qiskit/circuit/library/templates/rzx/rzx_cy.py +11 -10
- qiskit/circuit/library/templates/rzx/rzx_xz.py +16 -15
- qiskit/circuit/library/templates/rzx/rzx_yz.py +12 -10
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +22 -20
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +16 -15
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +17 -15
- qiskit/circuit/parameter.py +4 -0
- qiskit/circuit/parameterexpression.py +167 -34
- qiskit/circuit/quantumcircuit.py +162 -126
- qiskit/circuit/singleton.py +2 -0
- qiskit/circuit/store.py +2 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/assembler.py +17 -4
- qiskit/compiler/scheduler.py +2 -0
- qiskit/compiler/sequencer.py +2 -0
- qiskit/compiler/transpiler.py +81 -26
- qiskit/converters/circuit_to_dag.py +2 -2
- qiskit/converters/circuit_to_dagdependency.py +1 -1
- qiskit/converters/circuit_to_dagdependency_v2.py +1 -1
- qiskit/converters/circuit_to_instruction.py +1 -1
- qiskit/converters/dag_to_circuit.py +7 -5
- qiskit/converters/dag_to_dagdependency.py +1 -1
- qiskit/converters/dag_to_dagdependency_v2.py +1 -1
- qiskit/converters/dagdependency_to_circuit.py +5 -1
- qiskit/converters/dagdependency_to_dag.py +6 -1
- qiskit/dagcircuit/collect_blocks.py +3 -3
- qiskit/dagcircuit/dagdependency.py +18 -5
- qiskit/dagcircuit/dagdependency_v2.py +1 -1
- qiskit/dagcircuit/dagnode.py +2 -2
- qiskit/passmanager/__init__.py +2 -2
- qiskit/primitives/backend_estimator.py +5 -2
- qiskit/primitives/backend_sampler_v2.py +61 -18
- qiskit/primitives/base/base_estimator.py +2 -2
- qiskit/primitives/containers/data_bin.py +9 -1
- qiskit/primitives/statevector_sampler.py +1 -1
- qiskit/primitives/utils.py +1 -1
- qiskit/providers/__init__.py +3 -3
- qiskit/providers/backend.py +12 -1
- qiskit/providers/backend_compat.py +23 -3
- qiskit/providers/basic_provider/basic_simulator.py +12 -2
- qiskit/providers/fake_provider/fake_pulse_backend.py +6 -1
- qiskit/providers/fake_provider/generic_backend_v2.py +46 -30
- qiskit/providers/models/pulsedefaults.py +2 -0
- qiskit/pulse/builder.py +59 -18
- qiskit/pulse/calibration_entries.py +4 -1
- qiskit/pulse/channels.py +2 -0
- qiskit/pulse/exceptions.py +2 -0
- qiskit/pulse/instruction_schedule_map.py +21 -6
- qiskit/pulse/instructions/acquire.py +2 -0
- qiskit/pulse/instructions/delay.py +2 -0
- qiskit/pulse/instructions/directives.py +8 -0
- qiskit/pulse/instructions/frequency.py +3 -0
- qiskit/pulse/instructions/instruction.py +2 -0
- qiskit/pulse/instructions/phase.py +3 -0
- qiskit/pulse/instructions/play.py +2 -0
- qiskit/pulse/instructions/reference.py +2 -0
- qiskit/pulse/instructions/snapshot.py +2 -0
- qiskit/pulse/library/pulse.py +2 -0
- qiskit/pulse/library/symbolic_pulses.py +28 -0
- qiskit/pulse/library/waveform.py +2 -0
- qiskit/pulse/macros.py +1 -1
- qiskit/pulse/schedule.py +12 -13
- qiskit/pulse/transforms/alignments.py +5 -3
- qiskit/pulse/transforms/dag.py +7 -0
- qiskit/qasm2/export.py +5 -3
- qiskit/qasm2/parse.py +46 -2
- qiskit/qasm3/__init__.py +1 -0
- qiskit/qasm3/ast.py +123 -15
- qiskit/qasm3/exporter.py +103 -77
- qiskit/qobj/converters/pulse_instruction.py +6 -4
- qiskit/qpy/__init__.py +181 -0
- qiskit/qpy/binary_io/circuits.py +20 -5
- qiskit/qpy/binary_io/schedules.py +3 -4
- qiskit/qpy/binary_io/value.py +310 -13
- qiskit/qpy/common.py +46 -2
- qiskit/qpy/formats.py +7 -0
- qiskit/qpy/interface.py +40 -4
- qiskit/quantum_info/__init__.py +4 -0
- qiskit/quantum_info/operators/channel/transformations.py +28 -21
- qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
- qiskit/quantum_info/operators/operator.py +54 -8
- qiskit/quantum_info/operators/symplectic/base_pauli.py +11 -19
- qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +1 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +2 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +23 -2
- qiskit/quantum_info/states/densitymatrix.py +5 -5
- qiskit/quantum_info/states/stabilizerstate.py +1 -1
- qiskit/quantum_info/states/statevector.py +6 -6
- qiskit/result/mitigation/base_readout_mitigator.py +1 -1
- qiskit/result/mitigation/correlated_readout_mitigator.py +9 -1
- qiskit/result/mitigation/local_readout_mitigator.py +9 -1
- qiskit/result/mitigation/utils.py +57 -0
- qiskit/scheduler/config.py +2 -0
- qiskit/scheduler/methods/basic.py +3 -0
- qiskit/scheduler/schedule_circuit.py +2 -0
- qiskit/scheduler/sequence.py +2 -0
- qiskit/synthesis/__init__.py +25 -0
- qiskit/synthesis/arithmetic/__init__.py +16 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +1 -2
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +3 -2
- qiskit/synthesis/clifford/clifford_decompose_layers.py +2 -1
- qiskit/synthesis/evolution/__init__.py +1 -0
- qiskit/synthesis/evolution/lie_trotter.py +16 -42
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +165 -238
- qiskit/synthesis/evolution/qdrift.py +36 -29
- qiskit/synthesis/evolution/suzuki_trotter.py +87 -27
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/qft/qft_decompose_full.py +19 -1
- qiskit/synthesis/qft/qft_decompose_lnn.py +2 -1
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -1
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +4 -63
- qiskit/synthesis/unitary/qsd.py +5 -5
- qiskit/transpiler/__init__.py +21 -14
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/passes/__init__.py +2 -0
- qiskit/transpiler/passes/basis/basis_translator.py +9 -565
- qiskit/transpiler/passes/basis/decompose.py +45 -12
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
- qiskit/transpiler/passes/calibration/pulse_gate.py +4 -2
- qiskit/transpiler/passes/calibration/rx_builder.py +11 -7
- qiskit/transpiler/passes/calibration/rzx_builder.py +46 -30
- qiskit/transpiler/passes/layout/disjoint_utils.py +15 -13
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -2
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +5 -0
- qiskit/transpiler/passes/optimization/__init__.py +1 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +19 -3
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +48 -131
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +4 -2
- qiskit/transpiler/passes/optimization/elide_permutations.py +9 -32
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +5 -11
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +7 -3
- qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
- qiskit/transpiler/passes/scheduling/alap.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
- qiskit/transpiler/passes/scheduling/asap.py +1 -1
- qiskit/transpiler/passes/scheduling/base_scheduler.py +14 -12
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +9 -4
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +16 -5
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +4 -1
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +6 -2
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +9 -4
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +262 -99
- qiskit/transpiler/passes/synthesis/hls_plugins.py +637 -7
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +55 -34
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +2 -56
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +5 -0
- qiskit/transpiler/passes/utils/gate_direction.py +12 -275
- qiskit/transpiler/passes/utils/gates_basis.py +7 -30
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +2 -1
- qiskit/transpiler/passmanager_config.py +22 -4
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +40 -14
- qiskit/transpiler/preset_passmanagers/common.py +5 -3
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +125 -42
- qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
- qiskit/transpiler/target.py +74 -16
- qiskit/utils/deprecate_pulse.py +119 -0
- qiskit/visualization/circuit/_utils.py +2 -2
- qiskit/visualization/circuit/circuit_visualization.py +3 -2
- qiskit/visualization/circuit/matplotlib.py +1 -1
- qiskit/visualization/dag_visualization.py +1 -1
- qiskit/visualization/pass_manager_visualization.py +3 -14
- qiskit/visualization/pulse_v2/interface.py +3 -1
- qiskit/visualization/timeline/core.py +25 -2
- qiskit/visualization/timeline/interface.py +12 -0
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/METADATA +9 -8
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/RECORD +357 -346
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/WHEEL +1 -1
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/entry_points.txt +19 -0
- qiskit/circuit/library/data_preparation/zz_feature_map.py +0 -118
- qiskit/synthesis/two_qubit/weyl.py +0 -97
- qiskit/transpiler/passes/synthesis/qubit_tracker.py +0 -132
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,145 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2024
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""The twirling module."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
import typing
|
17
|
+
|
18
|
+
from qiskit._accelerate.twirling import twirl_circuit as twirl_rs
|
19
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit, _copy_metadata
|
20
|
+
from qiskit.circuit.gate import Gate
|
21
|
+
from qiskit.circuit.library.standard_gates import CXGate, ECRGate, CZGate, iSwapGate
|
22
|
+
from qiskit.exceptions import QiskitError
|
23
|
+
|
24
|
+
if typing.TYPE_CHECKING:
|
25
|
+
from qiskit.transpiler.target import Target
|
26
|
+
|
27
|
+
|
28
|
+
NAME_TO_CLASS = {
|
29
|
+
"cx": CXGate._standard_gate,
|
30
|
+
"ecr": ECRGate._standard_gate,
|
31
|
+
"cz": CZGate._standard_gate,
|
32
|
+
"iswap": iSwapGate._standard_gate,
|
33
|
+
}
|
34
|
+
|
35
|
+
|
36
|
+
def pauli_twirl_2q_gates(
|
37
|
+
circuit: QuantumCircuit,
|
38
|
+
twirling_gate: None | str | Gate | list[str] | list[Gate] = None,
|
39
|
+
seed: int | None = None,
|
40
|
+
num_twirls: int | None = None,
|
41
|
+
target: Target | None = None,
|
42
|
+
) -> QuantumCircuit | list[QuantumCircuit]:
|
43
|
+
"""Create copies of a given circuit with Pauli twirling applied around specified two qubit
|
44
|
+
gates.
|
45
|
+
|
46
|
+
If you're running this function with the intent to twirl a circuit to run on hardware this
|
47
|
+
may not be the most efficient way to perform twirling. Especially if the hardware vendor
|
48
|
+
has implemented the :mod:`.primitives` execution interface with :class:`.SamplerV2` and
|
49
|
+
:class:`.EstimatorV2` this most likely is not the best way to apply twirling to your
|
50
|
+
circuit and you'll want to refer to the implementation of :class:`.SamplerV2` and/or
|
51
|
+
:class:`.EstimatorV2` for the specified hardware vendor.
|
52
|
+
|
53
|
+
If the intent of this function is to be run after :func:`.transpile` or
|
54
|
+
:meth:`.PassManager.run` the optional ``target`` argument can be used
|
55
|
+
so that the inserted 1 qubit Pauli gates are synthesized to be
|
56
|
+
compatible with the given :class:`.Target` so the output circuit(s) are
|
57
|
+
still compatible.
|
58
|
+
|
59
|
+
Args:
|
60
|
+
circuit: The circuit to twirl
|
61
|
+
twirling_gate: The gate to twirl, defaults to `None` which means twirl all default gates:
|
62
|
+
:class:`.CXGate`, :class:`.CZGate`, :class:`.ECRGate`, and :class:`.iSwapGate`.
|
63
|
+
If supplied it can either be a single gate or a list of gates either as either a gate
|
64
|
+
object or its string name. Currently only the names `"cx"`, `"cz"`, `"ecr"`, and
|
65
|
+
`"iswap"` are supported. If a gate object is provided outside the default gates it must
|
66
|
+
have a matrix defined from its :class:`~.Gate.to_matrix` method for the gate to potentially
|
67
|
+
be twirled. If a valid twirling configuration can't be computed that particular gate will
|
68
|
+
be silently ignored and not twirled.
|
69
|
+
seed: An integer seed for the random number generator used internally by this function.
|
70
|
+
If specified this must be between 0 and 18,446,744,073,709,551,615.
|
71
|
+
num_twirls: The number of twirling circuits to build. This defaults to ``None`` and will return
|
72
|
+
a single circuit. If it is an integer a list of circuits with `num_twirls` circuits
|
73
|
+
will be returned.
|
74
|
+
target: If specified an :class:`.Target` instance to use for running single qubit decomposition
|
75
|
+
as part of the Pauli twirling to optimize and map the pauli gates added to the circuit
|
76
|
+
to the specified target.
|
77
|
+
|
78
|
+
Returns:
|
79
|
+
A copy of the given circuit with Pauli twirling applied to each
|
80
|
+
instance of the specified twirling gate.
|
81
|
+
"""
|
82
|
+
custom_gates = None
|
83
|
+
if isinstance(twirling_gate, str):
|
84
|
+
gate = NAME_TO_CLASS.get(twirling_gate, None)
|
85
|
+
if gate is None:
|
86
|
+
raise QiskitError(f"The specified gate name {twirling_gate} is not supported")
|
87
|
+
twirling_std_gate = [gate]
|
88
|
+
elif isinstance(twirling_gate, list):
|
89
|
+
custom_gates = []
|
90
|
+
twirling_std_gate = []
|
91
|
+
for gate in twirling_gate:
|
92
|
+
if isinstance(gate, str):
|
93
|
+
gate = NAME_TO_CLASS.get(gate, None)
|
94
|
+
if gate is None:
|
95
|
+
raise QiskitError(f"The specified gate name {twirling_gate} is not supported")
|
96
|
+
twirling_std_gate.append(gate)
|
97
|
+
else:
|
98
|
+
twirling_gate = getattr(gate, "_standard_gate", None)
|
99
|
+
|
100
|
+
if twirling_gate is None:
|
101
|
+
custom_gates.append(gate)
|
102
|
+
else:
|
103
|
+
if twirling_gate in NAME_TO_CLASS.values():
|
104
|
+
twirling_std_gate.append(twirling_gate)
|
105
|
+
else:
|
106
|
+
custom_gates.append(gate)
|
107
|
+
if not custom_gates:
|
108
|
+
custom_gates = None
|
109
|
+
if not twirling_std_gate:
|
110
|
+
twirling_std_gate = None
|
111
|
+
elif twirling_gate is not None:
|
112
|
+
std_gate = getattr(twirling_gate, "_standard_gate", None)
|
113
|
+
if std_gate is None:
|
114
|
+
twirling_std_gate = None
|
115
|
+
custom_gates = [twirling_gate]
|
116
|
+
else:
|
117
|
+
if std_gate in NAME_TO_CLASS.values():
|
118
|
+
twirling_std_gate = [std_gate]
|
119
|
+
else:
|
120
|
+
twirling_std_gate = None
|
121
|
+
custom_gates = [twirling_gate]
|
122
|
+
else:
|
123
|
+
twirling_std_gate = twirling_gate
|
124
|
+
out_twirls = num_twirls
|
125
|
+
if out_twirls is None:
|
126
|
+
out_twirls = 1
|
127
|
+
new_data = twirl_rs(
|
128
|
+
circuit._data,
|
129
|
+
twirling_std_gate,
|
130
|
+
custom_gates,
|
131
|
+
seed,
|
132
|
+
out_twirls,
|
133
|
+
target,
|
134
|
+
)
|
135
|
+
if num_twirls is not None:
|
136
|
+
out_list = []
|
137
|
+
for circ in new_data:
|
138
|
+
new_circ = QuantumCircuit._from_circuit_data(circ)
|
139
|
+
_copy_metadata(circuit, new_circ, "alike")
|
140
|
+
out_list.append(new_circ)
|
141
|
+
return out_list
|
142
|
+
else:
|
143
|
+
out_circ = QuantumCircuit._from_circuit_data(new_data[0])
|
144
|
+
_copy_metadata(circuit, out_circ, "alike")
|
145
|
+
return out_circ
|
qiskit/compiler/assembler.py
CHANGED
@@ -189,6 +189,16 @@ def assemble(
|
|
189
189
|
)
|
190
190
|
|
191
191
|
|
192
|
+
# Note for future: this method is used in `BasicSimulator` and may need to be kept past the
|
193
|
+
# `assemble` removal deadline (2.0). If it is kept (potentially in a different location),
|
194
|
+
# we will need an alternative for the backend.configuration() access that currently takes
|
195
|
+
# place in L566 (`parse_circuit_args`) and L351 (`parse_common_args`)
|
196
|
+
# because backend.configuration() is also set for removal in 2.0.
|
197
|
+
# The ultimate goal will be to move away from relying on any kind of `assemble` implementation
|
198
|
+
# because of how tightly coupled it is to these legacy data structures. But as a transition step,
|
199
|
+
# given that we would only have to support the subcase of `BasicSimulator`, we could probably just
|
200
|
+
# inline the relevant config values that are already hardcoded in the basic simulator configuration
|
201
|
+
# generator.
|
192
202
|
def _assemble(
|
193
203
|
experiments: Union[
|
194
204
|
QuantumCircuit,
|
@@ -229,7 +239,7 @@ def _assemble(
|
|
229
239
|
experiments = experiments if isinstance(experiments, list) else [experiments]
|
230
240
|
pulse_qobj = any(isinstance(exp, (ScheduleBlock, Schedule, Instruction)) for exp in experiments)
|
231
241
|
with warnings.catch_warnings():
|
232
|
-
# The Qobj is deprecated
|
242
|
+
# The Qobj class is deprecated, the backend.configuration() method is too
|
233
243
|
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
234
244
|
qobj_id, qobj_header, run_config_common_dict = _parse_common_args(
|
235
245
|
backend,
|
@@ -554,9 +564,12 @@ def _parse_circuit_args(
|
|
554
564
|
run_config_dict = {"parameter_binds": parameter_binds, **run_config}
|
555
565
|
if parametric_pulses is None:
|
556
566
|
if backend:
|
557
|
-
|
558
|
-
backend.configuration
|
559
|
-
|
567
|
+
with warnings.catch_warnings():
|
568
|
+
# TODO (2.0): See comment on L192 regarding backend.configuration removal
|
569
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
570
|
+
run_config_dict["parametric_pulses"] = getattr(
|
571
|
+
backend.configuration(), "parametric_pulses", []
|
572
|
+
)
|
560
573
|
else:
|
561
574
|
run_config_dict["parametric_pulses"] = []
|
562
575
|
else:
|
qiskit/compiler/scheduler.py
CHANGED
@@ -26,6 +26,7 @@ from qiskit.providers.backend import Backend
|
|
26
26
|
from qiskit.scheduler.config import ScheduleConfig
|
27
27
|
from qiskit.scheduler.schedule_circuit import schedule_circuit
|
28
28
|
from qiskit.utils.parallel import parallel_map
|
29
|
+
from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
|
29
30
|
|
30
31
|
logger = logging.getLogger(__name__)
|
31
32
|
|
@@ -35,6 +36,7 @@ def _log_schedule_time(start_time, end_time):
|
|
35
36
|
logger.info(log_msg)
|
36
37
|
|
37
38
|
|
39
|
+
@deprecate_pulse_dependency(moving_to_dynamics=True)
|
38
40
|
def schedule(
|
39
41
|
circuits: Union[QuantumCircuit, List[QuantumCircuit]],
|
40
42
|
backend: Optional[Backend] = None,
|
qiskit/compiler/sequencer.py
CHANGED
@@ -21,8 +21,10 @@ from qiskit.providers.backend import Backend
|
|
21
21
|
from qiskit.pulse import InstructionScheduleMap, Schedule
|
22
22
|
from qiskit.scheduler import ScheduleConfig
|
23
23
|
from qiskit.scheduler.sequence import sequence as _sequence
|
24
|
+
from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
|
24
25
|
|
25
26
|
|
27
|
+
@deprecate_pulse_dependency(moving_to_dynamics=True)
|
26
28
|
def sequence(
|
27
29
|
scheduled_circuits: Union[QuantumCircuit, List[QuantumCircuit]],
|
28
30
|
backend: Optional[Backend] = None,
|
qiskit/compiler/transpiler.py
CHANGED
@@ -32,12 +32,41 @@ from qiskit.transpiler.instruction_durations import InstructionDurationsType
|
|
32
32
|
from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig
|
33
33
|
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
|
34
34
|
from qiskit.transpiler.target import Target
|
35
|
+
from qiskit.utils import deprecate_arg
|
36
|
+
from qiskit.utils.deprecate_pulse import deprecate_pulse_arg
|
35
37
|
|
36
38
|
logger = logging.getLogger(__name__)
|
37
39
|
|
38
40
|
_CircuitT = TypeVar("_CircuitT", bound=Union[QuantumCircuit, List[QuantumCircuit]])
|
39
41
|
|
40
42
|
|
43
|
+
@deprecate_arg(
|
44
|
+
name="instruction_durations",
|
45
|
+
since="1.3",
|
46
|
+
package_name="Qiskit",
|
47
|
+
removal_timeline="in Qiskit 2.0",
|
48
|
+
additional_msg="The `target` parameter should be used instead. You can build a `Target` instance "
|
49
|
+
"with defined instruction durations with "
|
50
|
+
"`Target.from_configuration(..., instruction_durations=...)`",
|
51
|
+
)
|
52
|
+
@deprecate_arg(
|
53
|
+
name="timing_constraints",
|
54
|
+
since="1.3",
|
55
|
+
package_name="Qiskit",
|
56
|
+
removal_timeline="in Qiskit 2.0",
|
57
|
+
additional_msg="The `target` parameter should be used instead. You can build a `Target` instance "
|
58
|
+
"with defined timing constraints with "
|
59
|
+
"`Target.from_configuration(..., timing_constraints=...)`",
|
60
|
+
)
|
61
|
+
@deprecate_arg(
|
62
|
+
name="backend_properties",
|
63
|
+
since="1.3",
|
64
|
+
package_name="Qiskit",
|
65
|
+
removal_timeline="in Qiskit 2.0",
|
66
|
+
additional_msg="The `target` parameter should be used instead. You can build a `Target` instance "
|
67
|
+
"with defined properties with Target.from_configuration(..., backend_properties=...)",
|
68
|
+
)
|
69
|
+
@deprecate_pulse_arg("inst_map", predicate=lambda inst_map: inst_map is not None)
|
41
70
|
def transpile( # pylint: disable=too-many-return-statements
|
42
71
|
circuits: _CircuitT,
|
43
72
|
backend: Optional[Backend] = None,
|
@@ -104,7 +133,7 @@ def transpile( # pylint: disable=too-many-return-statements
|
|
104
133
|
will override the backend's.
|
105
134
|
basis_gates: List of basis gate names to unroll to
|
106
135
|
(e.g: ``['u1', 'u2', 'u3', 'cx']``). If ``None``, do not unroll.
|
107
|
-
inst_map: Mapping of unrolled gates to pulse schedules. If this is not provided,
|
136
|
+
inst_map: DEPRECATED. Mapping of unrolled gates to pulse schedules. If this is not provided,
|
108
137
|
transpiler tries to get from the backend. If any user defined calibration
|
109
138
|
is found in the map and this is used in a circuit, transpiler attaches
|
110
139
|
the custom gate definition to the circuit. This enables one to flexibly
|
@@ -365,31 +394,57 @@ def transpile( # pylint: disable=too-many-return-statements
|
|
365
394
|
# Edge cases require using the old model (loose constraints) instead of building a target,
|
366
395
|
# but we don't populate the passmanager config with loose constraints unless it's one of
|
367
396
|
# the known edge cases to control the execution path.
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
397
|
+
# Filter instruction_durations, timing_constraints, backend_properties and inst_map deprecation
|
398
|
+
with warnings.catch_warnings():
|
399
|
+
warnings.filterwarnings(
|
400
|
+
"ignore",
|
401
|
+
category=DeprecationWarning,
|
402
|
+
message=".*``inst_map`` is deprecated as of Qiskit 1.3.*",
|
403
|
+
module="qiskit",
|
404
|
+
)
|
405
|
+
warnings.filterwarnings(
|
406
|
+
"ignore",
|
407
|
+
category=DeprecationWarning,
|
408
|
+
message=".*``timing_constraints`` is deprecated as of Qiskit 1.3.*",
|
409
|
+
module="qiskit",
|
410
|
+
)
|
411
|
+
warnings.filterwarnings(
|
412
|
+
"ignore",
|
413
|
+
category=DeprecationWarning,
|
414
|
+
message=".*``instruction_durations`` is deprecated as of Qiskit 1.3.*",
|
415
|
+
module="qiskit",
|
416
|
+
)
|
417
|
+
warnings.filterwarnings(
|
418
|
+
"ignore",
|
419
|
+
category=DeprecationWarning,
|
420
|
+
message=".*``backend_properties`` is deprecated as of Qiskit 1.3.*",
|
421
|
+
module="qiskit",
|
422
|
+
)
|
423
|
+
pm = generate_preset_pass_manager(
|
424
|
+
optimization_level,
|
425
|
+
target=target,
|
426
|
+
backend=backend,
|
427
|
+
basis_gates=basis_gates,
|
428
|
+
coupling_map=coupling_map,
|
429
|
+
instruction_durations=instruction_durations,
|
430
|
+
backend_properties=backend_properties,
|
431
|
+
timing_constraints=timing_constraints,
|
432
|
+
inst_map=inst_map,
|
433
|
+
initial_layout=initial_layout,
|
434
|
+
layout_method=layout_method,
|
435
|
+
routing_method=routing_method,
|
436
|
+
translation_method=translation_method,
|
437
|
+
scheduling_method=scheduling_method,
|
438
|
+
approximation_degree=approximation_degree,
|
439
|
+
seed_transpiler=seed_transpiler,
|
440
|
+
unitary_synthesis_method=unitary_synthesis_method,
|
441
|
+
unitary_synthesis_plugin_config=unitary_synthesis_plugin_config,
|
442
|
+
hls_config=hls_config,
|
443
|
+
init_method=init_method,
|
444
|
+
optimization_method=optimization_method,
|
445
|
+
dt=dt,
|
446
|
+
qubits_initially_zero=qubits_initially_zero,
|
447
|
+
)
|
393
448
|
|
394
449
|
out_circuits = pm.run(circuits, callback=callback, num_processes=num_processes)
|
395
450
|
|
@@ -73,6 +73,6 @@ def circuit_to_dag(circuit, copy_operations=True, *, qubit_order=None, clbit_ord
|
|
73
73
|
|
74
74
|
dagcircuit = core_circuit_to_dag(circuit, copy_operations, qubit_order, clbit_order)
|
75
75
|
|
76
|
-
dagcircuit.duration = circuit.
|
77
|
-
dagcircuit.unit = circuit.
|
76
|
+
dagcircuit.duration = circuit._duration
|
77
|
+
dagcircuit.unit = circuit._unit
|
78
78
|
return dagcircuit
|
@@ -46,6 +46,6 @@ def circuit_to_dagdependency(circuit, create_preds_and_succs=True):
|
|
46
46
|
dagdependency._add_predecessors()
|
47
47
|
dagdependency._add_successors()
|
48
48
|
|
49
|
-
dagdependency.
|
49
|
+
dagdependency._calibrations = circuit._calibrations_prop
|
50
50
|
|
51
51
|
return dagdependency
|
@@ -27,7 +27,7 @@ def _circuit_to_dagdependency_v2(circuit):
|
|
27
27
|
dagdependency = _DAGDependencyV2()
|
28
28
|
dagdependency.name = circuit.name
|
29
29
|
dagdependency.metadata = circuit.metadata
|
30
|
-
dagdependency.
|
30
|
+
dagdependency._calibrations = circuit._calibrations_prop
|
31
31
|
dagdependency.global_phase = circuit.global_phase
|
32
32
|
|
33
33
|
dagdependency.add_qubits(circuit.qubits)
|
@@ -125,7 +125,7 @@ def circuit_to_instruction(circuit, parameter_map=None, equivalence_library=None
|
|
125
125
|
if (out := operation_map.get(original_id)) is not None:
|
126
126
|
return out
|
127
127
|
|
128
|
-
condition = getattr(op, "
|
128
|
+
condition = getattr(op, "_condition", None)
|
129
129
|
if condition:
|
130
130
|
reg, val = condition
|
131
131
|
if isinstance(reg, Clbit):
|
@@ -13,6 +13,7 @@
|
|
13
13
|
"""Helper function for converting a dag to a circuit."""
|
14
14
|
|
15
15
|
from qiskit.circuit import QuantumCircuit
|
16
|
+
from qiskit._accelerate.converters import dag_to_circuit as dag_to_circuit_rs
|
16
17
|
|
17
18
|
|
18
19
|
def dag_to_circuit(dag, copy_operations=True):
|
@@ -54,6 +55,8 @@ def dag_to_circuit(dag, copy_operations=True):
|
|
54
55
|
"""
|
55
56
|
|
56
57
|
name = dag.name or None
|
58
|
+
|
59
|
+
circuit_data = dag_to_circuit_rs(dag, copy_operations)
|
57
60
|
circuit = QuantumCircuit(
|
58
61
|
dag.qubits,
|
59
62
|
dag.clbits,
|
@@ -67,11 +70,10 @@ def dag_to_circuit(dag, copy_operations=True):
|
|
67
70
|
for var in dag.iter_declared_vars():
|
68
71
|
circuit.add_uninitialized_var(var)
|
69
72
|
circuit.metadata = dag.metadata
|
70
|
-
circuit.
|
73
|
+
circuit._calibrations_prop = dag._calibrations_prop
|
71
74
|
|
72
|
-
|
73
|
-
circuit._append(node._to_circuit_instruction(deepcopy=copy_operations))
|
75
|
+
circuit._data = circuit_data
|
74
76
|
|
75
|
-
circuit.
|
76
|
-
circuit.
|
77
|
+
circuit._duration = dag.duration
|
78
|
+
circuit._unit = dag.unit
|
77
79
|
return circuit
|
@@ -50,6 +50,6 @@ def dag_to_dagdependency(dag, create_preds_and_succs=True):
|
|
50
50
|
|
51
51
|
# copy metadata
|
52
52
|
dagdependency.global_phase = dag.global_phase
|
53
|
-
dagdependency.
|
53
|
+
dagdependency._calibrations_prop = dag._calibrations_prop
|
54
54
|
|
55
55
|
return dagdependency
|
@@ -27,7 +27,7 @@ def _dag_to_dagdependency_v2(dag):
|
|
27
27
|
dagdependency.name = dag.name
|
28
28
|
dagdependency.metadata = dag.metadata
|
29
29
|
dagdependency.global_phase = dag.global_phase
|
30
|
-
dagdependency.calibrations = dag.
|
30
|
+
dagdependency.calibrations = dag._calibrations_prop
|
31
31
|
|
32
32
|
dagdependency.add_qubits(dag.qubits)
|
33
33
|
dagdependency.add_clbits(dag.clbits)
|
@@ -34,7 +34,11 @@ def dagdependency_to_circuit(dagdependency):
|
|
34
34
|
)
|
35
35
|
circuit.metadata = dagdependency.metadata
|
36
36
|
|
37
|
-
|
37
|
+
if hasattr(dagdependency, "_calibrations_prop"):
|
38
|
+
circuit._calibrations_prop = dagdependency._calibrations_prop
|
39
|
+
else:
|
40
|
+
# This can be _DAGDependencyV2
|
41
|
+
circuit._calibrations_prop = dagdependency.calibrations
|
38
42
|
|
39
43
|
for node in dagdependency.topological_nodes():
|
40
44
|
circuit._append(CircuitInstruction(node.op.copy(), node.qargs, node.cargs))
|
@@ -12,6 +12,7 @@
|
|
12
12
|
|
13
13
|
"""Helper function for converting a dag dependency to a dag circuit"""
|
14
14
|
from qiskit.dagcircuit.dagcircuit import DAGCircuit
|
15
|
+
from qiskit.dagcircuit.dagdependency import DAGDependency
|
15
16
|
|
16
17
|
|
17
18
|
def dagdependency_to_dag(dagdependency):
|
@@ -44,6 +45,10 @@ def dagdependency_to_dag(dagdependency):
|
|
44
45
|
|
45
46
|
# copy metadata
|
46
47
|
dagcircuit.global_phase = dagdependency.global_phase
|
47
|
-
|
48
|
+
if isinstance(dagdependency, DAGDependency):
|
49
|
+
dagcircuit._calibrations_prop = dagdependency._calibrations_prop
|
50
|
+
else:
|
51
|
+
# This can be _DAGDependencyV2
|
52
|
+
dagcircuit._calibrations_prop = dagdependency.calibrations
|
48
53
|
|
49
54
|
return dagcircuit
|
@@ -306,7 +306,7 @@ def split_block_into_layers(block: list[DAGOpNode | DAGDepNode]):
|
|
306
306
|
cur_bits = set(node.qargs)
|
307
307
|
cur_bits.update(node.cargs)
|
308
308
|
|
309
|
-
cond = getattr(node.op, "
|
309
|
+
cond = getattr(node.op, "_condition", None)
|
310
310
|
if cond is not None:
|
311
311
|
cur_bits.update(condition_resources(cond).clbits)
|
312
312
|
|
@@ -356,7 +356,7 @@ class BlockCollapser:
|
|
356
356
|
for node in block:
|
357
357
|
cur_qubits.update(node.qargs)
|
358
358
|
cur_clbits.update(node.cargs)
|
359
|
-
cond = getattr(node.op, "
|
359
|
+
cond = getattr(node.op, "_condition", None)
|
360
360
|
if cond is not None:
|
361
361
|
cur_clbits.update(condition_resources(cond).clbits)
|
362
362
|
if isinstance(cond[0], ClassicalRegister):
|
@@ -378,7 +378,7 @@ class BlockCollapser:
|
|
378
378
|
|
379
379
|
for node in block:
|
380
380
|
instructions = qc.append(CircuitInstruction(node.op, node.qargs, node.cargs))
|
381
|
-
cond = getattr(node.op, "
|
381
|
+
cond = getattr(node.op, "_condition", None)
|
382
382
|
if cond is not None:
|
383
383
|
instructions.c_if(*cond)
|
384
384
|
|
@@ -29,6 +29,7 @@ from qiskit.circuit.classicalregister import ClassicalRegister, Clbit
|
|
29
29
|
from qiskit.dagcircuit.exceptions import DAGDependencyError
|
30
30
|
from qiskit.dagcircuit.dagdepnode import DAGDepNode
|
31
31
|
from qiskit.pulse import Schedule
|
32
|
+
from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
|
32
33
|
|
33
34
|
if typing.TYPE_CHECKING:
|
34
35
|
from qiskit.circuit.parameterexpression import ParameterExpression
|
@@ -71,7 +72,7 @@ class DAGDependency:
|
|
71
72
|
|
72
73
|
Bell circuit with no measurement.
|
73
74
|
|
74
|
-
..
|
75
|
+
.. code-block:: text
|
75
76
|
|
76
77
|
┌───┐
|
77
78
|
qr_0: ┤ H ├──■──
|
@@ -146,15 +147,17 @@ class DAGDependency:
|
|
146
147
|
self._global_phase = angle % (2 * math.pi)
|
147
148
|
|
148
149
|
@property
|
150
|
+
@deprecate_pulse_dependency(is_property=True)
|
149
151
|
def calibrations(self) -> dict[str, dict[tuple, Schedule]]:
|
150
152
|
"""Return calibration dictionary.
|
151
153
|
|
152
154
|
The custom pulse definition of a given gate is of the form
|
153
155
|
``{'gate_name': {(qubits, params): schedule}}``.
|
154
156
|
"""
|
155
|
-
return
|
157
|
+
return self._calibrations_prop
|
156
158
|
|
157
159
|
@calibrations.setter
|
160
|
+
@deprecate_pulse_dependency(is_property=True)
|
158
161
|
def calibrations(self, calibrations: dict[str, dict[tuple, Schedule]]):
|
159
162
|
"""Set the circuit calibration data from a dictionary of calibration definition.
|
160
163
|
|
@@ -162,6 +165,16 @@ class DAGDependency:
|
|
162
165
|
calibrations (dict): A dictionary of input in the format
|
163
166
|
{'gate_name': {(qubits, gate_params): schedule}}
|
164
167
|
"""
|
168
|
+
self._calibrations_prop = calibrations
|
169
|
+
|
170
|
+
@property
|
171
|
+
def _calibrations_prop(self) -> dict[str, dict[tuple, Schedule]]:
|
172
|
+
"""An alternative path to be used internally to avoid deprecation warnings"""
|
173
|
+
return dict(self._calibrations)
|
174
|
+
|
175
|
+
@_calibrations_prop.setter
|
176
|
+
def _calibrations_prop(self, calibrations: dict[str, dict[tuple, Schedule]]):
|
177
|
+
"""An alternative path to be used internally to avoid deprecation warnings"""
|
165
178
|
self._calibrations = defaultdict(dict, calibrations)
|
166
179
|
|
167
180
|
def to_retworkx(self):
|
@@ -396,13 +409,13 @@ class DAGDependency:
|
|
396
409
|
for elem in qargs:
|
397
410
|
qindices_list.append(self.qubits.index(elem))
|
398
411
|
|
399
|
-
if getattr(operation, "
|
412
|
+
if getattr(operation, "_condition", None):
|
400
413
|
# The change to handling operation.condition follows code patterns in quantum_circuit.py.
|
401
414
|
# However:
|
402
415
|
# (1) cindices_list are specific to template optimization and should not be computed
|
403
416
|
# in this place.
|
404
417
|
# (2) Template optimization pass needs currently does not handle general conditions.
|
405
|
-
cond_bits = condition_resources(operation.
|
418
|
+
cond_bits = condition_resources(operation._condition).clbits
|
406
419
|
cindices_list = [self.clbits.index(clbit) for clbit in cond_bits]
|
407
420
|
else:
|
408
421
|
cindices_list = []
|
@@ -596,7 +609,7 @@ class DAGDependency:
|
|
596
609
|
for nd in node_block:
|
597
610
|
block_qargs |= set(nd.qargs)
|
598
611
|
block_cargs |= set(nd.cargs)
|
599
|
-
cond = getattr(nd.op, "
|
612
|
+
cond = getattr(nd.op, "_condition", None)
|
600
613
|
if cond is not None:
|
601
614
|
block_cargs.update(condition_resources(cond).clbits)
|
602
615
|
|
qiskit/dagcircuit/dagnode.py
CHANGED
@@ -92,8 +92,8 @@ def _make_expr_key(bit_indices):
|
|
92
92
|
|
93
93
|
|
94
94
|
def _condition_op_eq(node1, node2, bit_indices1, bit_indices2):
|
95
|
-
cond1 = node1.
|
96
|
-
cond2 = node2.
|
95
|
+
cond1 = node1.condition
|
96
|
+
cond2 = node2.condition
|
97
97
|
if isinstance(cond1, expr.Expr) and isinstance(cond2, expr.Expr):
|
98
98
|
if not expr.structurally_equivalent(
|
99
99
|
cond1, cond2, _make_expr_key(bit_indices1), _make_expr_key(bit_indices2)
|
qiskit/passmanager/__init__.py
CHANGED
@@ -133,7 +133,7 @@ new numbers that don't contain five.
|
|
133
133
|
|
134
134
|
Output:
|
135
135
|
|
136
|
-
..
|
136
|
+
.. code-block:: text
|
137
137
|
|
138
138
|
[12346789, 464, 36784]
|
139
139
|
|
@@ -178,7 +178,7 @@ As before, we schedule these passes with the pass manager and run.
|
|
178
178
|
|
179
179
|
Output:
|
180
180
|
|
181
|
-
..
|
181
|
+
.. code-block:: text
|
182
182
|
|
183
183
|
[12346789, 45654, 36784]
|
184
184
|
|
@@ -44,13 +44,15 @@ from .utils import _circuit_key, _observable_key, init_observable
|
|
44
44
|
def _run_circuits(
|
45
45
|
circuits: QuantumCircuit | list[QuantumCircuit],
|
46
46
|
backend: BackendV1 | BackendV2,
|
47
|
+
clear_metadata: bool = True,
|
47
48
|
**run_options,
|
48
49
|
) -> tuple[list[Result], list[dict]]:
|
49
50
|
"""Remove metadata of circuits and run the circuits on a backend.
|
50
51
|
Args:
|
51
52
|
circuits: The circuits
|
52
53
|
backend: The backend
|
53
|
-
|
54
|
+
clear_metadata: Clear circuit metadata before passing to backend.run if
|
55
|
+
True.
|
54
56
|
**run_options: run_options
|
55
57
|
Returns:
|
56
58
|
The result and the metadata of the circuits
|
@@ -60,7 +62,8 @@ def _run_circuits(
|
|
60
62
|
metadata = []
|
61
63
|
for circ in circuits:
|
62
64
|
metadata.append(circ.metadata)
|
63
|
-
|
65
|
+
if clear_metadata:
|
66
|
+
circ.metadata = {}
|
64
67
|
if isinstance(backend, BackendV1):
|
65
68
|
max_circuits = getattr(backend.configuration(), "max_experiments", None)
|
66
69
|
elif isinstance(backend, BackendV2):
|