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/qasm3/exporter.py
CHANGED
@@ -30,7 +30,6 @@ from qiskit.circuit import (
|
|
30
30
|
Barrier,
|
31
31
|
CircuitInstruction,
|
32
32
|
Clbit,
|
33
|
-
ControlledGate,
|
34
33
|
Gate,
|
35
34
|
Measure,
|
36
35
|
Parameter,
|
@@ -140,9 +139,16 @@ class Exporter:
|
|
140
139
|
):
|
141
140
|
"""
|
142
141
|
Args:
|
143
|
-
includes: the filenames that should be emitted as includes.
|
144
|
-
|
145
|
-
|
142
|
+
includes: the filenames that should be emitted as includes.
|
143
|
+
|
144
|
+
.. note::
|
145
|
+
|
146
|
+
At present, only the standard-library file ``stdgates.inc`` is properly
|
147
|
+
understood by the exporter, in the sense that it knows the gates it defines.
|
148
|
+
You can specify other includes, but you will need to pass the names of the gates
|
149
|
+
they define in the ``basis_gates`` argument to avoid the exporter outputting a
|
150
|
+
separate ``gate`` definition.
|
151
|
+
|
146
152
|
basis_gates: the basic defined gate set of the backend.
|
147
153
|
disable_constants: if ``True``, always emit floating-point constants for numeric
|
148
154
|
parameter values. If ``False`` (the default), then values close to multiples of
|
@@ -202,46 +208,60 @@ class Exporter:
|
|
202
208
|
# comparisons will work.
|
203
209
|
_FIXED_PARAMETERS = (Parameter("p0"), Parameter("p1"), Parameter("p2"), Parameter("p3"))
|
204
210
|
|
211
|
+
_CANONICAL_STANDARD_GATES = {
|
212
|
+
standard: standard.gate_class(*_FIXED_PARAMETERS[: standard.num_params])
|
213
|
+
for standard in StandardGate.all_gates()
|
214
|
+
if not standard.is_controlled_gate
|
215
|
+
}
|
216
|
+
_CANONICAL_CONTROLLED_STANDARD_GATES = {
|
217
|
+
standard: [
|
218
|
+
standard.gate_class(*_FIXED_PARAMETERS[: standard.num_params], ctrl_state=ctrl_state)
|
219
|
+
for ctrl_state in range(1 << standard.num_ctrl_qubits)
|
220
|
+
]
|
221
|
+
for standard in StandardGate.all_gates()
|
222
|
+
if standard.is_controlled_gate
|
223
|
+
}
|
224
|
+
|
205
225
|
# Mapping of symbols defined by `stdgates.inc` to their gate definition source.
|
206
226
|
_KNOWN_INCLUDES = {
|
207
227
|
"stdgates.inc": {
|
208
|
-
"p":
|
209
|
-
"x":
|
210
|
-
"y":
|
211
|
-
"z":
|
212
|
-
"h":
|
213
|
-
"s":
|
214
|
-
"sdg":
|
215
|
-
"t":
|
216
|
-
"tdg":
|
217
|
-
"sx":
|
218
|
-
"rx":
|
219
|
-
"ry":
|
220
|
-
"rz":
|
221
|
-
"cx":
|
222
|
-
"cy":
|
223
|
-
"cz":
|
224
|
-
"cp":
|
225
|
-
"crx":
|
226
|
-
"cry":
|
227
|
-
"crz":
|
228
|
-
"ch":
|
229
|
-
"swap":
|
230
|
-
"ccx":
|
231
|
-
"cswap":
|
232
|
-
"cu":
|
233
|
-
"CX":
|
234
|
-
"phase":
|
235
|
-
"cphase":
|
236
|
-
"id":
|
237
|
-
"u1":
|
238
|
-
"u2":
|
239
|
-
"u3":
|
228
|
+
"p": _CANONICAL_STANDARD_GATES[StandardGate.PhaseGate],
|
229
|
+
"x": _CANONICAL_STANDARD_GATES[StandardGate.XGate],
|
230
|
+
"y": _CANONICAL_STANDARD_GATES[StandardGate.YGate],
|
231
|
+
"z": _CANONICAL_STANDARD_GATES[StandardGate.ZGate],
|
232
|
+
"h": _CANONICAL_STANDARD_GATES[StandardGate.HGate],
|
233
|
+
"s": _CANONICAL_STANDARD_GATES[StandardGate.SGate],
|
234
|
+
"sdg": _CANONICAL_STANDARD_GATES[StandardGate.SdgGate],
|
235
|
+
"t": _CANONICAL_STANDARD_GATES[StandardGate.TGate],
|
236
|
+
"tdg": _CANONICAL_STANDARD_GATES[StandardGate.TdgGate],
|
237
|
+
"sx": _CANONICAL_STANDARD_GATES[StandardGate.SXGate],
|
238
|
+
"rx": _CANONICAL_STANDARD_GATES[StandardGate.RXGate],
|
239
|
+
"ry": _CANONICAL_STANDARD_GATES[StandardGate.RYGate],
|
240
|
+
"rz": _CANONICAL_STANDARD_GATES[StandardGate.RZGate],
|
241
|
+
"cx": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CXGate][1],
|
242
|
+
"cy": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CYGate][1],
|
243
|
+
"cz": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CZGate][1],
|
244
|
+
"cp": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CPhaseGate][1],
|
245
|
+
"crx": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CRXGate][1],
|
246
|
+
"cry": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CRYGate][1],
|
247
|
+
"crz": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CRZGate][1],
|
248
|
+
"ch": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CHGate][1],
|
249
|
+
"swap": _CANONICAL_STANDARD_GATES[StandardGate.SwapGate],
|
250
|
+
"ccx": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CCXGate][3],
|
251
|
+
"cswap": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CSwapGate][1],
|
252
|
+
"cu": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CUGate][1],
|
253
|
+
"CX": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CXGate][1],
|
254
|
+
"phase": _CANONICAL_STANDARD_GATES[StandardGate.PhaseGate],
|
255
|
+
"cphase": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CPhaseGate][1],
|
256
|
+
"id": _CANONICAL_STANDARD_GATES[StandardGate.IGate],
|
257
|
+
"u1": _CANONICAL_STANDARD_GATES[StandardGate.U1Gate],
|
258
|
+
"u2": _CANONICAL_STANDARD_GATES[StandardGate.U2Gate],
|
259
|
+
"u3": _CANONICAL_STANDARD_GATES[StandardGate.U3Gate],
|
240
260
|
},
|
241
261
|
}
|
242
262
|
|
243
263
|
_BUILTIN_GATES = {
|
244
|
-
"U":
|
264
|
+
"U": _CANONICAL_STANDARD_GATES[StandardGate.UGate],
|
245
265
|
}
|
246
266
|
|
247
267
|
|
@@ -472,9 +492,14 @@ class SymbolTable:
|
|
472
492
|
def get_gate(self, gate: Gate) -> ast.Identifier | None:
|
473
493
|
"""Lookup the identifier for a given `Gate`, if it exists."""
|
474
494
|
canonical = _gate_canonical_form(gate)
|
475
|
-
# `our_defn.canonical is None` means a basis gate that we should assume is always valid.
|
476
495
|
if (our_defn := self.gates.get(gate.name)) is not None and (
|
477
|
-
|
496
|
+
# We arrange things such that the known definitions for the vast majority of gates we
|
497
|
+
# will encounter are the exact same canonical instance, so an `is` check saves time.
|
498
|
+
our_defn.canonical is canonical
|
499
|
+
# `our_defn.canonical is None` means a basis gate that we should assume is always valid.
|
500
|
+
or our_defn.canonical is None
|
501
|
+
# The last catch, if the canonical form is some custom gate that compares equal to this.
|
502
|
+
or our_defn.canonical == canonical
|
478
503
|
):
|
479
504
|
return ast.Identifier(gate.name)
|
480
505
|
if canonical._standard_gate is not None:
|
@@ -499,11 +524,14 @@ def _gate_canonical_form(gate: Gate) -> Gate:
|
|
499
524
|
# If a gate is part of the Qiskit standard-library gates, we know we can safely produce a
|
500
525
|
# reparameterised gate by passing the parameters positionally to the standard-gate constructor
|
501
526
|
# (and control state, if appropriate).
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
527
|
+
standard = gate._standard_gate
|
528
|
+
if standard is None:
|
529
|
+
return gate
|
530
|
+
return (
|
531
|
+
_CANONICAL_CONTROLLED_STANDARD_GATES[standard][gate.ctrl_state]
|
532
|
+
if standard.is_controlled_gate
|
533
|
+
else _CANONICAL_STANDARD_GATES[standard]
|
534
|
+
)
|
507
535
|
|
508
536
|
|
509
537
|
@dataclasses.dataclass
|
@@ -590,12 +618,10 @@ class QASM3Builder:
|
|
590
618
|
self.scope = old_scope
|
591
619
|
self.symbols = old_symbols
|
592
620
|
|
593
|
-
def
|
594
|
-
"""Lookup a Qiskit
|
621
|
+
def _lookup_bit(self, bit) -> ast.Identifier:
|
622
|
+
"""Lookup a Qiskit bit within the current context, and return the name that should be
|
595
623
|
used to represent it in OpenQASM 3 programmes."""
|
596
|
-
|
597
|
-
variable = self.scope.bit_map[variable]
|
598
|
-
return self.symbols.get_variable(variable)
|
624
|
+
return self.symbols.get_variable(self.scope.bit_map[bit])
|
599
625
|
|
600
626
|
def build_program(self):
|
601
627
|
"""Builds a Program"""
|
@@ -675,9 +701,9 @@ class QASM3Builder:
|
|
675
701
|
def build_includes(self):
|
676
702
|
"""Builds a list of included files."""
|
677
703
|
for filename in self.includes:
|
678
|
-
|
679
|
-
|
680
|
-
for name, gate in
|
704
|
+
# Note: unknown include files have a corresponding `include` statement generated, but do
|
705
|
+
# not actually define any gates; we rely on the user to pass those in `basis_gates`.
|
706
|
+
for name, gate in _KNOWN_INCLUDES.get(filename, {}).items():
|
681
707
|
self.symbols.register_gate_without_definition(name, gate)
|
682
708
|
yield ast.Include(filename)
|
683
709
|
|
@@ -902,7 +928,7 @@ class QASM3Builder:
|
|
902
928
|
out = []
|
903
929
|
for register in registers:
|
904
930
|
name = self.symbols.register_variable(register.name, register, allow_rename=True)
|
905
|
-
elements = [self.
|
931
|
+
elements = [self._lookup_bit(bit) for bit in register]
|
906
932
|
for i, bit in enumerate(register):
|
907
933
|
# This might shadow previous definitions, but that's not a problem.
|
908
934
|
self.symbols.set_object_ident(
|
@@ -949,18 +975,17 @@ class QASM3Builder:
|
|
949
975
|
if isinstance(instruction.operation, Gate):
|
950
976
|
nodes = [self.build_gate_call(instruction)]
|
951
977
|
elif isinstance(instruction.operation, Barrier):
|
952
|
-
operands = [self.
|
978
|
+
operands = [self._lookup_bit(operand) for operand in instruction.qubits]
|
953
979
|
nodes = [ast.QuantumBarrier(operands)]
|
954
980
|
elif isinstance(instruction.operation, Measure):
|
955
981
|
measurement = ast.QuantumMeasurement(
|
956
|
-
[self.
|
982
|
+
[self._lookup_bit(operand) for operand in instruction.qubits]
|
957
983
|
)
|
958
|
-
qubit = self.
|
984
|
+
qubit = self._lookup_bit(instruction.clbits[0])
|
959
985
|
nodes = [ast.QuantumMeasurementAssignment(qubit, measurement)]
|
960
986
|
elif isinstance(instruction.operation, Reset):
|
961
987
|
nodes = [
|
962
|
-
ast.QuantumReset(self.
|
963
|
-
for operand in instruction.qubits
|
988
|
+
ast.QuantumReset(self._lookup_bit(operand)) for operand in instruction.qubits
|
964
989
|
]
|
965
990
|
elif isinstance(instruction.operation, Delay):
|
966
991
|
nodes = [self.build_delay(instruction)]
|
@@ -981,13 +1006,13 @@ class QASM3Builder:
|
|
981
1006
|
f" but received '{instruction.operation}'"
|
982
1007
|
)
|
983
1008
|
|
984
|
-
if instruction.operation.
|
1009
|
+
if instruction.operation._condition is None:
|
985
1010
|
statements.extend(nodes)
|
986
1011
|
else:
|
987
1012
|
body = ast.ProgramBlock(nodes)
|
988
1013
|
statements.append(
|
989
1014
|
ast.BranchingStatement(
|
990
|
-
self.build_expression(_lift_condition(instruction.operation.
|
1015
|
+
self.build_expression(_lift_condition(instruction.operation._condition)),
|
991
1016
|
body,
|
992
1017
|
)
|
993
1018
|
)
|
@@ -1094,9 +1119,14 @@ class QASM3Builder:
|
|
1094
1119
|
body_ast = ast.ProgramBlock(self.build_current_scope())
|
1095
1120
|
return ast.ForLoopStatement(indexset_ast, loop_parameter_ast, body_ast)
|
1096
1121
|
|
1122
|
+
def _lookup_variable_for_expression(self, var):
|
1123
|
+
if isinstance(var, Bit):
|
1124
|
+
return self._lookup_bit(var)
|
1125
|
+
return self.symbols.get_variable(var)
|
1126
|
+
|
1097
1127
|
def build_expression(self, node: expr.Expr) -> ast.Expression:
|
1098
1128
|
"""Build an expression."""
|
1099
|
-
return node.accept(_ExprBuilder(self.
|
1129
|
+
return node.accept(_ExprBuilder(self._lookup_variable_for_expression))
|
1100
1130
|
|
1101
1131
|
def build_delay(self, instruction: CircuitInstruction) -> ast.QuantumDelay:
|
1102
1132
|
"""Build a built-in delay statement."""
|
@@ -1116,9 +1146,7 @@ class QASM3Builder:
|
|
1116
1146
|
"dt": ast.DurationUnit.SAMPLE,
|
1117
1147
|
}
|
1118
1148
|
duration = ast.DurationLiteral(duration_value, unit_map[unit])
|
1119
|
-
return ast.QuantumDelay(
|
1120
|
-
duration, [self._lookup_variable(qubit) for qubit in instruction.qubits]
|
1121
|
-
)
|
1149
|
+
return ast.QuantumDelay(duration, [self._lookup_bit(qubit) for qubit in instruction.qubits])
|
1122
1150
|
|
1123
1151
|
def build_integer(self, value) -> ast.IntegerLiteral:
|
1124
1152
|
"""Build an integer literal, raising a :obj:`.QASM3ExporterError` if the input is not
|
@@ -1138,9 +1166,11 @@ class QASM3Builder:
|
|
1138
1166
|
# missing, pending a new system in Terra to replace it (2022-03-07).
|
1139
1167
|
if not isinstance(expression, ParameterExpression):
|
1140
1168
|
return expression
|
1169
|
+
if isinstance(expression, Parameter):
|
1170
|
+
return self.symbols.get_variable(expression).string
|
1141
1171
|
return expression.subs(
|
1142
1172
|
{
|
1143
|
-
param: Parameter(self.
|
1173
|
+
param: Parameter(self.symbols.get_variable(param).string, uuid=param.uuid)
|
1144
1174
|
for param in expression.parameters
|
1145
1175
|
}
|
1146
1176
|
)
|
@@ -1153,18 +1183,14 @@ class QASM3Builder:
|
|
1153
1183
|
ident = self.symbols.get_gate(instruction.operation)
|
1154
1184
|
if ident is None:
|
1155
1185
|
ident = self.define_gate(instruction.operation)
|
1156
|
-
qubits = [self.
|
1157
|
-
|
1158
|
-
|
1159
|
-
|
1160
|
-
|
1161
|
-
|
1162
|
-
|
1163
|
-
|
1164
|
-
ast.StringifyAndPray(pi_check(self._rebind_scoped_parameters(param), output="qasm"))
|
1165
|
-
for param in instruction.operation.params
|
1166
|
-
]
|
1167
|
-
|
1186
|
+
qubits = [self._lookup_bit(qubit) for qubit in instruction.qubits]
|
1187
|
+
parameters = [
|
1188
|
+
ast.StringifyAndPray(self._rebind_scoped_parameters(param))
|
1189
|
+
for param in instruction.operation.params
|
1190
|
+
]
|
1191
|
+
if not self.disable_constants:
|
1192
|
+
for parameter in parameters:
|
1193
|
+
parameter.obj = pi_check(parameter.obj, output="qasm")
|
1168
1194
|
return ast.QuantumGateCall(ident, qubits, parameters=parameters)
|
1169
1195
|
|
1170
1196
|
|
@@ -31,6 +31,7 @@ from qiskit.pulse.schedule import Schedule
|
|
31
31
|
from qiskit.qobj import QobjMeasurementOption, PulseLibraryItem, PulseQobjInstruction
|
32
32
|
from qiskit.qobj.utils import MeasLevel
|
33
33
|
from qiskit.utils import deprecate_func
|
34
|
+
from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
|
34
35
|
|
35
36
|
|
36
37
|
class ParametricPulseShapes(Enum):
|
@@ -87,9 +88,9 @@ class InstructionToQobjConverter:
|
|
87
88
|
This converter converts the Qiskit Pulse in-memory representation into
|
88
89
|
the transfer layer format to submit the data from client to the server.
|
89
90
|
|
90
|
-
The transfer layer format must be the text representation that
|
91
|
+
The transfer layer format must be the text representation that conforms to
|
91
92
|
the `OpenPulse specification<https://arxiv.org/abs/1809.03452>`__.
|
92
|
-
|
93
|
+
Extension to the OpenPulse can be achieved by subclassing this this with
|
93
94
|
extra methods corresponding to each augmented instruction. For example,
|
94
95
|
|
95
96
|
.. code-block:: python
|
@@ -509,9 +510,9 @@ class QobjToInstructionConverter:
|
|
509
510
|
This converter converts data from transfer layer into the in-memory representation of
|
510
511
|
the front-end of Qiskit Pulse.
|
511
512
|
|
512
|
-
The transfer layer format must be the text representation that
|
513
|
+
The transfer layer format must be the text representation that conforms to
|
513
514
|
the `OpenPulse specification<https://arxiv.org/abs/1809.03452>`__.
|
514
|
-
|
515
|
+
Extension to the OpenPulse can be achieved by subclassing this this with
|
515
516
|
extra methods corresponding to each augmented instruction. For example,
|
516
517
|
|
517
518
|
.. code-block:: python
|
@@ -532,6 +533,7 @@ class QobjToInstructionConverter:
|
|
532
533
|
|
533
534
|
__chan_regex__ = re.compile(r"([a-zA-Z]+)(\d+)")
|
534
535
|
|
536
|
+
@deprecate_pulse_dependency
|
535
537
|
def __init__(
|
536
538
|
self,
|
537
539
|
pulse_library: Optional[List[PulseLibraryItem]] = None,
|
qiskit/qpy/__init__.py
CHANGED
@@ -97,6 +97,8 @@ Attributes:
|
|
97
97
|
will be able to load all released format versions of QPY (up until
|
98
98
|
``QPY_VERSION``).
|
99
99
|
|
100
|
+
.. _qpy_compatibility:
|
101
|
+
|
100
102
|
QPY Compatibility
|
101
103
|
=================
|
102
104
|
|
@@ -116,6 +118,30 @@ and how the feature will be internally handled.
|
|
116
118
|
|
117
119
|
.. autoexception:: QPYLoadingDeprecatedFeatureWarning
|
118
120
|
|
121
|
+
.. note::
|
122
|
+
|
123
|
+
With versions of Qiskit before 1.2.4, the ``use_symengine=True`` argument to :func:`.qpy.dump`
|
124
|
+
could cause problems with backwards compatibility if there were :class:`.ParameterExpression`
|
125
|
+
objects to serialize. In particular:
|
126
|
+
|
127
|
+
* When the loading version of Qiskit is 1.2.4 or greater, QPY files generated with any version
|
128
|
+
of Qiskit >= 0.46.0 can be loaded. If a version of Qiskit between 0.45.0 and 0.45.3 was used
|
129
|
+
to generate the files, and the non-default argument ``use_symengine=True`` was given to
|
130
|
+
:func:`.qpy.dump`, the file can only be read if the version of ``symengine`` used in the
|
131
|
+
generating environment was in the 0.11 or 0.13 series, but if the environment was created
|
132
|
+
during the support window of Qiskit 0.45, it is likely that ``symengine==0.9.2`` was used.
|
133
|
+
|
134
|
+
* When the loading version of Qiskit is between 0.46.0 and 1.2.2 inclusive, the file can only be
|
135
|
+
read if the installed version of ``symengine`` in the loading environment matches the version
|
136
|
+
used in the generating environment.
|
137
|
+
|
138
|
+
To recover a QPY file that fails with ``symengine`` version-related errors during a call to
|
139
|
+
:func:`.qpy.load`, first attempt to use Qiskit >= 1.2.4 to load the file. If this still fails,
|
140
|
+
it is likely because Qiskit 0.45.x was used to generate the file with ``use_symengine=True``.
|
141
|
+
In this case, use Qiskit 0.45.3 with ``symengine==0.9.2`` to load the file, and then re-export
|
142
|
+
it to QPY setting ``use_symengine=False``. The resulting file can then be loaded by any later
|
143
|
+
version of Qiskit.
|
144
|
+
|
119
145
|
QPY format version history
|
120
146
|
--------------------------
|
121
147
|
|
@@ -133,6 +159,24 @@ of QPY in qiskit-terra 0.18.0.
|
|
133
159
|
* - Qiskit (qiskit-terra for < 1.0.0) version
|
134
160
|
- :func:`.dump` format(s) output versions
|
135
161
|
- :func:`.load` maximum supported version (older format versions can always be read)
|
162
|
+
* - 1.3.0
|
163
|
+
- 10, 11, 12, 13
|
164
|
+
- 13
|
165
|
+
* - 1.2.4
|
166
|
+
- 10, 11, 12
|
167
|
+
- 12
|
168
|
+
* - 1.2.3 (yanked)
|
169
|
+
- 10, 11, 12
|
170
|
+
- 12
|
171
|
+
* - 1.2.2
|
172
|
+
- 10, 11, 12
|
173
|
+
- 12
|
174
|
+
* - 1.2.1
|
175
|
+
- 10, 11, 12
|
176
|
+
- 12
|
177
|
+
* - 1.2.0
|
178
|
+
- 10, 11, 12
|
179
|
+
- 12
|
136
180
|
* - 1.1.0
|
137
181
|
- 10, 11, 12
|
138
182
|
- 12
|
@@ -298,6 +342,141 @@ There is a circuit payload for each circuit (where the total number is dictated
|
|
298
342
|
by ``num_circuits`` in the file header). There is no padding between the
|
299
343
|
circuits in the data.
|
300
344
|
|
345
|
+
.. _qpy_version_13:
|
346
|
+
|
347
|
+
Version 13
|
348
|
+
----------
|
349
|
+
|
350
|
+
Version 13 added a native Qiskit serialization representation for :class:`.ParameterExpression`.
|
351
|
+
Previous QPY versions relied on either ``sympy`` or ``symengine`` to serialize the underlying symbolic
|
352
|
+
expression. Starting in Version 13, QPY now represents the sequence of API calls used to create the
|
353
|
+
:class:`.ParameterExpression`.
|
354
|
+
|
355
|
+
The main change in the serialization format is in the :ref:`qpy_param_expr_v3` payload. The
|
356
|
+
``expr_size`` bytes following the head now contain an array of ``PARAM_EXPR_ELEM_V13`` structs. The
|
357
|
+
intent is for this array to be read one struct at a time, where each struct describes one of the
|
358
|
+
calls to make to reconstruct the :class:`.ParameterExpression`.
|
359
|
+
|
360
|
+
PARAM_EXPR_ELEM_V13
|
361
|
+
~~~~~~~~~~~~~~~~~~~
|
362
|
+
|
363
|
+
The struct format is defined as:
|
364
|
+
|
365
|
+
.. code-block:: c
|
366
|
+
|
367
|
+
struct {
|
368
|
+
unsigned char op_code;
|
369
|
+
char lhs_type;
|
370
|
+
char lhs[16];
|
371
|
+
char rhs_type;
|
372
|
+
char rhs[16];
|
373
|
+
} PARAM_EXPR_ELEM_V13;
|
374
|
+
|
375
|
+
The ``op_code`` field is used to define the operation added to the :class:`.ParameterExpression`.
|
376
|
+
The value can be:
|
377
|
+
|
378
|
+
.. list-table:: PARAM_EXPR_ELEM_V13 op code values
|
379
|
+
:header-rows: 1
|
380
|
+
|
381
|
+
* - ``op_code``
|
382
|
+
- :class:`.ParameterExpression` method
|
383
|
+
* - 0
|
384
|
+
- :meth:`~.ParameterExpression.__add__`
|
385
|
+
* - 1
|
386
|
+
- :meth:`~.ParameterExpression.__sub__`
|
387
|
+
* - 2
|
388
|
+
- :meth:`~.ParameterExpression.__mul__`
|
389
|
+
* - 3
|
390
|
+
- :meth:`~.ParameterExpression.__truediv__`
|
391
|
+
* - 4
|
392
|
+
- :meth:`~.ParameterExpression.__pow__`
|
393
|
+
* - 5
|
394
|
+
- :meth:`~.ParameterExpression.sin`
|
395
|
+
* - 6
|
396
|
+
- :meth:`~.ParameterExpression.cos`
|
397
|
+
* - 7
|
398
|
+
- :meth:`~.ParameterExpression.tan`
|
399
|
+
* - 8
|
400
|
+
- :meth:`~.ParameterExpression.arcsin`
|
401
|
+
* - 9
|
402
|
+
- :meth:`~.ParameterExpression.arccos`
|
403
|
+
* - 10
|
404
|
+
- :meth:`~.ParameterExpression.exp`
|
405
|
+
* - 11
|
406
|
+
- :meth:`~.ParameterExpression.log`
|
407
|
+
* - 12
|
408
|
+
- :meth:`~.ParameterExpression.sign`
|
409
|
+
* - 13
|
410
|
+
- :meth:`~.ParameterExpression.gradient`
|
411
|
+
* - 14
|
412
|
+
- :meth:`~.ParameterExpression.conjugate`
|
413
|
+
* - 15
|
414
|
+
- :meth:`~.ParameterExpression.subs`
|
415
|
+
* - 16
|
416
|
+
- :meth:`~.ParameterExpression.abs`
|
417
|
+
* - 17
|
418
|
+
- :meth:`~.ParameterExpression.arctan`
|
419
|
+
* - 255
|
420
|
+
- NULL
|
421
|
+
|
422
|
+
The ``NULL`` value of 255 is only used to fill the op code field for
|
423
|
+
entries that are not actual operations but indicate recursive definitions.
|
424
|
+
Then the ``lhs_type`` and ``rhs_type`` fields are used to describe
|
425
|
+
the operand types and can be one of the following UTF-8 encoded
|
426
|
+
characters:
|
427
|
+
|
428
|
+
.. list-table:: PARAM_EXPR_ELEM_V13 operand type values
|
429
|
+
:header-rows: 1
|
430
|
+
|
431
|
+
* - Value
|
432
|
+
- Type
|
433
|
+
* - ``n``
|
434
|
+
- ``None``
|
435
|
+
* - ``p``
|
436
|
+
- :class:`.Parameter`
|
437
|
+
* - ``f``
|
438
|
+
- ``float``
|
439
|
+
* - ``c``
|
440
|
+
- ``complex``
|
441
|
+
* - ``i``
|
442
|
+
- ``int``
|
443
|
+
* - ``s``
|
444
|
+
- Recursive :class:`.ParameterExpression` definition start
|
445
|
+
* - ``e``
|
446
|
+
- Recursive :class:`.ParameterExpression` definition stop
|
447
|
+
* - ``u``
|
448
|
+
- substitution
|
449
|
+
|
450
|
+
If the type value is ``f`` ,``c`` or ``i``, the corresponding ``lhs`` or `rhs``
|
451
|
+
field widths are 128 bits each. In the case of floats, the literal value is encoded as a double
|
452
|
+
with 0 padding, while complex numbers are encoded as real part followed by imaginary part,
|
453
|
+
taking up 64 bits each. For ``i`, the value is encoded as a 64 bit signed integer with 0 padding
|
454
|
+
for the full 128 bit width. ``n`` is used to represent a ``None`` and typically isn't directly used
|
455
|
+
as it indicates an argument that's not used. For ``p`` the data is the UUID for the
|
456
|
+
:class:`.Parameter` which can be looked up in the symbol map described in the
|
457
|
+
``map_elements`` outer :ref:`qpy_param_expr_v3` payload. If the type value is
|
458
|
+
``s`` this marks the start of a a new recursive section for a nested
|
459
|
+
:class:`.ParameterExpression`. For example, in the following snippet there is an inner ``expr``
|
460
|
+
contained in ``final_expr``, constituting a nested expression::
|
461
|
+
|
462
|
+
from qiskit.circuit import Parameter
|
463
|
+
|
464
|
+
x = Parameter("x")
|
465
|
+
y = Parameter("y")
|
466
|
+
z = Parameter("z")
|
467
|
+
|
468
|
+
expr = (x + y) / 2
|
469
|
+
final_expr = z**2 + expr
|
470
|
+
|
471
|
+
When ``s`` is encountered, this indicates that until an ``e` struct is reached, the next structs
|
472
|
+
are used for a recursive definition. For both
|
473
|
+
``s`` and ``e`` types, the data values are not used, and always set to 0. The type value
|
474
|
+
of ``u`` is used to represent a substitution call. This is only used for ``lhs_type``
|
475
|
+
and is always paired with an ``rhs_type`` of ``n``. The data value is the size in bytes of
|
476
|
+
a :ref:`qpy_mapping` encoded mapping of :class:`.Parameter` names to their value for the
|
477
|
+
:meth:`~.ParameterExpression.subs` call. The mapping data is immediately following the
|
478
|
+
struct, and the next struct starts immediately after the mapping data.
|
479
|
+
|
301
480
|
.. _qpy_version_12:
|
302
481
|
|
303
482
|
Version 12
|
@@ -1621,6 +1800,8 @@ struct is used:
|
|
1621
1800
|
|
1622
1801
|
this matches the internal C representation of Python's complex type. [#f3]_
|
1623
1802
|
|
1803
|
+
References
|
1804
|
+
==========
|
1624
1805
|
|
1625
1806
|
.. [#f1] https://tools.ietf.org/html/rfc1700
|
1626
1807
|
.. [#f2] https://numpy.org/doc/stable/reference/generated/numpy.lib.format.html
|
qiskit/qpy/binary_io/circuits.py
CHANGED
@@ -318,6 +318,13 @@ def _read_instruction(
|
|
318
318
|
use_symengine,
|
319
319
|
standalone_vars,
|
320
320
|
)
|
321
|
+
if condition is not None:
|
322
|
+
warnings.warn(
|
323
|
+
f"The .condition attribute on {gate_name} will be loaded as an IfElseOp "
|
324
|
+
"starting in Qiskit 2.0",
|
325
|
+
FutureWarning,
|
326
|
+
stacklevel=3,
|
327
|
+
)
|
321
328
|
inst_obj.condition = condition
|
322
329
|
if instruction.label_size > 0:
|
323
330
|
inst_obj.label = label
|
@@ -414,6 +421,12 @@ def _read_instruction(
|
|
414
421
|
gate = gate_class(*params)
|
415
422
|
if condition:
|
416
423
|
if not isinstance(gate, ControlFlowOp):
|
424
|
+
warnings.warn(
|
425
|
+
f"The .condition attribute on {gate} will be loaded as an "
|
426
|
+
"IfElseOp starting in Qiskit 2.0",
|
427
|
+
FutureWarning,
|
428
|
+
stacklevel=3,
|
429
|
+
)
|
417
430
|
gate = gate.c_if(*condition)
|
418
431
|
else:
|
419
432
|
gate.condition = condition
|
@@ -761,13 +774,13 @@ def _write_instruction(
|
|
761
774
|
condition_type = type_keys.Condition.NONE
|
762
775
|
condition_register = b""
|
763
776
|
condition_value = 0
|
764
|
-
if (op_condition := getattr(instruction.operation, "
|
777
|
+
if (op_condition := getattr(instruction.operation, "_condition", None)) is not None:
|
765
778
|
if isinstance(op_condition, expr.Expr):
|
766
779
|
condition_type = type_keys.Condition.EXPRESSION
|
767
780
|
else:
|
768
781
|
condition_type = type_keys.Condition.TWO_TUPLE
|
769
|
-
condition_register = _dumps_register(instruction.operation.
|
770
|
-
condition_value = int(instruction.operation.
|
782
|
+
condition_register = _dumps_register(instruction.operation._condition[0], index_map)
|
783
|
+
condition_value = int(instruction.operation._condition[1])
|
771
784
|
|
772
785
|
gate_class_name = gate_class_name.encode(common.ENCODE)
|
773
786
|
label = getattr(instruction.operation, "label", None)
|
@@ -1310,7 +1323,7 @@ def write_circuit(
|
|
1310
1323
|
instruction_buffer.close()
|
1311
1324
|
|
1312
1325
|
# Write calibrations
|
1313
|
-
_write_calibrations(file_obj, circuit.
|
1326
|
+
_write_calibrations(file_obj, circuit._calibrations_prop, metadata_serializer, version=version)
|
1314
1327
|
_write_layout(file_obj, circuit)
|
1315
1328
|
|
1316
1329
|
|
@@ -1440,7 +1453,9 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
|
|
1440
1453
|
|
1441
1454
|
# Read calibrations
|
1442
1455
|
if version >= 5:
|
1443
|
-
circ.
|
1456
|
+
circ._calibrations_prop = _read_calibrations(
|
1457
|
+
file_obj, version, vectors, metadata_deserializer
|
1458
|
+
)
|
1444
1459
|
|
1445
1460
|
for vec_name, (vector, initialized_params) in vectors.items():
|
1446
1461
|
if len(initialized_params) != len(vector):
|
@@ -20,9 +20,6 @@ from io import BytesIO
|
|
20
20
|
|
21
21
|
import numpy as np
|
22
22
|
import symengine as sym
|
23
|
-
from symengine.lib.symengine_wrapper import ( # pylint: disable = no-name-in-module
|
24
|
-
load_basic,
|
25
|
-
)
|
26
23
|
|
27
24
|
from qiskit.exceptions import QiskitError
|
28
25
|
from qiskit.pulse import library, channels, instructions
|
@@ -31,6 +28,7 @@ from qiskit.qpy import formats, common, type_keys
|
|
31
28
|
from qiskit.qpy.binary_io import value
|
32
29
|
from qiskit.qpy.exceptions import QpyError
|
33
30
|
from qiskit.pulse.configuration import Kernel, Discriminator
|
31
|
+
from qiskit.utils.deprecate_pulse import ignore_pulse_deprecation_warnings
|
34
32
|
|
35
33
|
|
36
34
|
def _read_channel(file_obj, version):
|
@@ -106,7 +104,7 @@ def _loads_symbolic_expr(expr_bytes, use_symengine=False):
|
|
106
104
|
return None
|
107
105
|
expr_bytes = zlib.decompress(expr_bytes)
|
108
106
|
if use_symengine:
|
109
|
-
return
|
107
|
+
return common.load_symengine_payload(expr_bytes)
|
110
108
|
else:
|
111
109
|
from sympy import parse_expr
|
112
110
|
|
@@ -513,6 +511,7 @@ def _dumps_reference_item(schedule, metadata_serializer, version):
|
|
513
511
|
return type_key, data_bytes
|
514
512
|
|
515
513
|
|
514
|
+
@ignore_pulse_deprecation_warnings
|
516
515
|
def read_schedule_block(file_obj, version, metadata_deserializer=None, use_symengine=False):
|
517
516
|
"""Read a single ScheduleBlock from the file like object.
|
518
517
|
|