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/qpy/binary_io/value.py
CHANGED
@@ -15,20 +15,23 @@
|
|
15
15
|
from __future__ import annotations
|
16
16
|
|
17
17
|
import collections.abc
|
18
|
+
import io
|
18
19
|
import struct
|
19
20
|
import uuid
|
20
21
|
|
21
22
|
import numpy as np
|
22
23
|
import symengine
|
23
|
-
from symengine.lib.symengine_wrapper import ( # pylint: disable = no-name-in-module
|
24
|
-
load_basic,
|
25
|
-
)
|
26
24
|
|
27
25
|
|
28
26
|
from qiskit.circuit import CASE_DEFAULT, Clbit, ClassicalRegister
|
29
27
|
from qiskit.circuit.classical import expr, types
|
30
28
|
from qiskit.circuit.parameter import Parameter
|
31
|
-
from qiskit.circuit.parameterexpression import
|
29
|
+
from qiskit.circuit.parameterexpression import (
|
30
|
+
ParameterExpression,
|
31
|
+
op_code_to_method,
|
32
|
+
_OPCode,
|
33
|
+
_SUBS,
|
34
|
+
)
|
32
35
|
from qiskit.circuit.parametervector import ParameterVector, ParameterVectorElement
|
33
36
|
from qiskit.qpy import common, formats, exceptions, type_keys
|
34
37
|
|
@@ -53,20 +56,132 @@ def _write_parameter_vec(file_obj, obj):
|
|
53
56
|
file_obj.write(name_bytes)
|
54
57
|
|
55
58
|
|
56
|
-
def
|
57
|
-
|
58
|
-
|
59
|
+
def _encode_replay_entry(inst, file_obj, version, r_side=False):
|
60
|
+
inst_type = None
|
61
|
+
inst_data = None
|
62
|
+
if inst is None:
|
63
|
+
inst_type = "n"
|
64
|
+
inst_data = b"\x00"
|
65
|
+
elif isinstance(inst, Parameter):
|
66
|
+
inst_type = "p"
|
67
|
+
inst_data = inst.uuid.bytes
|
68
|
+
elif isinstance(inst, complex):
|
69
|
+
inst_type = "c"
|
70
|
+
inst_data = struct.pack("!dd", inst.real, inst.imag)
|
71
|
+
elif isinstance(inst, float):
|
72
|
+
inst_type = "f"
|
73
|
+
inst_data = struct.pack("!Qd", 0, inst)
|
74
|
+
elif isinstance(inst, int):
|
75
|
+
inst_type = "i"
|
76
|
+
inst_data = struct.pack("!Qq", 0, inst)
|
77
|
+
elif isinstance(inst, ParameterExpression):
|
78
|
+
if not r_side:
|
79
|
+
entry = struct.pack(
|
80
|
+
formats.PARAM_EXPR_ELEM_V13_PACK,
|
81
|
+
255,
|
82
|
+
"s".encode("utf8"),
|
83
|
+
b"\x00",
|
84
|
+
"n".encode("utf8"),
|
85
|
+
b"\x00",
|
86
|
+
)
|
87
|
+
else:
|
88
|
+
entry = struct.pack(
|
89
|
+
formats.PARAM_EXPR_ELEM_V13_PACK,
|
90
|
+
255,
|
91
|
+
"n".encode("utf8"),
|
92
|
+
b"\x00",
|
93
|
+
"s".encode("utf8"),
|
94
|
+
b"\x00",
|
95
|
+
)
|
96
|
+
file_obj.write(entry)
|
97
|
+
_write_parameter_expression_v13(file_obj, inst, version)
|
98
|
+
if not r_side:
|
99
|
+
entry = struct.pack(
|
100
|
+
formats.PARAM_EXPR_ELEM_V13_PACK,
|
101
|
+
255,
|
102
|
+
"e".encode("utf8"),
|
103
|
+
b"\x00",
|
104
|
+
"n".encode("utf8"),
|
105
|
+
b"\x00",
|
106
|
+
)
|
107
|
+
else:
|
108
|
+
entry = struct.pack(
|
109
|
+
formats.PARAM_EXPR_ELEM_V13_PACK,
|
110
|
+
255,
|
111
|
+
"n".encode("utf8"),
|
112
|
+
b"\x00",
|
113
|
+
"e".encode("utf8"),
|
114
|
+
b"\x00",
|
115
|
+
)
|
116
|
+
file_obj.write(entry)
|
117
|
+
inst_type = "n"
|
118
|
+
inst_data = b"\x00"
|
59
119
|
else:
|
60
|
-
|
120
|
+
raise exceptions.QpyError("Invalid parameter expression type")
|
121
|
+
return inst_type, inst_data
|
122
|
+
|
61
123
|
|
62
|
-
|
124
|
+
def _encode_replay_subs(subs, file_obj, version):
|
125
|
+
with io.BytesIO() as mapping_buf:
|
126
|
+
subs_dict = {k.name: v for k, v in subs.binds.items()}
|
127
|
+
common.write_mapping(
|
128
|
+
mapping_buf, mapping=subs_dict, serializer=dumps_value, version=version
|
129
|
+
)
|
130
|
+
data = mapping_buf.getvalue()
|
131
|
+
entry = struct.pack(
|
132
|
+
formats.PARAM_EXPR_ELEM_V13_PACK,
|
133
|
+
subs.op,
|
134
|
+
"u".encode("utf8"),
|
135
|
+
struct.pack("!QQ", len(data), 0),
|
136
|
+
"n".encode("utf8"),
|
137
|
+
b"\x00",
|
138
|
+
)
|
139
|
+
file_obj.write(entry)
|
140
|
+
file_obj.write(data)
|
141
|
+
return subs.binds
|
142
|
+
|
143
|
+
|
144
|
+
def _write_parameter_expression_v13(file_obj, obj, version):
|
145
|
+
symbol_map = {}
|
146
|
+
for inst in obj._qpy_replay:
|
147
|
+
if isinstance(inst, _SUBS):
|
148
|
+
symbol_map.update(_encode_replay_subs(inst, file_obj, version))
|
149
|
+
continue
|
150
|
+
lhs_type, lhs = _encode_replay_entry(inst.lhs, file_obj, version)
|
151
|
+
rhs_type, rhs = _encode_replay_entry(inst.rhs, file_obj, version, True)
|
152
|
+
entry = struct.pack(
|
153
|
+
formats.PARAM_EXPR_ELEM_V13_PACK,
|
154
|
+
inst.op,
|
155
|
+
lhs_type.encode("utf8"),
|
156
|
+
lhs,
|
157
|
+
rhs_type.encode("utf8"),
|
158
|
+
rhs,
|
159
|
+
)
|
160
|
+
file_obj.write(entry)
|
161
|
+
return symbol_map
|
63
162
|
|
163
|
+
|
164
|
+
def _write_parameter_expression(file_obj, obj, use_symengine, *, version):
|
165
|
+
extra_symbols = None
|
166
|
+
if version < 13:
|
167
|
+
if use_symengine:
|
168
|
+
expr_bytes = obj._symbol_expr.__reduce__()[1][0]
|
169
|
+
else:
|
170
|
+
from sympy import srepr, sympify
|
171
|
+
|
172
|
+
expr_bytes = srepr(sympify(obj._symbol_expr)).encode(common.ENCODE)
|
173
|
+
else:
|
174
|
+
with io.BytesIO() as buf:
|
175
|
+
extra_symbols = _write_parameter_expression_v13(buf, obj, version)
|
176
|
+
expr_bytes = buf.getvalue()
|
177
|
+
symbol_table_len = len(obj._parameter_symbols)
|
178
|
+
if extra_symbols:
|
179
|
+
symbol_table_len += 2 * len(extra_symbols)
|
64
180
|
param_expr_header_raw = struct.pack(
|
65
|
-
formats.PARAMETER_EXPR_PACK,
|
181
|
+
formats.PARAMETER_EXPR_PACK, symbol_table_len, len(expr_bytes)
|
66
182
|
)
|
67
183
|
file_obj.write(param_expr_header_raw)
|
68
184
|
file_obj.write(expr_bytes)
|
69
|
-
|
70
185
|
for symbol, value in obj._parameter_symbols.items():
|
71
186
|
symbol_key = type_keys.Value.assign(symbol)
|
72
187
|
|
@@ -92,6 +207,49 @@ def _write_parameter_expression(file_obj, obj, use_symengine, *, version):
|
|
92
207
|
file_obj.write(elem_header)
|
93
208
|
file_obj.write(symbol_data)
|
94
209
|
file_obj.write(value_data)
|
210
|
+
if extra_symbols:
|
211
|
+
for symbol in extra_symbols:
|
212
|
+
symbol_key = type_keys.Value.assign(symbol)
|
213
|
+
# serialize key
|
214
|
+
if symbol_key == type_keys.Value.PARAMETER_VECTOR:
|
215
|
+
symbol_data = common.data_to_binary(symbol, _write_parameter_vec)
|
216
|
+
else:
|
217
|
+
symbol_data = common.data_to_binary(symbol, _write_parameter)
|
218
|
+
# serialize value
|
219
|
+
value_key, value_data = dumps_value(
|
220
|
+
symbol, version=version, use_symengine=use_symengine
|
221
|
+
)
|
222
|
+
|
223
|
+
elem_header = struct.pack(
|
224
|
+
formats.PARAM_EXPR_MAP_ELEM_V3_PACK,
|
225
|
+
symbol_key,
|
226
|
+
value_key,
|
227
|
+
len(value_data),
|
228
|
+
)
|
229
|
+
file_obj.write(elem_header)
|
230
|
+
file_obj.write(symbol_data)
|
231
|
+
file_obj.write(value_data)
|
232
|
+
for symbol in extra_symbols.values():
|
233
|
+
symbol_key = type_keys.Value.assign(symbol)
|
234
|
+
# serialize key
|
235
|
+
if symbol_key == type_keys.Value.PARAMETER_VECTOR:
|
236
|
+
symbol_data = common.data_to_binary(symbol, _write_parameter_vec)
|
237
|
+
else:
|
238
|
+
symbol_data = common.data_to_binary(symbol, _write_parameter)
|
239
|
+
# serialize value
|
240
|
+
value_key, value_data = dumps_value(
|
241
|
+
symbol, version=version, use_symengine=use_symengine
|
242
|
+
)
|
243
|
+
|
244
|
+
elem_header = struct.pack(
|
245
|
+
formats.PARAM_EXPR_MAP_ELEM_V3_PACK,
|
246
|
+
symbol_key,
|
247
|
+
value_key,
|
248
|
+
len(value_data),
|
249
|
+
)
|
250
|
+
file_obj.write(elem_header)
|
251
|
+
file_obj.write(symbol_data)
|
252
|
+
file_obj.write(value_data)
|
95
253
|
|
96
254
|
|
97
255
|
class _ExprWriter(expr.ExprVisitor[None]):
|
@@ -290,7 +448,7 @@ def _read_parameter_expression_v3(file_obj, vectors, use_symengine):
|
|
290
448
|
|
291
449
|
payload = file_obj.read(data.expr_size)
|
292
450
|
if use_symengine:
|
293
|
-
expr_ =
|
451
|
+
expr_ = common.load_symengine_payload(payload)
|
294
452
|
else:
|
295
453
|
from sympy.parsing.sympy_parser import parse_expr
|
296
454
|
|
@@ -337,6 +495,141 @@ def _read_parameter_expression_v3(file_obj, vectors, use_symengine):
|
|
337
495
|
return ParameterExpression(symbol_map, expr_)
|
338
496
|
|
339
497
|
|
498
|
+
def _read_parameter_expression_v13(file_obj, vectors, version):
|
499
|
+
data = formats.PARAMETER_EXPR(
|
500
|
+
*struct.unpack(formats.PARAMETER_EXPR_PACK, file_obj.read(formats.PARAMETER_EXPR_SIZE))
|
501
|
+
)
|
502
|
+
|
503
|
+
payload = file_obj.read(data.expr_size)
|
504
|
+
|
505
|
+
symbol_map = {}
|
506
|
+
for _ in range(data.map_elements):
|
507
|
+
elem_data = formats.PARAM_EXPR_MAP_ELEM_V3(
|
508
|
+
*struct.unpack(
|
509
|
+
formats.PARAM_EXPR_MAP_ELEM_V3_PACK,
|
510
|
+
file_obj.read(formats.PARAM_EXPR_MAP_ELEM_V3_SIZE),
|
511
|
+
)
|
512
|
+
)
|
513
|
+
symbol_key = type_keys.Value(elem_data.symbol_type)
|
514
|
+
|
515
|
+
if symbol_key == type_keys.Value.PARAMETER:
|
516
|
+
symbol = _read_parameter(file_obj)
|
517
|
+
elif symbol_key == type_keys.Value.PARAMETER_VECTOR:
|
518
|
+
symbol = _read_parameter_vec(file_obj, vectors)
|
519
|
+
else:
|
520
|
+
raise exceptions.QpyError(f"Invalid parameter expression map type: {symbol_key}")
|
521
|
+
|
522
|
+
elem_key = type_keys.Value(elem_data.type)
|
523
|
+
binary_data = file_obj.read(elem_data.size)
|
524
|
+
if elem_key == type_keys.Value.INTEGER:
|
525
|
+
value = struct.unpack("!q", binary_data)
|
526
|
+
elif elem_key == type_keys.Value.FLOAT:
|
527
|
+
value = struct.unpack("!d", binary_data)
|
528
|
+
elif elem_key == type_keys.Value.COMPLEX:
|
529
|
+
value = complex(*struct.unpack(formats.COMPLEX_PACK, binary_data))
|
530
|
+
elif elem_key in (type_keys.Value.PARAMETER, type_keys.Value.PARAMETER_VECTOR):
|
531
|
+
value = symbol._symbol_expr
|
532
|
+
elif elem_key == type_keys.Value.PARAMETER_EXPRESSION:
|
533
|
+
value = common.data_from_binary(
|
534
|
+
binary_data,
|
535
|
+
_read_parameter_expression_v13,
|
536
|
+
vectors=vectors,
|
537
|
+
)
|
538
|
+
else:
|
539
|
+
raise exceptions.QpyError(f"Invalid parameter expression map type: {elem_key}")
|
540
|
+
symbol_map[symbol] = value
|
541
|
+
with io.BytesIO(payload) as buf:
|
542
|
+
return _read_parameter_expr_v13(buf, symbol_map, version, vectors)
|
543
|
+
|
544
|
+
|
545
|
+
def _read_parameter_expr_v13(buf, symbol_map, version, vectors):
|
546
|
+
param_uuid_map = {symbol.uuid: symbol for symbol in symbol_map if isinstance(symbol, Parameter)}
|
547
|
+
name_map = {str(v): k for k, v in symbol_map.items()}
|
548
|
+
data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
|
549
|
+
stack = []
|
550
|
+
while data:
|
551
|
+
expression_data = formats.PARAM_EXPR_ELEM_V13._make(
|
552
|
+
struct.unpack(formats.PARAM_EXPR_ELEM_V13_PACK, data)
|
553
|
+
)
|
554
|
+
# LHS
|
555
|
+
if expression_data.LHS_TYPE == b"p":
|
556
|
+
stack.append(param_uuid_map[uuid.UUID(bytes=expression_data.LHS)])
|
557
|
+
elif expression_data.LHS_TYPE == b"f":
|
558
|
+
stack.append(struct.unpack("!Qd", expression_data.LHS)[1])
|
559
|
+
elif expression_data.LHS_TYPE == b"n":
|
560
|
+
pass
|
561
|
+
elif expression_data.LHS_TYPE == b"c":
|
562
|
+
stack.append(complex(*struct.unpack("!dd", expression_data.LHS)))
|
563
|
+
elif expression_data.LHS_TYPE == b"i":
|
564
|
+
stack.append(struct.unpack("!Qq", expression_data.LHS)[1])
|
565
|
+
elif expression_data.LHS_TYPE == b"s":
|
566
|
+
data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
|
567
|
+
continue
|
568
|
+
elif expression_data.LHS_TYPE == b"e":
|
569
|
+
data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
|
570
|
+
continue
|
571
|
+
elif expression_data.LHS_TYPE == b"u":
|
572
|
+
size = struct.unpack_from("!QQ", expression_data.LHS)[0]
|
573
|
+
subs_map_data = buf.read(size)
|
574
|
+
with io.BytesIO(subs_map_data) as mapping_buf:
|
575
|
+
mapping = common.read_mapping(
|
576
|
+
mapping_buf, deserializer=loads_value, version=version, vectors=vectors
|
577
|
+
)
|
578
|
+
stack.append({name_map[k]: v for k, v in mapping.items()})
|
579
|
+
else:
|
580
|
+
raise exceptions.QpyError(
|
581
|
+
"Unknown ParameterExpression operation type {expression_data.LHS_TYPE}"
|
582
|
+
)
|
583
|
+
# RHS
|
584
|
+
if expression_data.RHS_TYPE == b"p":
|
585
|
+
stack.append(param_uuid_map[uuid.UUID(bytes=expression_data.RHS)])
|
586
|
+
elif expression_data.RHS_TYPE == b"f":
|
587
|
+
stack.append(struct.unpack("!Qd", expression_data.RHS)[1])
|
588
|
+
elif expression_data.RHS_TYPE == b"n":
|
589
|
+
pass
|
590
|
+
elif expression_data.RHS_TYPE == b"c":
|
591
|
+
stack.append(complex(*struct.unpack("!dd", expression_data.RHS)))
|
592
|
+
elif expression_data.RHS_TYPE == b"i":
|
593
|
+
stack.append(struct.unpack("!Qq", expression_data.RHS)[1])
|
594
|
+
elif expression_data.RHS_TYPE == b"s":
|
595
|
+
data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
|
596
|
+
continue
|
597
|
+
elif expression_data.RHS_TYPE == b"e":
|
598
|
+
data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
|
599
|
+
continue
|
600
|
+
else:
|
601
|
+
raise exceptions.QpyError(
|
602
|
+
f"Unknown ParameterExpression operation type {expression_data.RHS_TYPE}"
|
603
|
+
)
|
604
|
+
if expression_data.OP_CODE == 255:
|
605
|
+
continue
|
606
|
+
method_str = op_code_to_method(_OPCode(expression_data.OP_CODE))
|
607
|
+
if expression_data.OP_CODE in {0, 1, 2, 3, 4, 13, 15, 18, 19, 20}:
|
608
|
+
rhs = stack.pop()
|
609
|
+
lhs = stack.pop()
|
610
|
+
# Reverse ops for commutative ops, which are add, mul (0 and 2 respectively)
|
611
|
+
# op codes 13 and 15 can never be reversed and 18, 19, 20
|
612
|
+
# are the reversed versions of non-commuative operations
|
613
|
+
# so 1, 3, 4 and 18, 19, 20 handle this explicitly.
|
614
|
+
if (
|
615
|
+
not isinstance(lhs, ParameterExpression)
|
616
|
+
and isinstance(rhs, ParameterExpression)
|
617
|
+
and expression_data.OP_CODE in {0, 2}
|
618
|
+
):
|
619
|
+
if expression_data.OP_CODE == 0:
|
620
|
+
method_str = "__radd__"
|
621
|
+
elif expression_data.OP_CODE == 2:
|
622
|
+
method_str = "__rmul__"
|
623
|
+
stack.append(getattr(rhs, method_str)(lhs))
|
624
|
+
else:
|
625
|
+
stack.append(getattr(lhs, method_str)(rhs))
|
626
|
+
else:
|
627
|
+
lhs = stack.pop()
|
628
|
+
stack.append(getattr(lhs, method_str)())
|
629
|
+
data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
|
630
|
+
return stack.pop()
|
631
|
+
|
632
|
+
|
340
633
|
def _read_expr(
|
341
634
|
file_obj,
|
342
635
|
clbits: collections.abc.Sequence[Clbit],
|
@@ -667,13 +960,17 @@ def loads_value(
|
|
667
960
|
if type_key == type_keys.Value.PARAMETER_EXPRESSION:
|
668
961
|
if version < 3:
|
669
962
|
return common.data_from_binary(binary_data, _read_parameter_expression)
|
670
|
-
|
963
|
+
elif version < 13:
|
671
964
|
return common.data_from_binary(
|
672
965
|
binary_data,
|
673
966
|
_read_parameter_expression_v3,
|
674
967
|
vectors=vectors,
|
675
968
|
use_symengine=use_symengine,
|
676
969
|
)
|
970
|
+
else:
|
971
|
+
return common.data_from_binary(
|
972
|
+
binary_data, _read_parameter_expression_v13, vectors=vectors, version=version
|
973
|
+
)
|
677
974
|
if type_key == type_keys.Value.EXPRESSION:
|
678
975
|
return common.data_from_binary(
|
679
976
|
binary_data,
|
qiskit/qpy/common.py
CHANGED
@@ -18,9 +18,14 @@ Common functions across several serialization and deserialization modules.
|
|
18
18
|
import io
|
19
19
|
import struct
|
20
20
|
|
21
|
-
|
21
|
+
import symengine
|
22
|
+
from symengine.lib.symengine_wrapper import ( # pylint: disable = no-name-in-module
|
23
|
+
load_basic,
|
24
|
+
)
|
22
25
|
|
23
|
-
|
26
|
+
from qiskit.qpy import formats, exceptions
|
27
|
+
|
28
|
+
QPY_VERSION = 13
|
24
29
|
QPY_COMPATIBILITY_VERSION = 10
|
25
30
|
ENCODE = "utf8"
|
26
31
|
|
@@ -304,3 +309,42 @@ def mapping_from_binary(binary_data, deserializer, **kwargs):
|
|
304
309
|
mapping = read_mapping(container, deserializer, **kwargs)
|
305
310
|
|
306
311
|
return mapping
|
312
|
+
|
313
|
+
|
314
|
+
def load_symengine_payload(payload: bytes) -> symengine.Expr:
|
315
|
+
"""Load a symengine expression from it's serialized cereal payload."""
|
316
|
+
# This is a horrible hack to workaround the symengine version checking
|
317
|
+
# it's deserialization does. There were no changes to the serialization
|
318
|
+
# format between 0.11 and 0.13 but the deserializer checks that it can't
|
319
|
+
# load across a major or minor version boundary. This works around it
|
320
|
+
# by just lying about the generating version.
|
321
|
+
symengine_version = symengine.__version__.split(".")
|
322
|
+
major = payload[2]
|
323
|
+
minor = payload[3]
|
324
|
+
if int(symengine_version[1]) != minor:
|
325
|
+
if major != 0:
|
326
|
+
raise exceptions.QpyError(
|
327
|
+
"Qiskit doesn't support loading a symengine payload generated with symengine >= 1.0"
|
328
|
+
)
|
329
|
+
if minor == 9:
|
330
|
+
raise exceptions.QpyError(
|
331
|
+
"Qiskit doesn't support loading a historical QPY file with `use_symengine=True` "
|
332
|
+
"generated in an environment using symengine 0.9.0. If you need to load this file "
|
333
|
+
"you can do so with Qiskit 0.45.x or 0.46.x and re-export the QPY file using "
|
334
|
+
"`use_symengine=False`."
|
335
|
+
)
|
336
|
+
if minor not in (11, 13):
|
337
|
+
raise exceptions.QpyError(
|
338
|
+
f"Incompatible symengine version {major}.{minor} used to generate the QPY "
|
339
|
+
"payload"
|
340
|
+
)
|
341
|
+
minor_version = int(symengine_version[1])
|
342
|
+
if minor_version not in (11, 13):
|
343
|
+
raise exceptions.QpyError(
|
344
|
+
f"Incompatible installed symengine version {symengine.__version__} to load "
|
345
|
+
"this QPY payload"
|
346
|
+
)
|
347
|
+
payload = bytearray(payload)
|
348
|
+
payload[3] = minor_version
|
349
|
+
payload = bytes(payload)
|
350
|
+
return load_basic(payload)
|
qiskit/qpy/formats.py
CHANGED
@@ -259,6 +259,13 @@ PARAMETER = namedtuple("PARAMETER", ["name_size", "uuid"])
|
|
259
259
|
PARAMETER_PACK = "!H16s"
|
260
260
|
PARAMETER_SIZE = struct.calcsize(PARAMETER_PACK)
|
261
261
|
|
262
|
+
# PARAMETEREXPRESSION_ENTRY
|
263
|
+
PARAM_EXPR_ELEM_V13 = namedtuple(
|
264
|
+
"PARAM_EXPR_ELEM_V13", ["OP_CODE", "LHS_TYPE", "LHS", "RHS_TYPE", "RHS"]
|
265
|
+
)
|
266
|
+
PARAM_EXPR_ELEM_V13_PACK = "!Bc16sc16s"
|
267
|
+
PARAM_EXPR_ELEM_V13_SIZE = struct.calcsize(PARAM_EXPR_ELEM_V13_PACK)
|
268
|
+
|
262
269
|
# COMPLEX
|
263
270
|
COMPLEX = namedtuple("COMPLEX", ["real", "imag"])
|
264
271
|
COMPLEX_PACK = "!dd"
|
qiskit/qpy/interface.py
CHANGED
@@ -25,8 +25,9 @@ from qiskit.circuit import QuantumCircuit
|
|
25
25
|
from qiskit.pulse import ScheduleBlock
|
26
26
|
from qiskit.exceptions import QiskitError
|
27
27
|
from qiskit.qpy import formats, common, binary_io, type_keys
|
28
|
-
from qiskit.qpy.exceptions import QpyError
|
28
|
+
from qiskit.qpy.exceptions import QPYLoadingDeprecatedFeatureWarning, QpyError
|
29
29
|
from qiskit.version import __version__
|
30
|
+
from qiskit.utils.deprecate_pulse import deprecate_pulse_arg
|
30
31
|
|
31
32
|
|
32
33
|
# pylint: disable=invalid-name
|
@@ -73,6 +74,11 @@ VERSION_PATTERN = (
|
|
73
74
|
VERSION_PATTERN_REGEX = re.compile(VERSION_PATTERN, re.VERBOSE | re.IGNORECASE)
|
74
75
|
|
75
76
|
|
77
|
+
@deprecate_pulse_arg(
|
78
|
+
"programs",
|
79
|
+
deprecation_description="Passing `ScheduleBlock` to `programs`",
|
80
|
+
predicate=lambda p: isinstance(p, ScheduleBlock),
|
81
|
+
)
|
76
82
|
def dump(
|
77
83
|
programs: Union[List[QPY_SUPPORTED_TYPES], QPY_SUPPORTED_TYPES],
|
78
84
|
file_obj: BinaryIO,
|
@@ -120,15 +126,16 @@ def dump(
|
|
120
126
|
programs: QPY supported object(s) to store in the specified file like object.
|
121
127
|
QPY supports :class:`.QuantumCircuit` and :class:`.ScheduleBlock`.
|
122
128
|
Different data types must be separately serialized.
|
129
|
+
Support for :class:`.ScheduleBlock` is deprecated since Qiskit 1.3.0.
|
123
130
|
file_obj: The file like object to write the QPY data too
|
124
131
|
metadata_serializer: An optional JSONEncoder class that
|
125
132
|
will be passed the ``.metadata`` attribute for each program in ``programs`` and will be
|
126
133
|
used as the ``cls`` kwarg on the `json.dump()`` call to JSON serialize that dictionary.
|
127
134
|
use_symengine: If True, all objects containing symbolic expressions will be serialized
|
128
135
|
using symengine's native mechanism. This is a faster serialization alternative,
|
129
|
-
but not supported in all platforms.
|
130
|
-
|
131
|
-
|
136
|
+
but not supported in all platforms. This flag only has an effect if the emitted QPY format
|
137
|
+
version is 10, 11, or 12. For QPY format version >= 13 (which is the default starting in
|
138
|
+
Qiskit 1.3.0) this flag is no longer used.
|
132
139
|
version: The QPY format version to emit. By default this defaults to
|
133
140
|
the latest supported format of :attr:`~.qpy.QPY_VERSION`, however for
|
134
141
|
compatibility reasons if you need to load the generated QPY payload with an older
|
@@ -144,6 +151,17 @@ def dump(
|
|
144
151
|
from the QPY format at that version will persist. This should only be used if
|
145
152
|
compatibility with loading the payload with an older version of Qiskit is necessary.
|
146
153
|
|
154
|
+
.. note::
|
155
|
+
|
156
|
+
If serializing a :class:`.QuantumCircuit` or :class:`.ScheduleBlock` that contain
|
157
|
+
:class:`.ParameterExpression` objects with ``version`` set low with the intent to
|
158
|
+
load the payload using a historical release of Qiskit, it is safest to set the
|
159
|
+
``use_symengine`` flag to ``False``. Versions of Qiskit prior to 1.2.4 cannot load
|
160
|
+
QPY files containing ``symengine``-serialized :class:`.ParameterExpression` objects
|
161
|
+
unless the version of ``symengine`` used between the loading and generating
|
162
|
+
environments matches.
|
163
|
+
|
164
|
+
|
147
165
|
Raises:
|
148
166
|
QpyError: When multiple data format is mixed in the output.
|
149
167
|
TypeError: When invalid data type is input.
|
@@ -197,7 +215,10 @@ def dump(
|
|
197
215
|
file_obj.write(header)
|
198
216
|
common.write_type_key(file_obj, type_key)
|
199
217
|
|
218
|
+
pulse_gates = False
|
200
219
|
for program in programs:
|
220
|
+
if type_key == type_keys.Program.CIRCUIT and program._calibrations_prop:
|
221
|
+
pulse_gates = True
|
201
222
|
writer(
|
202
223
|
file_obj,
|
203
224
|
program,
|
@@ -206,6 +227,13 @@ def dump(
|
|
206
227
|
version=version,
|
207
228
|
)
|
208
229
|
|
230
|
+
if pulse_gates:
|
231
|
+
warnings.warn(
|
232
|
+
category=DeprecationWarning,
|
233
|
+
message="Pulse gates serialization is deprecated as of Qiskit 1.3. "
|
234
|
+
"It will be removed in Qiskit 2.0.",
|
235
|
+
)
|
236
|
+
|
209
237
|
|
210
238
|
def load(
|
211
239
|
file_obj: BinaryIO,
|
@@ -320,6 +348,14 @@ def load(
|
|
320
348
|
loader = binary_io.read_circuit
|
321
349
|
elif type_key == type_keys.Program.SCHEDULE_BLOCK:
|
322
350
|
loader = binary_io.read_schedule_block
|
351
|
+
warnings.warn(
|
352
|
+
category=QPYLoadingDeprecatedFeatureWarning,
|
353
|
+
message="Pulse gates deserialization is deprecated as of Qiskit 1.3 and "
|
354
|
+
"will be removed in Qiskit 2.0. This is part of the deprecation plan for "
|
355
|
+
"the entire Qiskit Pulse package. Once Pulse is removed, `ScheduleBlock` "
|
356
|
+
"sections will be ignored when loading QPY files with pulse data.",
|
357
|
+
)
|
358
|
+
|
323
359
|
else:
|
324
360
|
raise TypeError(f"Invalid payload format data kind '{type_key}'.")
|
325
361
|
|
qiskit/quantum_info/__init__.py
CHANGED
@@ -28,6 +28,7 @@ Operators
|
|
28
28
|
Pauli
|
29
29
|
Clifford
|
30
30
|
ScalarOp
|
31
|
+
SparseObservable
|
31
32
|
SparsePauliOp
|
32
33
|
CNOTDihedral
|
33
34
|
PauliList
|
@@ -113,6 +114,9 @@ Analysis
|
|
113
114
|
"""
|
114
115
|
|
115
116
|
from __future__ import annotations
|
117
|
+
|
118
|
+
from qiskit._accelerate.sparse_observable import SparseObservable
|
119
|
+
|
116
120
|
from .analysis import hellinger_distance, hellinger_fidelity, Z2Symmetries
|
117
121
|
from .operators import (
|
118
122
|
Clifford,
|
@@ -220,32 +220,39 @@ def _kraus_to_choi(data):
|
|
220
220
|
|
221
221
|
def _choi_to_kraus(data, input_dim, output_dim, atol=ATOL_DEFAULT):
|
222
222
|
"""Transform Choi representation to Kraus representation."""
|
223
|
-
|
223
|
+
import scipy.linalg
|
224
224
|
|
225
225
|
# Check if hermitian matrix
|
226
226
|
if is_hermitian_matrix(data, atol=atol):
|
227
|
-
#
|
228
|
-
#
|
229
|
-
#
|
230
|
-
#
|
231
|
-
#
|
232
|
-
|
233
|
-
|
234
|
-
#
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
227
|
+
# Ideally we'd use `eigh`, but `scipy.linalg.eigh` has stability problems on macOS (at a
|
228
|
+
# minimum from SciPy 1.1 to 1.13 with the bundled OpenBLAS, or ~0.3.6 before they started
|
229
|
+
# bundling one in). The Schur form of a Hermitian matrix is guaranteed diagonal:
|
230
|
+
#
|
231
|
+
# H = U T U+ for upper-triangular T.
|
232
|
+
# => H+ = U T+ U+
|
233
|
+
# => T = T+ because H = H+, and thus T cannot have super-diagonal elements.
|
234
|
+
#
|
235
|
+
# So the eigenvalues are on the diagonal, therefore the basis-transformation matrix must be
|
236
|
+
# a spanning set of the eigenspace.
|
237
|
+
triangular, vecs = scipy.linalg.schur(data)
|
238
|
+
values = triangular.diagonal().real
|
239
|
+
# If we're not a CP map, fall-through back to the generalization handling. Since we needed
|
240
|
+
# to get the eigenvalues anyway, we can do the CP check manually rather than deferring to a
|
241
|
+
# separate re-calculation.
|
242
|
+
if all(values >= -atol):
|
243
|
+
kraus = [
|
244
|
+
math.sqrt(value) * vec.reshape((output_dim, input_dim), order="F")
|
245
|
+
for value, vec in zip(values, vecs.T)
|
246
|
+
if abs(value) > atol
|
247
|
+
]
|
248
|
+
# If we are converting a zero matrix, we need to return a Kraus set with a single
|
249
|
+
# zero-element Kraus matrix
|
244
250
|
if not kraus:
|
245
|
-
kraus
|
251
|
+
kraus = [np.zeros((output_dim, input_dim), dtype=complex)]
|
246
252
|
return kraus, None
|
247
|
-
|
248
|
-
|
253
|
+
# Fall through.
|
254
|
+
# Non-CP-map generalized Kraus representation.
|
255
|
+
mat_u, svals, mat_vh = scipy.linalg.svd(data)
|
249
256
|
kraus_l = []
|
250
257
|
kraus_r = []
|
251
258
|
for val, vec_l, vec_r in zip(svals, mat_u.T, mat_vh.conj()):
|