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
qiskit/circuit/quantumcircuit.py
CHANGED
@@ -47,6 +47,7 @@ from qiskit.circuit.gate import Gate
|
|
47
47
|
from qiskit.circuit.parameter import Parameter
|
48
48
|
from qiskit.circuit.exceptions import CircuitError
|
49
49
|
from qiskit.utils import deprecate_func
|
50
|
+
from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
|
50
51
|
from . import _classical_resource_map
|
51
52
|
from .controlflow import ControlFlowOp, _builder_utils
|
52
53
|
from .controlflow.builder import CircuitScopeInterface, ControlFlowBuilderBlock
|
@@ -70,6 +71,7 @@ from .quantumcircuitdata import QuantumCircuitData, CircuitInstruction
|
|
70
71
|
from .delay import Delay
|
71
72
|
from .store import Store
|
72
73
|
|
74
|
+
|
73
75
|
if typing.TYPE_CHECKING:
|
74
76
|
import qiskit # pylint: disable=cyclic-import
|
75
77
|
from qiskit.transpiler.layout import TranspileLayout # pylint: disable=cyclic-import
|
@@ -876,7 +878,7 @@ class QuantumCircuit:
|
|
876
878
|
|
877
879
|
qc.count_ops()
|
878
880
|
|
879
|
-
..
|
881
|
+
.. code-block:: text
|
880
882
|
|
881
883
|
OrderedDict([('cx', 8), ('h', 5), ('x', 3), ('swap', 3)])
|
882
884
|
|
@@ -1145,21 +1147,41 @@ class QuantumCircuit:
|
|
1145
1147
|
for var, initial in declarations:
|
1146
1148
|
self.add_var(var, initial)
|
1147
1149
|
|
1148
|
-
self.
|
1149
|
-
|
1150
|
-
specified by :attr:`unit`."""
|
1151
|
-
self.unit = "dt"
|
1152
|
-
"""The unit that :attr:`duration` is specified in."""
|
1150
|
+
self._duration = None
|
1151
|
+
self._unit = "dt"
|
1153
1152
|
self.metadata = {} if metadata is None else metadata
|
1154
1153
|
"""Arbitrary user-defined metadata for the circuit.
|
1155
|
-
|
1154
|
+
|
1156
1155
|
Qiskit will not examine the content of this mapping, but it will pass it through the
|
1157
1156
|
transpiler and reattach it to the output, so you can track your own metadata."""
|
1158
1157
|
|
1158
|
+
@property
|
1159
|
+
@deprecate_func(since="1.3.0", removal_timeline="in Qiskit 2.0.0", is_property=True)
|
1160
|
+
def duration(self):
|
1161
|
+
"""The total duration of the circuit, set by a scheduling transpiler pass. Its unit is
|
1162
|
+
specified by :attr:`unit`."""
|
1163
|
+
return self._duration
|
1164
|
+
|
1165
|
+
@duration.setter
|
1166
|
+
def duration(self, value: int | float | None):
|
1167
|
+
self._duration = value
|
1168
|
+
|
1169
|
+
@property
|
1170
|
+
@deprecate_func(since="1.3.0", removal_timeline="in Qiskit 2.0.0", is_property=True)
|
1171
|
+
def unit(self):
|
1172
|
+
"""The unit that :attr:`duration` is specified in."""
|
1173
|
+
return self._unit
|
1174
|
+
|
1175
|
+
@unit.setter
|
1176
|
+
def unit(self, value):
|
1177
|
+
self._unit = value
|
1178
|
+
|
1159
1179
|
@classmethod
|
1160
|
-
def _from_circuit_data(
|
1180
|
+
def _from_circuit_data(
|
1181
|
+
cls, data: CircuitData, add_regs: bool = False, name: str | None = None
|
1182
|
+
) -> typing.Self:
|
1161
1183
|
"""A private constructor from rust space circuit data."""
|
1162
|
-
out = QuantumCircuit()
|
1184
|
+
out = QuantumCircuit(name=name)
|
1163
1185
|
|
1164
1186
|
if data.num_qubits > 0:
|
1165
1187
|
if add_regs:
|
@@ -1321,15 +1343,17 @@ class QuantumCircuit:
|
|
1321
1343
|
return self._op_start_times
|
1322
1344
|
|
1323
1345
|
@property
|
1346
|
+
@deprecate_pulse_dependency(is_property=True)
|
1324
1347
|
def calibrations(self) -> dict:
|
1325
1348
|
"""Return calibration dictionary.
|
1326
1349
|
|
1327
1350
|
The custom pulse definition of a given gate is of the form
|
1328
1351
|
``{'gate_name': {(qubits, params): schedule}}``
|
1329
1352
|
"""
|
1330
|
-
return
|
1353
|
+
return self._calibrations_prop
|
1331
1354
|
|
1332
1355
|
@calibrations.setter
|
1356
|
+
@deprecate_pulse_dependency(is_property=True)
|
1333
1357
|
def calibrations(self, calibrations: dict):
|
1334
1358
|
"""Set the circuit calibration data from a dictionary of calibration definition.
|
1335
1359
|
|
@@ -1337,18 +1361,37 @@ class QuantumCircuit:
|
|
1337
1361
|
calibrations (dict): A dictionary of input in the format
|
1338
1362
|
``{'gate_name': {(qubits, gate_params): schedule}}``
|
1339
1363
|
"""
|
1364
|
+
self._calibrations_prop = calibrations
|
1365
|
+
|
1366
|
+
@property
|
1367
|
+
def _calibrations_prop(self) -> dict:
|
1368
|
+
"""An alternative private path to the `calibrations` property for
|
1369
|
+
avoiding deprecation warnings."""
|
1370
|
+
return dict(self._calibrations)
|
1371
|
+
|
1372
|
+
@_calibrations_prop.setter
|
1373
|
+
def _calibrations_prop(self, calibrations: dict):
|
1374
|
+
"""An alternative private path to the `calibrations` property for
|
1375
|
+
avoiding deprecation warnings."""
|
1340
1376
|
self._calibrations = defaultdict(dict, calibrations)
|
1341
1377
|
|
1378
|
+
@deprecate_pulse_dependency
|
1342
1379
|
def has_calibration_for(self, instruction: CircuitInstruction | tuple):
|
1343
1380
|
"""Return True if the circuit has a calibration defined for the instruction context. In this
|
1344
1381
|
case, the operation does not need to be translated to the device basis.
|
1345
1382
|
"""
|
1383
|
+
|
1384
|
+
return self._has_calibration_for(instruction)
|
1385
|
+
|
1386
|
+
def _has_calibration_for(self, instruction: CircuitInstruction | tuple):
|
1387
|
+
"""An alternative private path to the `has_calibration_for` method for
|
1388
|
+
avoiding deprecation warnings."""
|
1346
1389
|
if isinstance(instruction, CircuitInstruction):
|
1347
1390
|
operation = instruction.operation
|
1348
1391
|
qubits = instruction.qubits
|
1349
1392
|
else:
|
1350
1393
|
operation, qubits, _ = instruction
|
1351
|
-
if not self.
|
1394
|
+
if not self._calibrations_prop or operation.name not in self._calibrations_prop:
|
1352
1395
|
return False
|
1353
1396
|
qubits = tuple(self.qubits.index(qubit) for qubit in qubits)
|
1354
1397
|
params = []
|
@@ -1358,7 +1401,7 @@ class QuantumCircuit:
|
|
1358
1401
|
else:
|
1359
1402
|
params.append(p)
|
1360
1403
|
params = tuple(params)
|
1361
|
-
return (qubits, params) in self.
|
1404
|
+
return (qubits, params) in self._calibrations_prop[operation.name]
|
1362
1405
|
|
1363
1406
|
@property
|
1364
1407
|
def metadata(self) -> dict:
|
@@ -1494,7 +1537,7 @@ class QuantumCircuit:
|
|
1494
1537
|
|
1495
1538
|
input:
|
1496
1539
|
|
1497
|
-
..
|
1540
|
+
.. code-block:: text
|
1498
1541
|
|
1499
1542
|
┌───┐
|
1500
1543
|
q_0: ┤ H ├─────■──────
|
@@ -1504,7 +1547,7 @@ class QuantumCircuit:
|
|
1504
1547
|
|
1505
1548
|
output:
|
1506
1549
|
|
1507
|
-
..
|
1550
|
+
.. code-block:: text
|
1508
1551
|
|
1509
1552
|
┌───┐
|
1510
1553
|
q_0: ─────■──────┤ H ├
|
@@ -1538,7 +1581,7 @@ class QuantumCircuit:
|
|
1538
1581
|
|
1539
1582
|
input:
|
1540
1583
|
|
1541
|
-
..
|
1584
|
+
.. code-block:: text
|
1542
1585
|
|
1543
1586
|
┌───┐
|
1544
1587
|
a_0: ┤ H ├──■─────────────────
|
@@ -1554,7 +1597,7 @@ class QuantumCircuit:
|
|
1554
1597
|
|
1555
1598
|
output:
|
1556
1599
|
|
1557
|
-
..
|
1600
|
+
.. code-block:: text
|
1558
1601
|
|
1559
1602
|
┌───┐
|
1560
1603
|
b_0: ────────────────────┤ X ├
|
@@ -1608,7 +1651,7 @@ class QuantumCircuit:
|
|
1608
1651
|
|
1609
1652
|
input:
|
1610
1653
|
|
1611
|
-
..
|
1654
|
+
.. code-block:: text
|
1612
1655
|
|
1613
1656
|
┌───┐
|
1614
1657
|
q_0: ┤ H ├─────■──────
|
@@ -1618,7 +1661,7 @@ class QuantumCircuit:
|
|
1618
1661
|
|
1619
1662
|
output:
|
1620
1663
|
|
1621
|
-
..
|
1664
|
+
.. code-block:: text
|
1622
1665
|
|
1623
1666
|
┌───┐
|
1624
1667
|
q_0: ──────■──────┤ H ├
|
@@ -1860,7 +1903,7 @@ class QuantumCircuit:
|
|
1860
1903
|
|
1861
1904
|
>>> lhs.compose(rhs, qubits=[3, 2], inplace=True)
|
1862
1905
|
|
1863
|
-
..
|
1906
|
+
.. code-block:: text
|
1864
1907
|
|
1865
1908
|
┌───┐ ┌─────┐ ┌───┐
|
1866
1909
|
lqr_1_0: ───┤ H ├─── rqr_0: ──■──┤ Tdg ├ lqr_1_0: ───┤ H ├───────────────
|
@@ -1999,7 +2042,7 @@ class QuantumCircuit:
|
|
1999
2042
|
)
|
2000
2043
|
edge_map.update(zip(other.clbits, dest._cbit_argument_conversion(clbits)))
|
2001
2044
|
|
2002
|
-
for gate, cals in other.
|
2045
|
+
for gate, cals in other._calibrations_prop.items():
|
2003
2046
|
dest._calibrations[gate].update(cals)
|
2004
2047
|
|
2005
2048
|
dest.duration = None
|
@@ -2061,14 +2104,14 @@ class QuantumCircuit:
|
|
2061
2104
|
is_control_flow = isinstance(n_op, ControlFlowOp)
|
2062
2105
|
if (
|
2063
2106
|
not is_control_flow
|
2064
|
-
and (condition := getattr(n_op, "
|
2107
|
+
and (condition := getattr(n_op, "_condition", None)) is not None
|
2065
2108
|
):
|
2066
2109
|
n_op = n_op.copy() if n_op is op and copy else n_op
|
2067
2110
|
n_op.condition = variable_mapper.map_condition(condition)
|
2068
2111
|
elif is_control_flow:
|
2069
2112
|
n_op = n_op.replace_blocks(recurse_block(block) for block in n_op.blocks)
|
2070
2113
|
if isinstance(n_op, (IfElseOp, WhileLoopOp)):
|
2071
|
-
n_op.condition = variable_mapper.map_condition(n_op.
|
2114
|
+
n_op.condition = variable_mapper.map_condition(n_op._condition)
|
2072
2115
|
elif isinstance(n_op, SwitchCaseOp):
|
2073
2116
|
n_op.target = variable_mapper.map_target(n_op.target)
|
2074
2117
|
elif isinstance(n_op, Store):
|
@@ -2108,10 +2151,10 @@ class QuantumCircuit:
|
|
2108
2151
|
|
2109
2152
|
Remember that in the little-endian convention the leftmost operation will be at the bottom
|
2110
2153
|
of the circuit. See also
|
2111
|
-
`the docs <https://docs.quantum.ibm.com/
|
2154
|
+
`the docs <https://docs.quantum.ibm.com/guides/construct-circuits>`__
|
2112
2155
|
for more information.
|
2113
2156
|
|
2114
|
-
..
|
2157
|
+
.. code-block:: text
|
2115
2158
|
|
2116
2159
|
┌────────┐ ┌─────┐ ┌─────┐
|
2117
2160
|
q_0: ┤ bottom ├ ⊗ q_0: ┤ top ├ = q_0: ─┤ top ├──
|
@@ -2692,7 +2735,10 @@ class QuantumCircuit:
|
|
2692
2735
|
"""
|
2693
2736
|
if isinstance(name_or_param, str):
|
2694
2737
|
return self.get_parameter(name_or_param, None) is not None
|
2695
|
-
return
|
2738
|
+
return (
|
2739
|
+
isinstance(name_or_param, Parameter)
|
2740
|
+
and self.get_parameter(name_or_param.name, None) == name_or_param
|
2741
|
+
)
|
2696
2742
|
|
2697
2743
|
@typing.overload
|
2698
2744
|
def get_var(self, name: str, default: T) -> Union[expr.Var, T]: ...
|
@@ -3211,40 +3257,33 @@ class QuantumCircuit:
|
|
3211
3257
|
|
3212
3258
|
def decompose(
|
3213
3259
|
self,
|
3214
|
-
gates_to_decompose:
|
3260
|
+
gates_to_decompose: (
|
3261
|
+
str | Type[Instruction] | Sequence[str | Type[Instruction]] | None
|
3262
|
+
) = None,
|
3215
3263
|
reps: int = 1,
|
3216
|
-
) ->
|
3217
|
-
"""Call a decomposition pass on this circuit,
|
3218
|
-
to decompose one level (shallow decompose).
|
3264
|
+
) -> typing.Self:
|
3265
|
+
"""Call a decomposition pass on this circuit, to decompose one level (shallow decompose).
|
3219
3266
|
|
3220
3267
|
Args:
|
3221
|
-
gates_to_decompose
|
3222
|
-
|
3223
|
-
|
3224
|
-
|
3225
|
-
|
3226
|
-
reps
|
3268
|
+
gates_to_decompose: Optional subset of gates to decompose. Can be a gate type, such as
|
3269
|
+
``HGate``, or a gate name, such as "h", or a gate label, such as "My H Gate", or a
|
3270
|
+
list of any combination of these. If a gate name is entered, it will decompose all
|
3271
|
+
gates with that name, whether the gates have labels or not. Defaults to all gates in
|
3272
|
+
the circuit.
|
3273
|
+
reps: Optional number of times the circuit should be decomposed.
|
3227
3274
|
For instance, ``reps=2`` equals calling ``circuit.decompose().decompose()``.
|
3228
|
-
can decompose specific gates specific time
|
3229
3275
|
|
3230
3276
|
Returns:
|
3231
3277
|
QuantumCircuit: a circuit one level decomposed
|
3232
3278
|
"""
|
3233
3279
|
# pylint: disable=cyclic-import
|
3234
3280
|
from qiskit.transpiler.passes.basis.decompose import Decompose
|
3235
|
-
from qiskit.transpiler.passes.synthesis import HighLevelSynthesis
|
3236
3281
|
from qiskit.converters.circuit_to_dag import circuit_to_dag
|
3237
3282
|
from qiskit.converters.dag_to_circuit import dag_to_circuit
|
3238
3283
|
|
3239
3284
|
dag = circuit_to_dag(self, copy_operations=True)
|
3240
3285
|
|
3241
|
-
|
3242
|
-
# We should not rewrite the circuit using HLS when we have gates_to_decompose,
|
3243
|
-
# or else HLS will rewrite all objects with available plugins (e.g., Cliffords,
|
3244
|
-
# PermutationGates, and now also MCXGates)
|
3245
|
-
dag = HighLevelSynthesis().run(dag)
|
3246
|
-
|
3247
|
-
pass_ = Decompose(gates_to_decompose)
|
3286
|
+
pass_ = Decompose(gates_to_decompose, apply_synthesis=True)
|
3248
3287
|
for _ in range(reps):
|
3249
3288
|
dag = pass_.run(dag)
|
3250
3289
|
|
@@ -3486,7 +3525,7 @@ class QuantumCircuit:
|
|
3486
3525
|
|
3487
3526
|
for instruction in self._data:
|
3488
3527
|
objects = set(itertools.chain(instruction.qubits, instruction.clbits))
|
3489
|
-
if (condition := getattr(instruction.operation, "
|
3528
|
+
if (condition := getattr(instruction.operation, "_condition", None)) is not None:
|
3490
3529
|
objects.update(_builder_utils.condition_resources(condition).clbits)
|
3491
3530
|
if isinstance(condition, expr.Expr):
|
3492
3531
|
update_from_expr(objects, condition)
|
@@ -3589,7 +3628,7 @@ class QuantumCircuit:
|
|
3589
3628
|
else:
|
3590
3629
|
args = instruction.qubits + instruction.clbits
|
3591
3630
|
num_qargs = len(args) + (
|
3592
|
-
1 if getattr(instruction.operation, "
|
3631
|
+
1 if getattr(instruction.operation, "_condition", None) else 0
|
3593
3632
|
)
|
3594
3633
|
|
3595
3634
|
if num_qargs >= 2 and not getattr(instruction.operation, "_directive", False):
|
@@ -3715,39 +3754,13 @@ class QuantumCircuit:
|
|
3715
3754
|
f"invalid name for a circuit: '{name}'. The name must be a string or 'None'."
|
3716
3755
|
)
|
3717
3756
|
cpy = _copy.copy(self)
|
3718
|
-
|
3719
|
-
cpy
|
3720
|
-
cpy.cregs = self.cregs.copy()
|
3721
|
-
cpy._builder_api = _OuterCircuitScopeInterface(cpy)
|
3722
|
-
cpy._ancillas = self._ancillas.copy()
|
3723
|
-
cpy._qubit_indices = self._qubit_indices.copy()
|
3724
|
-
cpy._clbit_indices = self._clbit_indices.copy()
|
3725
|
-
|
3726
|
-
if vars_mode == "alike":
|
3727
|
-
# Note that this causes the local variables to be uninitialised, because the stores are
|
3728
|
-
# not copied. This can leave the circuit in a potentially dangerous state for users if
|
3729
|
-
# they don't re-add initializer stores.
|
3730
|
-
cpy._vars_local = self._vars_local.copy()
|
3731
|
-
cpy._vars_input = self._vars_input.copy()
|
3732
|
-
cpy._vars_capture = self._vars_capture.copy()
|
3733
|
-
elif vars_mode == "captures":
|
3734
|
-
cpy._vars_local = {}
|
3735
|
-
cpy._vars_input = {}
|
3736
|
-
cpy._vars_capture = {var.name: var for var in self.iter_vars()}
|
3737
|
-
elif vars_mode == "drop":
|
3738
|
-
cpy._vars_local = {}
|
3739
|
-
cpy._vars_input = {}
|
3740
|
-
cpy._vars_capture = {}
|
3741
|
-
else: # pragma: no cover
|
3742
|
-
raise ValueError(f"unknown vars_mode: '{vars_mode}'")
|
3757
|
+
|
3758
|
+
_copy_metadata(self, cpy, vars_mode)
|
3743
3759
|
|
3744
3760
|
cpy._data = CircuitData(
|
3745
3761
|
self._data.qubits, self._data.clbits, global_phase=self._data.global_phase
|
3746
3762
|
)
|
3747
3763
|
|
3748
|
-
cpy._calibrations = _copy.deepcopy(self._calibrations)
|
3749
|
-
cpy._metadata = _copy.deepcopy(self._metadata)
|
3750
|
-
|
3751
3764
|
if name:
|
3752
3765
|
cpy.name = name
|
3753
3766
|
return cpy
|
@@ -3863,7 +3876,7 @@ class QuantumCircuit:
|
|
3863
3876
|
circuit.draw()
|
3864
3877
|
|
3865
3878
|
|
3866
|
-
..
|
3879
|
+
.. code-block:: text
|
3867
3880
|
|
3868
3881
|
┌───┐┌─┐
|
3869
3882
|
q: ┤ H ├┤M├
|
@@ -4337,30 +4350,57 @@ class QuantumCircuit:
|
|
4337
4350
|
|
4338
4351
|
if isinstance(parameters, collections.abc.Mapping):
|
4339
4352
|
raw_mapping = parameters if flat_input else self._unroll_param_dict(parameters)
|
4340
|
-
|
4341
|
-
|
4353
|
+
if strict and (
|
4354
|
+
extras := [
|
4355
|
+
parameter for parameter in raw_mapping if not self.has_parameter(parameter)
|
4356
|
+
]
|
4357
|
+
):
|
4342
4358
|
raise CircuitError(
|
4343
4359
|
f"Cannot bind parameters ({', '.join(str(x) for x in extras)}) not present in"
|
4344
4360
|
" the circuit."
|
4345
4361
|
)
|
4346
|
-
|
4347
|
-
|
4362
|
+
|
4363
|
+
def create_mapping_view():
|
4364
|
+
return raw_mapping
|
4365
|
+
|
4366
|
+
target._data.assign_parameters_mapping(raw_mapping)
|
4348
4367
|
else:
|
4349
|
-
|
4368
|
+
# This should be a cache retrieval, since we warmed the cache. We need to keep hold of
|
4369
|
+
# what the parameters were before anything is assigned, because we assign parameters in
|
4370
|
+
# the calibrations (which aren't tracked in the internal parameter table) after, which
|
4371
|
+
# would change what we create. We don't make the full Python-space mapping object of
|
4372
|
+
# parameters to values eagerly because 99.9% of the time we don't need it, and it's
|
4373
|
+
# relatively expensive to do for large numbers of parameters.
|
4374
|
+
initial_parameters = target._data.parameters
|
4375
|
+
|
4376
|
+
def create_mapping_view():
|
4377
|
+
return dict(zip(initial_parameters, parameters))
|
4378
|
+
|
4350
4379
|
target._data.assign_parameters_iterable(parameters)
|
4351
4380
|
|
4352
4381
|
# Finally, assign the parameters inside any of the calibrations. We don't track these in
|
4353
|
-
# the `ParameterTable`, so we manually reconstruct things.
|
4382
|
+
# the `ParameterTable`, so we manually reconstruct things. We lazily construct the mapping
|
4383
|
+
# `{parameter: bound_value}` the first time we encounter a binding (we have to scan for
|
4384
|
+
# this, because calibrations don't use a parameter-table lookup), rather than always paying
|
4385
|
+
# the cost - most circuits don't have parametric calibrations, and it's expensive.
|
4386
|
+
mapping_view = None
|
4387
|
+
|
4354
4388
|
def map_calibration(qubits, parameters, schedule):
|
4389
|
+
# All calls to this function should share the same `{Parameter: bound_value}` mapping,
|
4390
|
+
# which we only want to lazily construct a single time.
|
4391
|
+
nonlocal mapping_view
|
4392
|
+
if mapping_view is None:
|
4393
|
+
mapping_view = create_mapping_view()
|
4394
|
+
|
4355
4395
|
modified = False
|
4356
4396
|
new_parameters = list(parameters)
|
4357
4397
|
for i, parameter in enumerate(new_parameters):
|
4358
4398
|
if not isinstance(parameter, ParameterExpression):
|
4359
4399
|
continue
|
4360
|
-
if not (contained := parameter.parameters &
|
4400
|
+
if not (contained := parameter.parameters & mapping_view.keys()):
|
4361
4401
|
continue
|
4362
4402
|
for to_bind in contained:
|
4363
|
-
parameter = parameter.assign(to_bind,
|
4403
|
+
parameter = parameter.assign(to_bind, mapping_view[to_bind])
|
4364
4404
|
if not parameter.parameters:
|
4365
4405
|
parameter = parameter.numeric()
|
4366
4406
|
if isinstance(parameter, complex):
|
@@ -4368,7 +4408,7 @@ class QuantumCircuit:
|
|
4368
4408
|
new_parameters[i] = parameter
|
4369
4409
|
modified = True
|
4370
4410
|
if modified:
|
4371
|
-
schedule.assign_parameters(
|
4411
|
+
schedule.assign_parameters(mapping_view)
|
4372
4412
|
return (qubits, tuple(new_parameters)), schedule
|
4373
4413
|
|
4374
4414
|
target._calibrations = defaultdict(
|
@@ -5691,7 +5731,7 @@ class QuantumCircuit:
|
|
5691
5731
|
|
5692
5732
|
output:
|
5693
5733
|
|
5694
|
-
..
|
5734
|
+
.. code-block:: text
|
5695
5735
|
|
5696
5736
|
┌─────────────────────────────────────┐
|
5697
5737
|
q_0: ┤ State Preparation(0.70711,-0.70711) ├
|
@@ -5714,7 +5754,7 @@ class QuantumCircuit:
|
|
5714
5754
|
|
5715
5755
|
output:
|
5716
5756
|
|
5717
|
-
..
|
5757
|
+
.. code-block:: text
|
5718
5758
|
|
5719
5759
|
┌─────────────────────────┐
|
5720
5760
|
q_0: ┤0 ├
|
@@ -5735,7 +5775,7 @@ class QuantumCircuit:
|
|
5735
5775
|
|
5736
5776
|
output:
|
5737
5777
|
|
5738
|
-
..
|
5778
|
+
.. code-block:: text
|
5739
5779
|
|
5740
5780
|
┌───────────────────────────────────────────┐
|
5741
5781
|
q_0: ┤0 ├
|
@@ -5806,7 +5846,7 @@ class QuantumCircuit:
|
|
5806
5846
|
|
5807
5847
|
output:
|
5808
5848
|
|
5809
|
-
..
|
5849
|
+
.. code-block:: text
|
5810
5850
|
|
5811
5851
|
┌──────────────────────────────┐
|
5812
5852
|
q_0: ┤ Initialize(0.70711,-0.70711) ├
|
@@ -5829,7 +5869,7 @@ class QuantumCircuit:
|
|
5829
5869
|
|
5830
5870
|
output:
|
5831
5871
|
|
5832
|
-
..
|
5872
|
+
.. code-block:: text
|
5833
5873
|
|
5834
5874
|
┌──────────────────┐
|
5835
5875
|
q_0: ┤0 ├
|
@@ -5850,7 +5890,7 @@ class QuantumCircuit:
|
|
5850
5890
|
|
5851
5891
|
output:
|
5852
5892
|
|
5853
|
-
..
|
5893
|
+
.. code-block:: text
|
5854
5894
|
|
5855
5895
|
┌────────────────────────────────────┐
|
5856
5896
|
q_0: ┤0 ├
|
@@ -6466,6 +6506,7 @@ class QuantumCircuit:
|
|
6466
6506
|
ContinueLoopOp(self.num_qubits, self.num_clbits), self.qubits, self.clbits, copy=False
|
6467
6507
|
)
|
6468
6508
|
|
6509
|
+
@deprecate_pulse_dependency
|
6469
6510
|
def add_calibration(
|
6470
6511
|
self,
|
6471
6512
|
gate: Union[Gate, str],
|
@@ -6691,42 +6732,6 @@ def _validate_expr(circuit_scope: CircuitScopeInterface, node: expr.Expr) -> exp
|
|
6691
6732
|
return node
|
6692
6733
|
|
6693
6734
|
|
6694
|
-
class _ParameterBindsDict:
|
6695
|
-
__slots__ = ("mapping", "allowed_keys")
|
6696
|
-
|
6697
|
-
def __init__(self, mapping, allowed_keys):
|
6698
|
-
self.mapping = mapping
|
6699
|
-
self.allowed_keys = allowed_keys
|
6700
|
-
|
6701
|
-
def items(self):
|
6702
|
-
"""Iterator through all the keys in the mapping that we care about. Wrapping the main
|
6703
|
-
mapping allows us to avoid reconstructing a new 'dict', but just use the given 'mapping'
|
6704
|
-
without any copy / reconstruction."""
|
6705
|
-
for parameter, value in self.mapping.items():
|
6706
|
-
if parameter in self.allowed_keys:
|
6707
|
-
yield parameter, value
|
6708
|
-
|
6709
|
-
|
6710
|
-
class _ParameterBindsSequence:
|
6711
|
-
__slots__ = ("parameters", "values", "mapping_cache")
|
6712
|
-
|
6713
|
-
def __init__(self, parameters, values):
|
6714
|
-
self.parameters = parameters
|
6715
|
-
self.values = values
|
6716
|
-
self.mapping_cache = None
|
6717
|
-
|
6718
|
-
def items(self):
|
6719
|
-
"""Iterator through all the keys in the mapping that we care about."""
|
6720
|
-
return zip(self.parameters, self.values)
|
6721
|
-
|
6722
|
-
@property
|
6723
|
-
def mapping(self):
|
6724
|
-
"""Cached version of a mapping. This is only generated on demand."""
|
6725
|
-
if self.mapping_cache is None:
|
6726
|
-
self.mapping_cache = dict(zip(self.parameters, self.values))
|
6727
|
-
return self.mapping_cache
|
6728
|
-
|
6729
|
-
|
6730
6735
|
def _bit_argument_conversion(specifier, bit_sequence, bit_set, type_) -> list[Bit]:
|
6731
6736
|
"""Get the list of bits referred to by the specifier ``specifier``.
|
6732
6737
|
|
@@ -6791,3 +6796,34 @@ def _bit_argument_conversion_scalar(specifier, bit_sequence, bit_set, type_):
|
|
6791
6796
|
else f"Invalid bit index: '{specifier}' of type '{type(specifier)}'"
|
6792
6797
|
)
|
6793
6798
|
raise CircuitError(message)
|
6799
|
+
|
6800
|
+
|
6801
|
+
def _copy_metadata(original, cpy, vars_mode):
|
6802
|
+
# copy registers correctly, in copy.copy they are only copied via reference
|
6803
|
+
cpy.qregs = original.qregs.copy()
|
6804
|
+
cpy.cregs = original.cregs.copy()
|
6805
|
+
cpy._builder_api = _OuterCircuitScopeInterface(cpy)
|
6806
|
+
cpy._ancillas = original._ancillas.copy()
|
6807
|
+
cpy._qubit_indices = original._qubit_indices.copy()
|
6808
|
+
cpy._clbit_indices = original._clbit_indices.copy()
|
6809
|
+
|
6810
|
+
if vars_mode == "alike":
|
6811
|
+
# Note that this causes the local variables to be uninitialised, because the stores are
|
6812
|
+
# not copied. This can leave the circuit in a potentially dangerous state for users if
|
6813
|
+
# they don't re-add initializer stores.
|
6814
|
+
cpy._vars_local = original._vars_local.copy()
|
6815
|
+
cpy._vars_input = original._vars_input.copy()
|
6816
|
+
cpy._vars_capture = original._vars_capture.copy()
|
6817
|
+
elif vars_mode == "captures":
|
6818
|
+
cpy._vars_local = {}
|
6819
|
+
cpy._vars_input = {}
|
6820
|
+
cpy._vars_capture = {var.name: var for var in original.iter_vars()}
|
6821
|
+
elif vars_mode == "drop":
|
6822
|
+
cpy._vars_local = {}
|
6823
|
+
cpy._vars_input = {}
|
6824
|
+
cpy._vars_capture = {}
|
6825
|
+
else: # pragma: no cover
|
6826
|
+
raise ValueError(f"unknown vars_mode: '{vars_mode}'")
|
6827
|
+
|
6828
|
+
cpy._calibrations = _copy.deepcopy(original._calibrations)
|
6829
|
+
cpy._metadata = _copy.deepcopy(original._metadata)
|
qiskit/circuit/singleton.py
CHANGED
@@ -251,6 +251,7 @@ from __future__ import annotations
|
|
251
251
|
|
252
252
|
import functools
|
253
253
|
|
254
|
+
from qiskit.utils import deprecate_func
|
254
255
|
from .instruction import Instruction
|
255
256
|
from .gate import Gate
|
256
257
|
from .controlledgate import ControlledGate, _ctrl_state_to_int
|
@@ -489,6 +490,7 @@ class _SingletonInstructionOverrides(Instruction):
|
|
489
490
|
instruction._params = _frozenlist(instruction._params)
|
490
491
|
return instruction
|
491
492
|
|
493
|
+
@deprecate_func(since="1.3.0", removal_timeline="in 2.0.0")
|
492
494
|
def c_if(self, classical, val):
|
493
495
|
return self.to_mutable().c_if(classical, val)
|
494
496
|
|
qiskit/circuit/store.py
CHANGED
@@ -16,6 +16,7 @@ from __future__ import annotations
|
|
16
16
|
|
17
17
|
import typing
|
18
18
|
|
19
|
+
from qiskit.utils import deprecate_func
|
19
20
|
from .exceptions import CircuitError
|
20
21
|
from .classical import expr, types
|
21
22
|
from .instruction import Instruction
|
@@ -88,6 +89,7 @@ class Store(Instruction):
|
|
88
89
|
"""Get the r-value :class:`~.expr.Expr` node that is being written into the l-value."""
|
89
90
|
return self.params[1]
|
90
91
|
|
92
|
+
@deprecate_func(since="1.3.0", removal_timeline="in 2.0.0")
|
91
93
|
def c_if(self, classical, val):
|
92
94
|
""":meta hidden:"""
|
93
95
|
raise NotImplementedError(
|