qiskit 1.3.0__cp39-abi3-win32.whl → 1.3.0b1__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 +1 -20
- qiskit/_accelerate.pyd +0 -0
- qiskit/assembler/assemble_schedules.py +0 -2
- qiskit/circuit/__init__.py +1 -44
- qiskit/circuit/_standard_gates_commutations.py +0 -585
- qiskit/circuit/barrier.py +0 -2
- qiskit/circuit/controlflow/builder.py +3 -3
- qiskit/circuit/controlflow/if_else.py +5 -13
- qiskit/circuit/controlflow/while_loop.py +2 -10
- qiskit/circuit/delay.py +3 -20
- qiskit/circuit/equivalence.py +214 -13
- qiskit/circuit/gate.py +1 -3
- qiskit/circuit/instruction.py +11 -32
- qiskit/circuit/instructionset.py +0 -2
- qiskit/circuit/library/__init__.py +14 -110
- qiskit/circuit/library/arithmetic/__init__.py +2 -9
- qiskit/circuit/library/arithmetic/adders/__init__.py +0 -1
- qiskit/circuit/library/arithmetic/adders/adder.py +2 -154
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +56 -20
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +1 -14
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +91 -21
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +0 -1
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -8
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +3 -94
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +1 -8
- qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
- qiskit/circuit/library/basis_change/qft.py +38 -20
- qiskit/circuit/library/blueprintcircuit.py +0 -64
- qiskit/circuit/library/boolean_logic/__init__.py +4 -4
- qiskit/circuit/library/boolean_logic/inner_product.py +4 -81
- qiskit/circuit/library/boolean_logic/quantum_and.py +4 -107
- qiskit/circuit/library/boolean_logic/quantum_or.py +3 -107
- qiskit/circuit/library/boolean_logic/quantum_xor.py +3 -97
- qiskit/circuit/library/data_preparation/__init__.py +3 -6
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +29 -342
- qiskit/circuit/library/data_preparation/{_z_feature_map.py → z_feature_map.py} +34 -45
- qiskit/circuit/library/data_preparation/zz_feature_map.py +118 -0
- qiskit/circuit/library/fourier_checking.py +11 -72
- qiskit/circuit/library/generalized_gates/__init__.py +1 -1
- qiskit/circuit/library/generalized_gates/diagonal.py +51 -45
- qiskit/circuit/library/generalized_gates/gms.py +14 -67
- 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 +6 -12
- qiskit/circuit/library/generalized_gates/mcmt.py +107 -167
- qiskit/circuit/library/generalized_gates/permutation.py +6 -8
- qiskit/circuit/library/generalized_gates/rv.py +9 -8
- qiskit/circuit/library/graph_state.py +10 -93
- qiskit/circuit/library/grover_operator.py +2 -270
- qiskit/circuit/library/hidden_linear_function.py +20 -83
- qiskit/circuit/library/iqp.py +20 -99
- qiskit/circuit/library/n_local/__init__.py +7 -19
- qiskit/circuit/library/n_local/efficient_su2.py +5 -118
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +0 -259
- qiskit/circuit/library/n_local/excitation_preserving.py +6 -130
- qiskit/circuit/library/n_local/n_local.py +5 -406
- qiskit/circuit/library/n_local/pauli_two_design.py +4 -106
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -80
- qiskit/circuit/library/n_local/real_amplitudes.py +7 -127
- qiskit/circuit/library/n_local/two_local.py +7 -14
- qiskit/circuit/library/overlap.py +26 -91
- qiskit/circuit/library/pauli_evolution.py +15 -17
- qiskit/circuit/library/phase_estimation.py +4 -80
- qiskit/circuit/library/quantum_volume.py +20 -72
- qiskit/circuit/library/standard_gates/__init__.py +1 -20
- qiskit/circuit/library/standard_gates/dcx.py +1 -2
- qiskit/circuit/library/standard_gates/ecr.py +2 -2
- qiskit/circuit/library/standard_gates/h.py +3 -4
- qiskit/circuit/library/standard_gates/i.py +1 -2
- qiskit/circuit/library/standard_gates/iswap.py +2 -2
- qiskit/circuit/library/standard_gates/p.py +12 -20
- qiskit/circuit/library/standard_gates/r.py +1 -1
- qiskit/circuit/library/standard_gates/rx.py +3 -4
- qiskit/circuit/library/standard_gates/rxx.py +2 -2
- qiskit/circuit/library/standard_gates/ry.py +3 -4
- qiskit/circuit/library/standard_gates/ryy.py +2 -2
- qiskit/circuit/library/standard_gates/rz.py +12 -13
- 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 +3 -4
- qiskit/circuit/library/standard_gates/t.py +2 -2
- qiskit/circuit/library/standard_gates/u.py +3 -11
- qiskit/circuit/library/standard_gates/u1.py +15 -65
- qiskit/circuit/library/standard_gates/u2.py +1 -4
- qiskit/circuit/library/standard_gates/u3.py +3 -31
- qiskit/circuit/library/standard_gates/x.py +5 -7
- 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 +3 -4
- qiskit/circuit/library/standard_gates/z.py +3 -3
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +8 -9
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +7 -9
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +8 -9
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +8 -9
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +8 -9
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +9 -10
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +7 -9
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +8 -10
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +14 -16
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +12 -14
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +12 -14
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +9 -11
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +9 -11
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +9 -11
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +9 -11
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +10 -12
- qiskit/circuit/library/templates/rzx/rzx_cy.py +10 -11
- qiskit/circuit/library/templates/rzx/rzx_xz.py +15 -16
- qiskit/circuit/library/templates/rzx/rzx_yz.py +10 -12
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +20 -22
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +15 -16
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +15 -17
- qiskit/circuit/parameter.py +0 -4
- qiskit/circuit/parameterexpression.py +34 -167
- qiskit/circuit/quantumcircuit.py +126 -162
- qiskit/circuit/singleton.py +0 -2
- qiskit/circuit/store.py +0 -2
- qiskit/compiler/assembler.py +4 -17
- qiskit/compiler/scheduler.py +0 -2
- qiskit/compiler/sequencer.py +0 -2
- qiskit/compiler/transpiler.py +26 -81
- 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 +5 -7
- qiskit/converters/dag_to_dagdependency.py +1 -1
- qiskit/converters/dag_to_dagdependency_v2.py +1 -1
- qiskit/converters/dagdependency_to_circuit.py +1 -5
- qiskit/converters/dagdependency_to_dag.py +1 -6
- qiskit/dagcircuit/collect_blocks.py +3 -3
- qiskit/dagcircuit/dagdependency.py +5 -18
- qiskit/dagcircuit/dagdependency_v2.py +1 -1
- qiskit/dagcircuit/dagnode.py +2 -2
- qiskit/passmanager/__init__.py +2 -2
- qiskit/primitives/backend_estimator.py +2 -5
- qiskit/primitives/backend_sampler_v2.py +18 -61
- qiskit/primitives/base/base_estimator.py +2 -2
- qiskit/primitives/containers/data_bin.py +1 -9
- qiskit/primitives/statevector_sampler.py +1 -1
- qiskit/primitives/utils.py +1 -1
- qiskit/providers/__init__.py +3 -3
- qiskit/providers/backend.py +1 -12
- qiskit/providers/backend_compat.py +3 -23
- qiskit/providers/basic_provider/basic_simulator.py +2 -12
- qiskit/providers/fake_provider/fake_pulse_backend.py +1 -6
- qiskit/providers/fake_provider/generic_backend_v2.py +30 -46
- qiskit/providers/models/pulsedefaults.py +0 -2
- qiskit/pulse/builder.py +18 -59
- qiskit/pulse/calibration_entries.py +1 -4
- qiskit/pulse/channels.py +0 -2
- qiskit/pulse/exceptions.py +0 -2
- qiskit/pulse/instruction_schedule_map.py +6 -21
- qiskit/pulse/instructions/acquire.py +0 -2
- qiskit/pulse/instructions/delay.py +0 -2
- qiskit/pulse/instructions/directives.py +0 -8
- qiskit/pulse/instructions/frequency.py +0 -3
- qiskit/pulse/instructions/instruction.py +0 -2
- qiskit/pulse/instructions/phase.py +0 -3
- qiskit/pulse/instructions/play.py +0 -2
- qiskit/pulse/instructions/reference.py +0 -2
- qiskit/pulse/instructions/snapshot.py +0 -2
- qiskit/pulse/library/pulse.py +0 -2
- qiskit/pulse/library/symbolic_pulses.py +0 -28
- qiskit/pulse/library/waveform.py +0 -2
- qiskit/pulse/macros.py +1 -1
- qiskit/pulse/schedule.py +13 -12
- qiskit/pulse/transforms/alignments.py +3 -5
- qiskit/pulse/transforms/dag.py +0 -7
- qiskit/qasm2/export.py +3 -5
- qiskit/qasm2/parse.py +2 -46
- qiskit/qasm3/__init__.py +0 -1
- qiskit/qasm3/ast.py +15 -123
- qiskit/qasm3/exporter.py +77 -103
- qiskit/qobj/converters/pulse_instruction.py +4 -6
- qiskit/qpy/__init__.py +0 -181
- qiskit/qpy/binary_io/circuits.py +5 -20
- qiskit/qpy/binary_io/schedules.py +4 -3
- qiskit/qpy/binary_io/value.py +13 -310
- qiskit/qpy/common.py +2 -46
- qiskit/qpy/formats.py +0 -7
- qiskit/qpy/interface.py +4 -40
- qiskit/quantum_info/__init__.py +0 -4
- qiskit/quantum_info/operators/channel/transformations.py +21 -28
- qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
- qiskit/quantum_info/operators/operator.py +8 -54
- qiskit/quantum_info/operators/symplectic/base_pauli.py +19 -11
- 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 +0 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +2 -23
- 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 +1 -9
- qiskit/result/mitigation/local_readout_mitigator.py +1 -9
- qiskit/result/mitigation/utils.py +0 -57
- qiskit/scheduler/config.py +0 -2
- qiskit/scheduler/methods/basic.py +0 -3
- qiskit/scheduler/schedule_circuit.py +0 -2
- qiskit/scheduler/sequence.py +0 -2
- qiskit/synthesis/__init__.py +0 -25
- qiskit/synthesis/clifford/clifford_decompose_bm.py +2 -1
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +2 -3
- qiskit/synthesis/clifford/clifford_decompose_layers.py +1 -2
- qiskit/synthesis/evolution/__init__.py +0 -1
- qiskit/synthesis/evolution/lie_trotter.py +42 -16
- qiskit/synthesis/evolution/product_formula.py +238 -165
- qiskit/synthesis/evolution/qdrift.py +29 -36
- qiskit/synthesis/evolution/suzuki_trotter.py +27 -87
- qiskit/synthesis/multi_controlled/__init__.py +0 -1
- qiskit/synthesis/qft/qft_decompose_full.py +1 -19
- qiskit/synthesis/qft/qft_decompose_lnn.py +1 -2
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +1 -2
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +63 -4
- qiskit/synthesis/two_qubit/weyl.py +97 -0
- qiskit/synthesis/unitary/qsd.py +5 -5
- qiskit/transpiler/__init__.py +14 -21
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/passes/__init__.py +0 -2
- qiskit/transpiler/passes/basis/basis_translator.py +565 -9
- qiskit/transpiler/passes/basis/decompose.py +12 -45
- 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 +2 -4
- qiskit/transpiler/passes/calibration/rx_builder.py +7 -11
- qiskit/transpiler/passes/calibration/rzx_builder.py +30 -46
- qiskit/transpiler/passes/layout/disjoint_utils.py +13 -15
- qiskit/transpiler/passes/layout/sabre_layout.py +2 -7
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +0 -5
- qiskit/transpiler/passes/optimization/__init__.py +0 -1
- qiskit/transpiler/passes/optimization/collect_cliffords.py +3 -19
- 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 +131 -48
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +2 -4
- qiskit/transpiler/passes/optimization/elide_permutations.py +32 -9
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +0 -2
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +11 -5
- 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/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 +3 -7
- 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 +0 -2
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
- qiskit/transpiler/passes/scheduling/asap.py +1 -1
- qiskit/transpiler/passes/scheduling/base_scheduler.py +12 -14
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +4 -9
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +5 -16
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +1 -4
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +2 -6
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -9
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +99 -262
- qiskit/transpiler/passes/synthesis/hls_plugins.py +7 -638
- qiskit/transpiler/passes/synthesis/qubit_tracker.py +132 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -55
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +56 -2
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -5
- qiskit/transpiler/passes/utils/gate_direction.py +275 -12
- qiskit/transpiler/passes/utils/gates_basis.py +30 -7
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +1 -2
- qiskit/transpiler/passmanager_config.py +4 -22
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +14 -40
- qiskit/transpiler/preset_passmanagers/common.py +3 -5
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +42 -125
- qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
- qiskit/transpiler/target.py +16 -74
- qiskit/visualization/circuit/_utils.py +2 -2
- qiskit/visualization/circuit/circuit_visualization.py +2 -3
- qiskit/visualization/circuit/matplotlib.py +1 -1
- qiskit/visualization/dag_visualization.py +1 -1
- qiskit/visualization/pass_manager_visualization.py +14 -3
- qiskit/visualization/pulse_v2/interface.py +1 -3
- qiskit/visualization/timeline/core.py +2 -25
- qiskit/visualization/timeline/interface.py +0 -12
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/METADATA +19 -20
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/RECORD +347 -358
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/WHEEL +1 -1
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/entry_points.txt +0 -19
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +0 -150
- qiskit/circuit/twirling.py +0 -145
- qiskit/synthesis/arithmetic/__init__.py +0 -16
- qiskit/synthesis/arithmetic/adders/__init__.py +0 -17
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +0 -154
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +0 -103
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +0 -161
- qiskit/synthesis/arithmetic/multipliers/__init__.py +0 -16
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +0 -102
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +0 -99
- qiskit/synthesis/evolution/pauli_network.py +0 -80
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +0 -52
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +0 -69
- qiskit/utils/deprecate_pulse.py +0 -119
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/top_level.txt +0 -0
qiskit/qasm3/exporter.py
CHANGED
@@ -30,6 +30,7 @@ from qiskit.circuit import (
|
|
30
30
|
Barrier,
|
31
31
|
CircuitInstruction,
|
32
32
|
Clbit,
|
33
|
+
ControlledGate,
|
33
34
|
Gate,
|
34
35
|
Measure,
|
35
36
|
Parameter,
|
@@ -139,16 +140,9 @@ class Exporter:
|
|
139
140
|
):
|
140
141
|
"""
|
141
142
|
Args:
|
142
|
-
includes: the filenames that should be emitted as includes.
|
143
|
-
|
144
|
-
|
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
|
-
|
143
|
+
includes: the filenames that should be emitted as includes. These files will be parsed
|
144
|
+
for gates, and any objects dumped from this exporter will use those definitions
|
145
|
+
where possible.
|
152
146
|
basis_gates: the basic defined gate set of the backend.
|
153
147
|
disable_constants: if ``True``, always emit floating-point constants for numeric
|
154
148
|
parameter values. If ``False`` (the default), then values close to multiples of
|
@@ -208,60 +202,46 @@ class Exporter:
|
|
208
202
|
# comparisons will work.
|
209
203
|
_FIXED_PARAMETERS = (Parameter("p0"), Parameter("p1"), Parameter("p2"), Parameter("p3"))
|
210
204
|
|
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
|
-
|
225
205
|
# Mapping of symbols defined by `stdgates.inc` to their gate definition source.
|
226
206
|
_KNOWN_INCLUDES = {
|
227
207
|
"stdgates.inc": {
|
228
|
-
"p":
|
229
|
-
"x":
|
230
|
-
"y":
|
231
|
-
"z":
|
232
|
-
"h":
|
233
|
-
"s":
|
234
|
-
"sdg":
|
235
|
-
"t":
|
236
|
-
"tdg":
|
237
|
-
"sx":
|
238
|
-
"rx":
|
239
|
-
"ry":
|
240
|
-
"rz":
|
241
|
-
"cx":
|
242
|
-
"cy":
|
243
|
-
"cz":
|
244
|
-
"cp":
|
245
|
-
"crx":
|
246
|
-
"cry":
|
247
|
-
"crz":
|
248
|
-
"ch":
|
249
|
-
"swap":
|
250
|
-
"ccx":
|
251
|
-
"cswap":
|
252
|
-
"cu":
|
253
|
-
"CX":
|
254
|
-
"phase":
|
255
|
-
"cphase":
|
256
|
-
"id":
|
257
|
-
"u1":
|
258
|
-
"u2":
|
259
|
-
"u3":
|
208
|
+
"p": library.PhaseGate(*_FIXED_PARAMETERS[:1]),
|
209
|
+
"x": library.XGate(),
|
210
|
+
"y": library.YGate(),
|
211
|
+
"z": library.ZGate(),
|
212
|
+
"h": library.HGate(),
|
213
|
+
"s": library.SGate(),
|
214
|
+
"sdg": library.SdgGate(),
|
215
|
+
"t": library.TGate(),
|
216
|
+
"tdg": library.TdgGate(),
|
217
|
+
"sx": library.SXGate(),
|
218
|
+
"rx": library.RXGate(*_FIXED_PARAMETERS[:1]),
|
219
|
+
"ry": library.RYGate(*_FIXED_PARAMETERS[:1]),
|
220
|
+
"rz": library.RZGate(*_FIXED_PARAMETERS[:1]),
|
221
|
+
"cx": library.CXGate(),
|
222
|
+
"cy": library.CYGate(),
|
223
|
+
"cz": library.CZGate(),
|
224
|
+
"cp": library.CPhaseGate(*_FIXED_PARAMETERS[:1]),
|
225
|
+
"crx": library.CRXGate(*_FIXED_PARAMETERS[:1]),
|
226
|
+
"cry": library.CRYGate(*_FIXED_PARAMETERS[:1]),
|
227
|
+
"crz": library.CRZGate(*_FIXED_PARAMETERS[:1]),
|
228
|
+
"ch": library.CHGate(),
|
229
|
+
"swap": library.SwapGate(),
|
230
|
+
"ccx": library.CCXGate(),
|
231
|
+
"cswap": library.CSwapGate(),
|
232
|
+
"cu": library.CUGate(*_FIXED_PARAMETERS[:4]),
|
233
|
+
"CX": library.CXGate(),
|
234
|
+
"phase": library.PhaseGate(*_FIXED_PARAMETERS[:1]),
|
235
|
+
"cphase": library.CPhaseGate(*_FIXED_PARAMETERS[:1]),
|
236
|
+
"id": library.IGate(),
|
237
|
+
"u1": library.U1Gate(*_FIXED_PARAMETERS[:1]),
|
238
|
+
"u2": library.U2Gate(*_FIXED_PARAMETERS[:2]),
|
239
|
+
"u3": library.U3Gate(*_FIXED_PARAMETERS[:3]),
|
260
240
|
},
|
261
241
|
}
|
262
242
|
|
263
243
|
_BUILTIN_GATES = {
|
264
|
-
"U":
|
244
|
+
"U": library.UGate(*_FIXED_PARAMETERS[:3]),
|
265
245
|
}
|
266
246
|
|
267
247
|
|
@@ -492,14 +472,9 @@ class SymbolTable:
|
|
492
472
|
def get_gate(self, gate: Gate) -> ast.Identifier | None:
|
493
473
|
"""Lookup the identifier for a given `Gate`, if it exists."""
|
494
474
|
canonical = _gate_canonical_form(gate)
|
475
|
+
# `our_defn.canonical is None` means a basis gate that we should assume is always valid.
|
495
476
|
if (our_defn := self.gates.get(gate.name)) is not None and (
|
496
|
-
|
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
|
477
|
+
our_defn.canonical is None or our_defn.canonical == canonical
|
503
478
|
):
|
504
479
|
return ast.Identifier(gate.name)
|
505
480
|
if canonical._standard_gate is not None:
|
@@ -524,14 +499,11 @@ def _gate_canonical_form(gate: Gate) -> Gate:
|
|
524
499
|
# If a gate is part of the Qiskit standard-library gates, we know we can safely produce a
|
525
500
|
# reparameterised gate by passing the parameters positionally to the standard-gate constructor
|
526
501
|
# (and control state, if appropriate).
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
if standard.is_controlled_gate
|
533
|
-
else _CANONICAL_STANDARD_GATES[standard]
|
534
|
-
)
|
502
|
+
if gate._standard_gate and not isinstance(gate, ControlledGate):
|
503
|
+
return gate.base_class(*_FIXED_PARAMETERS[: len(gate.params)])
|
504
|
+
elif gate._standard_gate:
|
505
|
+
return gate.base_class(*_FIXED_PARAMETERS[: len(gate.params)], ctrl_state=gate.ctrl_state)
|
506
|
+
return gate
|
535
507
|
|
536
508
|
|
537
509
|
@dataclasses.dataclass
|
@@ -618,10 +590,12 @@ class QASM3Builder:
|
|
618
590
|
self.scope = old_scope
|
619
591
|
self.symbols = old_symbols
|
620
592
|
|
621
|
-
def
|
622
|
-
"""Lookup a Qiskit
|
593
|
+
def _lookup_variable(self, variable) -> ast.Identifier:
|
594
|
+
"""Lookup a Qiskit object within the current context, and return the name that should be
|
623
595
|
used to represent it in OpenQASM 3 programmes."""
|
624
|
-
|
596
|
+
if isinstance(variable, Bit):
|
597
|
+
variable = self.scope.bit_map[variable]
|
598
|
+
return self.symbols.get_variable(variable)
|
625
599
|
|
626
600
|
def build_program(self):
|
627
601
|
"""Builds a Program"""
|
@@ -701,9 +675,9 @@ class QASM3Builder:
|
|
701
675
|
def build_includes(self):
|
702
676
|
"""Builds a list of included files."""
|
703
677
|
for filename in self.includes:
|
704
|
-
|
705
|
-
|
706
|
-
for name, gate in
|
678
|
+
if (definitions := _KNOWN_INCLUDES.get(filename)) is None:
|
679
|
+
raise QASM3ExporterError(f"Unknown OpenQASM 3 include file: '{filename}'")
|
680
|
+
for name, gate in definitions.items():
|
707
681
|
self.symbols.register_gate_without_definition(name, gate)
|
708
682
|
yield ast.Include(filename)
|
709
683
|
|
@@ -928,7 +902,7 @@ class QASM3Builder:
|
|
928
902
|
out = []
|
929
903
|
for register in registers:
|
930
904
|
name = self.symbols.register_variable(register.name, register, allow_rename=True)
|
931
|
-
elements = [self.
|
905
|
+
elements = [self._lookup_variable(bit) for bit in register]
|
932
906
|
for i, bit in enumerate(register):
|
933
907
|
# This might shadow previous definitions, but that's not a problem.
|
934
908
|
self.symbols.set_object_ident(
|
@@ -975,17 +949,18 @@ class QASM3Builder:
|
|
975
949
|
if isinstance(instruction.operation, Gate):
|
976
950
|
nodes = [self.build_gate_call(instruction)]
|
977
951
|
elif isinstance(instruction.operation, Barrier):
|
978
|
-
operands = [self.
|
952
|
+
operands = [self._lookup_variable(operand) for operand in instruction.qubits]
|
979
953
|
nodes = [ast.QuantumBarrier(operands)]
|
980
954
|
elif isinstance(instruction.operation, Measure):
|
981
955
|
measurement = ast.QuantumMeasurement(
|
982
|
-
[self.
|
956
|
+
[self._lookup_variable(operand) for operand in instruction.qubits]
|
983
957
|
)
|
984
|
-
qubit = self.
|
958
|
+
qubit = self._lookup_variable(instruction.clbits[0])
|
985
959
|
nodes = [ast.QuantumMeasurementAssignment(qubit, measurement)]
|
986
960
|
elif isinstance(instruction.operation, Reset):
|
987
961
|
nodes = [
|
988
|
-
ast.QuantumReset(self.
|
962
|
+
ast.QuantumReset(self._lookup_variable(operand))
|
963
|
+
for operand in instruction.qubits
|
989
964
|
]
|
990
965
|
elif isinstance(instruction.operation, Delay):
|
991
966
|
nodes = [self.build_delay(instruction)]
|
@@ -1006,13 +981,13 @@ class QASM3Builder:
|
|
1006
981
|
f" but received '{instruction.operation}'"
|
1007
982
|
)
|
1008
983
|
|
1009
|
-
if instruction.operation.
|
984
|
+
if instruction.operation.condition is None:
|
1010
985
|
statements.extend(nodes)
|
1011
986
|
else:
|
1012
987
|
body = ast.ProgramBlock(nodes)
|
1013
988
|
statements.append(
|
1014
989
|
ast.BranchingStatement(
|
1015
|
-
self.build_expression(_lift_condition(instruction.operation.
|
990
|
+
self.build_expression(_lift_condition(instruction.operation.condition)),
|
1016
991
|
body,
|
1017
992
|
)
|
1018
993
|
)
|
@@ -1119,14 +1094,9 @@ class QASM3Builder:
|
|
1119
1094
|
body_ast = ast.ProgramBlock(self.build_current_scope())
|
1120
1095
|
return ast.ForLoopStatement(indexset_ast, loop_parameter_ast, body_ast)
|
1121
1096
|
|
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
|
-
|
1127
1097
|
def build_expression(self, node: expr.Expr) -> ast.Expression:
|
1128
1098
|
"""Build an expression."""
|
1129
|
-
return node.accept(_ExprBuilder(self.
|
1099
|
+
return node.accept(_ExprBuilder(self._lookup_variable))
|
1130
1100
|
|
1131
1101
|
def build_delay(self, instruction: CircuitInstruction) -> ast.QuantumDelay:
|
1132
1102
|
"""Build a built-in delay statement."""
|
@@ -1146,7 +1116,9 @@ class QASM3Builder:
|
|
1146
1116
|
"dt": ast.DurationUnit.SAMPLE,
|
1147
1117
|
}
|
1148
1118
|
duration = ast.DurationLiteral(duration_value, unit_map[unit])
|
1149
|
-
return ast.QuantumDelay(
|
1119
|
+
return ast.QuantumDelay(
|
1120
|
+
duration, [self._lookup_variable(qubit) for qubit in instruction.qubits]
|
1121
|
+
)
|
1150
1122
|
|
1151
1123
|
def build_integer(self, value) -> ast.IntegerLiteral:
|
1152
1124
|
"""Build an integer literal, raising a :obj:`.QASM3ExporterError` if the input is not
|
@@ -1166,11 +1138,9 @@ class QASM3Builder:
|
|
1166
1138
|
# missing, pending a new system in Terra to replace it (2022-03-07).
|
1167
1139
|
if not isinstance(expression, ParameterExpression):
|
1168
1140
|
return expression
|
1169
|
-
if isinstance(expression, Parameter):
|
1170
|
-
return self.symbols.get_variable(expression).string
|
1171
1141
|
return expression.subs(
|
1172
1142
|
{
|
1173
|
-
param: Parameter(self.
|
1143
|
+
param: Parameter(self._lookup_variable(param).string)
|
1174
1144
|
for param in expression.parameters
|
1175
1145
|
}
|
1176
1146
|
)
|
@@ -1183,14 +1153,18 @@ class QASM3Builder:
|
|
1183
1153
|
ident = self.symbols.get_gate(instruction.operation)
|
1184
1154
|
if ident is None:
|
1185
1155
|
ident = self.define_gate(instruction.operation)
|
1186
|
-
qubits = [self.
|
1187
|
-
|
1188
|
-
|
1189
|
-
|
1190
|
-
|
1191
|
-
|
1192
|
-
|
1193
|
-
|
1156
|
+
qubits = [self._lookup_variable(qubit) for qubit in instruction.qubits]
|
1157
|
+
if self.disable_constants:
|
1158
|
+
parameters = [
|
1159
|
+
ast.StringifyAndPray(self._rebind_scoped_parameters(param))
|
1160
|
+
for param in instruction.operation.params
|
1161
|
+
]
|
1162
|
+
else:
|
1163
|
+
parameters = [
|
1164
|
+
ast.StringifyAndPray(pi_check(self._rebind_scoped_parameters(param), output="qasm"))
|
1165
|
+
for param in instruction.operation.params
|
1166
|
+
]
|
1167
|
+
|
1194
1168
|
return ast.QuantumGateCall(ident, qubits, parameters=parameters)
|
1195
1169
|
|
1196
1170
|
|
@@ -31,7 +31,6 @@ 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
|
35
34
|
|
36
35
|
|
37
36
|
class ParametricPulseShapes(Enum):
|
@@ -88,9 +87,9 @@ class InstructionToQobjConverter:
|
|
88
87
|
This converter converts the Qiskit Pulse in-memory representation into
|
89
88
|
the transfer layer format to submit the data from client to the server.
|
90
89
|
|
91
|
-
The transfer layer format must be the text representation that
|
90
|
+
The transfer layer format must be the text representation that coforms to
|
92
91
|
the `OpenPulse specification<https://arxiv.org/abs/1809.03452>`__.
|
93
|
-
|
92
|
+
Extention to the OpenPulse can be achieved by subclassing this this with
|
94
93
|
extra methods corresponding to each augmented instruction. For example,
|
95
94
|
|
96
95
|
.. code-block:: python
|
@@ -510,9 +509,9 @@ class QobjToInstructionConverter:
|
|
510
509
|
This converter converts data from transfer layer into the in-memory representation of
|
511
510
|
the front-end of Qiskit Pulse.
|
512
511
|
|
513
|
-
The transfer layer format must be the text representation that
|
512
|
+
The transfer layer format must be the text representation that coforms to
|
514
513
|
the `OpenPulse specification<https://arxiv.org/abs/1809.03452>`__.
|
515
|
-
|
514
|
+
Extention to the OpenPulse can be achieved by subclassing this this with
|
516
515
|
extra methods corresponding to each augmented instruction. For example,
|
517
516
|
|
518
517
|
.. code-block:: python
|
@@ -533,7 +532,6 @@ class QobjToInstructionConverter:
|
|
533
532
|
|
534
533
|
__chan_regex__ = re.compile(r"([a-zA-Z]+)(\d+)")
|
535
534
|
|
536
|
-
@deprecate_pulse_dependency
|
537
535
|
def __init__(
|
538
536
|
self,
|
539
537
|
pulse_library: Optional[List[PulseLibraryItem]] = None,
|
qiskit/qpy/__init__.py
CHANGED
@@ -97,8 +97,6 @@ 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
|
-
|
102
100
|
QPY Compatibility
|
103
101
|
=================
|
104
102
|
|
@@ -118,30 +116,6 @@ and how the feature will be internally handled.
|
|
118
116
|
|
119
117
|
.. autoexception:: QPYLoadingDeprecatedFeatureWarning
|
120
118
|
|
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
|
-
|
145
119
|
QPY format version history
|
146
120
|
--------------------------
|
147
121
|
|
@@ -159,24 +133,6 @@ of QPY in qiskit-terra 0.18.0.
|
|
159
133
|
* - Qiskit (qiskit-terra for < 1.0.0) version
|
160
134
|
- :func:`.dump` format(s) output versions
|
161
135
|
- :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
|
180
136
|
* - 1.1.0
|
181
137
|
- 10, 11, 12
|
182
138
|
- 12
|
@@ -342,141 +298,6 @@ There is a circuit payload for each circuit (where the total number is dictated
|
|
342
298
|
by ``num_circuits`` in the file header). There is no padding between the
|
343
299
|
circuits in the data.
|
344
300
|
|
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
|
-
|
480
301
|
.. _qpy_version_12:
|
481
302
|
|
482
303
|
Version 12
|
@@ -1800,8 +1621,6 @@ struct is used:
|
|
1800
1621
|
|
1801
1622
|
this matches the internal C representation of Python's complex type. [#f3]_
|
1802
1623
|
|
1803
|
-
References
|
1804
|
-
==========
|
1805
1624
|
|
1806
1625
|
.. [#f1] https://tools.ietf.org/html/rfc1700
|
1807
1626
|
.. [#f2] https://numpy.org/doc/stable/reference/generated/numpy.lib.format.html
|
qiskit/qpy/binary_io/circuits.py
CHANGED
@@ -318,13 +318,6 @@ 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
|
-
)
|
328
321
|
inst_obj.condition = condition
|
329
322
|
if instruction.label_size > 0:
|
330
323
|
inst_obj.label = label
|
@@ -421,12 +414,6 @@ def _read_instruction(
|
|
421
414
|
gate = gate_class(*params)
|
422
415
|
if condition:
|
423
416
|
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
|
-
)
|
430
417
|
gate = gate.c_if(*condition)
|
431
418
|
else:
|
432
419
|
gate.condition = condition
|
@@ -774,13 +761,13 @@ def _write_instruction(
|
|
774
761
|
condition_type = type_keys.Condition.NONE
|
775
762
|
condition_register = b""
|
776
763
|
condition_value = 0
|
777
|
-
if (op_condition := getattr(instruction.operation, "
|
764
|
+
if (op_condition := getattr(instruction.operation, "condition", None)) is not None:
|
778
765
|
if isinstance(op_condition, expr.Expr):
|
779
766
|
condition_type = type_keys.Condition.EXPRESSION
|
780
767
|
else:
|
781
768
|
condition_type = type_keys.Condition.TWO_TUPLE
|
782
|
-
condition_register = _dumps_register(instruction.operation.
|
783
|
-
condition_value = int(instruction.operation.
|
769
|
+
condition_register = _dumps_register(instruction.operation.condition[0], index_map)
|
770
|
+
condition_value = int(instruction.operation.condition[1])
|
784
771
|
|
785
772
|
gate_class_name = gate_class_name.encode(common.ENCODE)
|
786
773
|
label = getattr(instruction.operation, "label", None)
|
@@ -1323,7 +1310,7 @@ def write_circuit(
|
|
1323
1310
|
instruction_buffer.close()
|
1324
1311
|
|
1325
1312
|
# Write calibrations
|
1326
|
-
_write_calibrations(file_obj, circuit.
|
1313
|
+
_write_calibrations(file_obj, circuit.calibrations, metadata_serializer, version=version)
|
1327
1314
|
_write_layout(file_obj, circuit)
|
1328
1315
|
|
1329
1316
|
|
@@ -1453,9 +1440,7 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
|
|
1453
1440
|
|
1454
1441
|
# Read calibrations
|
1455
1442
|
if version >= 5:
|
1456
|
-
circ.
|
1457
|
-
file_obj, version, vectors, metadata_deserializer
|
1458
|
-
)
|
1443
|
+
circ.calibrations = _read_calibrations(file_obj, version, vectors, metadata_deserializer)
|
1459
1444
|
|
1460
1445
|
for vec_name, (vector, initialized_params) in vectors.items():
|
1461
1446
|
if len(initialized_params) != len(vector):
|
@@ -20,6 +20,9 @@ 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
|
+
)
|
23
26
|
|
24
27
|
from qiskit.exceptions import QiskitError
|
25
28
|
from qiskit.pulse import library, channels, instructions
|
@@ -28,7 +31,6 @@ from qiskit.qpy import formats, common, type_keys
|
|
28
31
|
from qiskit.qpy.binary_io import value
|
29
32
|
from qiskit.qpy.exceptions import QpyError
|
30
33
|
from qiskit.pulse.configuration import Kernel, Discriminator
|
31
|
-
from qiskit.utils.deprecate_pulse import ignore_pulse_deprecation_warnings
|
32
34
|
|
33
35
|
|
34
36
|
def _read_channel(file_obj, version):
|
@@ -104,7 +106,7 @@ def _loads_symbolic_expr(expr_bytes, use_symengine=False):
|
|
104
106
|
return None
|
105
107
|
expr_bytes = zlib.decompress(expr_bytes)
|
106
108
|
if use_symengine:
|
107
|
-
return
|
109
|
+
return load_basic(expr_bytes)
|
108
110
|
else:
|
109
111
|
from sympy import parse_expr
|
110
112
|
|
@@ -511,7 +513,6 @@ def _dumps_reference_item(schedule, metadata_serializer, version):
|
|
511
513
|
return type_key, data_bytes
|
512
514
|
|
513
515
|
|
514
|
-
@ignore_pulse_deprecation_warnings
|
515
516
|
def read_schedule_block(file_obj, version, metadata_deserializer=None, use_symengine=False):
|
516
517
|
"""Read a single ScheduleBlock from the file like object.
|
517
518
|
|