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
@@ -15,16 +15,19 @@
|
|
15
15
|
from __future__ import annotations
|
16
16
|
|
17
17
|
import inspect
|
18
|
+
import typing
|
18
19
|
from collections.abc import Callable
|
19
|
-
|
20
|
-
import numpy as np
|
20
|
+
from itertools import chain
|
21
21
|
|
22
22
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
23
23
|
from qiskit.quantum_info.operators import SparsePauliOp, Pauli
|
24
24
|
from qiskit.utils.deprecation import deprecate_arg
|
25
25
|
|
26
|
+
from .product_formula import ProductFormula, reorder_paulis
|
26
27
|
|
27
|
-
|
28
|
+
if typing.TYPE_CHECKING:
|
29
|
+
from qiskit.circuit.quantumcircuit import ParameterValueType
|
30
|
+
from qiskit.circuit.library.pauli_evolution import PauliEvolutionGate
|
28
31
|
|
29
32
|
|
30
33
|
class SuzukiTrotter(ProductFormula):
|
@@ -44,7 +47,7 @@ class SuzukiTrotter(ProductFormula):
|
|
44
47
|
|
45
48
|
.. math::
|
46
49
|
|
47
|
-
e^{-it(
|
50
|
+
e^{-it(XI + ZZ)} = e^{-it/2 XI}e^{-it ZZ}e^{-it/2 XI} + \mathcal{O}(t^3).
|
48
51
|
|
49
52
|
References:
|
50
53
|
[1]: D. Berry, G. Ahokas, R. Cleve and B. Sanders,
|
@@ -82,6 +85,7 @@ class SuzukiTrotter(ProductFormula):
|
|
82
85
|
| None
|
83
86
|
) = None,
|
84
87
|
wrap: bool = False,
|
88
|
+
preserve_order: bool = True,
|
85
89
|
) -> None:
|
86
90
|
"""
|
87
91
|
Args:
|
@@ -101,55 +105,111 @@ class SuzukiTrotter(ProductFormula):
|
|
101
105
|
built.
|
102
106
|
wrap: Whether to wrap the atomic evolutions into custom gate objects. This only takes
|
103
107
|
effect when ``atomic_evolution is None``.
|
108
|
+
preserve_order: If ``False``, allows reordering the terms of the operator to
|
109
|
+
potentially yield a shallower evolution circuit. Not relevant
|
110
|
+
when synthesizing operator with a single term.
|
104
111
|
Raises:
|
105
112
|
ValueError: If order is not even
|
106
113
|
"""
|
107
114
|
|
108
|
-
if order % 2 == 1:
|
115
|
+
if order > 1 and order % 2 == 1:
|
109
116
|
raise ValueError(
|
110
117
|
"Suzuki product formulae are symmetric and therefore only defined "
|
111
|
-
"for even
|
118
|
+
f"for when the order is 1 or even, not {order}."
|
112
119
|
)
|
113
|
-
super().__init__(
|
120
|
+
super().__init__(
|
121
|
+
order,
|
122
|
+
reps,
|
123
|
+
insert_barriers,
|
124
|
+
cx_structure,
|
125
|
+
atomic_evolution,
|
126
|
+
wrap,
|
127
|
+
preserve_order=preserve_order,
|
128
|
+
)
|
129
|
+
|
130
|
+
def expand(
|
131
|
+
self, evolution: PauliEvolutionGate
|
132
|
+
) -> list[tuple[str, list[int], ParameterValueType]]:
|
133
|
+
"""Expand the Hamiltonian into a Suzuki-Trotter sequence of sparse gates.
|
134
|
+
|
135
|
+
For example, the Hamiltonian ``H = IX + ZZ`` for an evolution time ``t`` and
|
136
|
+
1 repetition for an order 2 formula would get decomposed into a list of 3-tuples
|
137
|
+
containing ``(pauli, indices, rz_rotation_angle)``, that is:
|
138
|
+
|
139
|
+
.. code-block:: text
|
140
|
+
|
141
|
+
("X", [0], t), ("ZZ", [0, 1], 2t), ("X", [0], 2)
|
142
|
+
|
143
|
+
Note that the rotation angle contains a factor of 2, such that that evolution
|
144
|
+
of a Pauli :math:`P` over time :math:`t`, which is :math:`e^{itP}`, is represented
|
145
|
+
by ``(P, indices, 2 * t)``.
|
146
|
+
|
147
|
+
For ``N`` repetitions, this sequence would be repeated ``N`` times and the coefficients
|
148
|
+
divided by ``N``.
|
114
149
|
|
115
|
-
|
116
|
-
|
117
|
-
|
150
|
+
Args:
|
151
|
+
evolution: The evolution gate to expand.
|
152
|
+
|
153
|
+
Returns:
|
154
|
+
The Pauli network implementing the Trotter expansion.
|
155
|
+
"""
|
156
|
+
operators = evolution.operator # type: SparsePauliOp | list[SparsePauliOp]
|
118
157
|
time = evolution.time
|
119
158
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
159
|
+
def to_sparse_list(operator):
|
160
|
+
paulis = (time * (2 / self.reps) * operator).to_sparse_list()
|
161
|
+
if not self.preserve_order:
|
162
|
+
return reorder_paulis(paulis)
|
124
163
|
|
125
|
-
|
164
|
+
return paulis
|
126
165
|
|
127
166
|
# construct the evolution circuit
|
128
|
-
|
167
|
+
if isinstance(operators, list): # already sorted into commuting bits
|
168
|
+
non_commuting = [to_sparse_list(operator) for operator in operators]
|
169
|
+
else:
|
170
|
+
# Assume no commutativity here. If we were to group commuting Paulis,
|
171
|
+
# here would be the location to do so.
|
172
|
+
non_commuting = [[op] for op in to_sparse_list(operators)]
|
173
|
+
|
174
|
+
# normalize coefficients, i.e. ensure they are float or ParameterExpression
|
175
|
+
non_commuting = self._normalize_coefficients(non_commuting)
|
129
176
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
single_rep.barrier()
|
177
|
+
# we're already done here since Lie Trotter does not do any operator repetition
|
178
|
+
product_formula = self._recurse(self.order, non_commuting)
|
179
|
+
flattened = self.reps * list(chain.from_iterable(product_formula))
|
134
180
|
|
135
|
-
return
|
181
|
+
return flattened
|
136
182
|
|
137
183
|
@staticmethod
|
138
|
-
def _recurse(order,
|
184
|
+
def _recurse(order, grouped_paulis):
|
139
185
|
if order == 1:
|
140
|
-
return
|
186
|
+
return grouped_paulis
|
141
187
|
|
142
188
|
elif order == 2:
|
143
|
-
halves = [
|
144
|
-
|
189
|
+
halves = [
|
190
|
+
[(label, qubits, coeff / 2) for label, qubits, coeff in paulis]
|
191
|
+
for paulis in grouped_paulis[:-1]
|
192
|
+
]
|
193
|
+
full = [grouped_paulis[-1]]
|
145
194
|
return halves + full + list(reversed(halves))
|
146
195
|
|
147
196
|
else:
|
148
197
|
reduction = 1 / (4 - 4 ** (1 / (order - 1)))
|
149
198
|
outer = 2 * SuzukiTrotter._recurse(
|
150
|
-
order - 2,
|
199
|
+
order - 2,
|
200
|
+
[
|
201
|
+
[(label, qubits, coeff * reduction) for label, qubits, coeff in paulis]
|
202
|
+
for paulis in grouped_paulis
|
203
|
+
],
|
151
204
|
)
|
152
205
|
inner = SuzukiTrotter._recurse(
|
153
|
-
order - 2,
|
206
|
+
order - 2,
|
207
|
+
[
|
208
|
+
[
|
209
|
+
(label, qubits, coeff * (1 - 4 * reduction))
|
210
|
+
for label, qubits, coeff in paulis
|
211
|
+
]
|
212
|
+
for paulis in grouped_paulis
|
213
|
+
],
|
154
214
|
)
|
155
215
|
return outer + inner + outer
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2024.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Synthesis for multiple-control, multiple-target Gate."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from qiskit.circuit import QuantumCircuit, Gate
|
18
|
+
from qiskit._accelerate.synthesis.multi_controlled import mcmt_v_chain
|
19
|
+
|
20
|
+
|
21
|
+
def synth_mcmt_vchain(
|
22
|
+
gate: Gate, num_ctrl_qubits: int, num_target_qubits: int, ctrl_state: int | None = None
|
23
|
+
) -> QuantumCircuit:
|
24
|
+
"""Synthesize MCMT using a V-chain.
|
25
|
+
|
26
|
+
This uses a chain of CCX gates, using ``num_ctrl_qubits - 1`` auxiliary qubits.
|
27
|
+
|
28
|
+
For example, a 3-control and 2-target H gate will be synthesized as::
|
29
|
+
|
30
|
+
q_0: ──■────────────────────────■──
|
31
|
+
│ │
|
32
|
+
q_1: ──■────────────────────────■──
|
33
|
+
│ │
|
34
|
+
q_2: ──┼────■──────────────■────┼──
|
35
|
+
│ │ ┌───┐ │ │
|
36
|
+
q_3: ──┼────┼──┤ H ├───────┼────┼──
|
37
|
+
│ │ └─┬─┘┌───┐ │ │
|
38
|
+
q_4: ──┼────┼────┼──┤ H ├──┼────┼──
|
39
|
+
┌─┴─┐ │ │ └─┬─┘ │ ┌─┴─┐
|
40
|
+
q_5: ┤ X ├──■────┼────┼────■──┤ X ├
|
41
|
+
└───┘┌─┴─┐ │ │ ┌─┴─┐└───┘
|
42
|
+
q_6: ─────┤ X ├──■────■──┤ X ├─────
|
43
|
+
└───┘ └───┘
|
44
|
+
|
45
|
+
"""
|
46
|
+
if gate.num_qubits != 1:
|
47
|
+
raise ValueError("Only single qubit gates are supported as input.")
|
48
|
+
|
49
|
+
circ = QuantumCircuit._from_circuit_data(
|
50
|
+
mcmt_v_chain(gate.control(), num_ctrl_qubits, num_target_qubits, ctrl_state)
|
51
|
+
)
|
52
|
+
return circ
|
@@ -14,6 +14,7 @@ Circuit synthesis for a QFT circuit.
|
|
14
14
|
"""
|
15
15
|
|
16
16
|
from __future__ import annotations
|
17
|
+
import warnings
|
17
18
|
import numpy as np
|
18
19
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
19
20
|
|
@@ -54,7 +55,7 @@ def synth_qft_full(
|
|
54
55
|
A circuit implementing the QFT operation.
|
55
56
|
|
56
57
|
"""
|
57
|
-
|
58
|
+
_warn_if_precision_loss(num_qubits - approximation_degree - 1)
|
58
59
|
circuit = QuantumCircuit(num_qubits, name=name)
|
59
60
|
|
60
61
|
for j in reversed(range(num_qubits)):
|
@@ -77,3 +78,20 @@ def synth_qft_full(
|
|
77
78
|
circuit = circuit.inverse()
|
78
79
|
|
79
80
|
return circuit
|
81
|
+
|
82
|
+
|
83
|
+
def _warn_if_precision_loss(max_num_entanglements):
|
84
|
+
"""Issue a warning if constructing the circuit will lose precision.
|
85
|
+
|
86
|
+
If we need an angle smaller than ``pi * 2**-1022``, we start to lose precision by going into
|
87
|
+
the subnormal numbers. We won't lose _all_ precision until an exponent of about 1075, but
|
88
|
+
beyond 1022 we're using fractional bits to represent leading zeros.
|
89
|
+
"""
|
90
|
+
if max_num_entanglements > -np.finfo(float).minexp: # > 1022 for doubles.
|
91
|
+
warnings.warn(
|
92
|
+
"precision loss in QFT."
|
93
|
+
f" The rotation needed to represent {max_num_entanglements} entanglements"
|
94
|
+
" is smaller than the smallest normal floating-point number.",
|
95
|
+
category=RuntimeWarning,
|
96
|
+
stacklevel=4,
|
97
|
+
)
|
@@ -16,6 +16,7 @@ Circuit synthesis for a QFT circuit.
|
|
16
16
|
import numpy as np
|
17
17
|
from qiskit.circuit import QuantumCircuit
|
18
18
|
from qiskit.synthesis.permutation.permutation_reverse_lnn import _append_reverse_permutation_lnn_kms
|
19
|
+
from .qft_decompose_full import _warn_if_precision_loss
|
19
20
|
|
20
21
|
|
21
22
|
def synth_qft_line(
|
@@ -51,7 +52,7 @@ def synth_qft_line(
|
|
51
52
|
Quantum Info. Comput. 4, 4 (July 2004), 237–251.
|
52
53
|
`arXiv:quant-ph/0402196 [quant-ph] <https://arxiv.org/abs/quant-ph/0402196>`_
|
53
54
|
"""
|
54
|
-
|
55
|
+
_warn_if_precision_loss(num_qubits - approximation_degree - 1)
|
55
56
|
qc = QuantumCircuit(num_qubits)
|
56
57
|
|
57
58
|
for i in range(num_qubits):
|
@@ -46,7 +46,8 @@ def synth_stabilizer_layers(
|
|
46
46
|
|
47
47
|
For example, a 5-qubit stabilizer state is decomposed into the following layers:
|
48
48
|
|
49
|
-
..
|
49
|
+
.. code-block:: text
|
50
|
+
|
50
51
|
┌─────┐┌─────┐┌─────┐┌─────┐┌────────┐
|
51
52
|
q_0: ┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├
|
52
53
|
│ ││ ││ ││ ││ │
|
@@ -24,8 +24,6 @@ Gambetta, J. M. Validating quantum computers using randomized model circuits.
|
|
24
24
|
arXiv:1811.12926 [quant-ph] (2018).
|
25
25
|
"""
|
26
26
|
from __future__ import annotations
|
27
|
-
import cmath
|
28
|
-
import math
|
29
27
|
import io
|
30
28
|
import base64
|
31
29
|
import warnings
|
@@ -91,41 +89,18 @@ def decompose_two_qubit_product_gate(special_unitary_matrix: np.ndarray):
|
|
91
89
|
QiskitError: if decomposition isn't possible.
|
92
90
|
"""
|
93
91
|
special_unitary_matrix = np.asarray(special_unitary_matrix, dtype=complex)
|
94
|
-
|
95
|
-
R = special_unitary_matrix[:2, :2].copy()
|
96
|
-
detR = R[0, 0] * R[1, 1] - R[0, 1] * R[1, 0]
|
97
|
-
if abs(detR) < 0.1:
|
98
|
-
R = special_unitary_matrix[2:, :2].copy()
|
99
|
-
detR = R[0, 0] * R[1, 1] - R[0, 1] * R[1, 0]
|
100
|
-
if abs(detR) < 0.1:
|
101
|
-
raise QiskitError("decompose_two_qubit_product_gate: unable to decompose: detR < 0.1")
|
102
|
-
R /= np.sqrt(detR)
|
103
|
-
|
104
|
-
# extract the left component
|
105
|
-
temp = np.kron(np.eye(2), R.T.conj())
|
106
|
-
temp = special_unitary_matrix.dot(temp)
|
107
|
-
L = temp[::2, ::2]
|
108
|
-
detL = L[0, 0] * L[1, 1] - L[0, 1] * L[1, 0]
|
109
|
-
if abs(detL) < 0.9:
|
110
|
-
raise QiskitError("decompose_two_qubit_product_gate: unable to decompose: detL < 0.9")
|
111
|
-
L /= np.sqrt(detL)
|
112
|
-
phase = cmath.phase(detL) / 2
|
92
|
+
(L, R, phase) = two_qubit_decompose.decompose_two_qubit_product_gate(special_unitary_matrix)
|
113
93
|
|
114
94
|
temp = np.kron(L, R)
|
115
95
|
deviation = abs(abs(temp.conj().T.dot(special_unitary_matrix).trace()) - 4)
|
96
|
+
|
116
97
|
if deviation > 1.0e-13:
|
117
98
|
raise QiskitError(
|
118
99
|
"decompose_two_qubit_product_gate: decomposition failed: "
|
119
100
|
f"deviation too large: {deviation}"
|
120
101
|
)
|
121
102
|
|
122
|
-
return L, R, phase
|
123
|
-
|
124
|
-
|
125
|
-
_ipx = np.array([[0, 1j], [1j, 0]], dtype=complex)
|
126
|
-
_ipy = np.array([[0, 1], [-1, 0]], dtype=complex)
|
127
|
-
_ipz = np.array([[1j, 0], [0, -1j]], dtype=complex)
|
128
|
-
_id = np.array([[1, 0], [0, 1]], dtype=complex)
|
103
|
+
return (L, R, phase)
|
129
104
|
|
130
105
|
|
131
106
|
class TwoQubitWeylDecomposition:
|
@@ -239,7 +214,7 @@ class TwoQubitWeylDecomposition:
|
|
239
214
|
"""Calculates the actual fidelity of the decomposed circuit to the input unitary."""
|
240
215
|
circ = self.circuit(**kwargs)
|
241
216
|
trace = np.trace(Operator(circ).data.T.conj() @ self.unitary_matrix)
|
242
|
-
return trace_to_fid(trace)
|
217
|
+
return two_qubit_decompose.trace_to_fid(trace)
|
243
218
|
|
244
219
|
def __repr__(self):
|
245
220
|
"""Represent with enough precision to allow copy-paste debugging of all corner cases"""
|
@@ -460,40 +435,6 @@ class TwoQubitControlledUDecomposer:
|
|
460
435
|
return circ
|
461
436
|
|
462
437
|
|
463
|
-
def Ud(a, b, c):
|
464
|
-
r"""Generates the array :math:`e^{(i a XX + i b YY + i c ZZ)}`"""
|
465
|
-
return np.array(
|
466
|
-
[
|
467
|
-
[cmath.exp(1j * c) * math.cos(a - b), 0, 0, 1j * cmath.exp(1j * c) * math.sin(a - b)],
|
468
|
-
[0, cmath.exp(-1j * c) * math.cos(a + b), 1j * cmath.exp(-1j * c) * math.sin(a + b), 0],
|
469
|
-
[0, 1j * cmath.exp(-1j * c) * math.sin(a + b), cmath.exp(-1j * c) * math.cos(a + b), 0],
|
470
|
-
[1j * cmath.exp(1j * c) * math.sin(a - b), 0, 0, cmath.exp(1j * c) * math.cos(a - b)],
|
471
|
-
],
|
472
|
-
dtype=complex,
|
473
|
-
)
|
474
|
-
|
475
|
-
|
476
|
-
def trace_to_fid(trace):
|
477
|
-
r"""Average gate fidelity is
|
478
|
-
|
479
|
-
.. math::
|
480
|
-
|
481
|
-
\bar{F} = \frac{d + |\mathrm{Tr} (U_\text{target} \cdot U^{\dag})|^2}{d(d+1)}
|
482
|
-
|
483
|
-
M. Horodecki, P. Horodecki and R. Horodecki, PRA 60, 1888 (1999)"""
|
484
|
-
return (4 + abs(trace) ** 2) / 20
|
485
|
-
|
486
|
-
|
487
|
-
def rz_array(theta):
|
488
|
-
"""Return numpy array for Rz(theta).
|
489
|
-
|
490
|
-
Rz(theta) = diag(exp(-i*theta/2),exp(i*theta/2))
|
491
|
-
"""
|
492
|
-
return np.array(
|
493
|
-
[[cmath.exp(-1j * theta / 2.0), 0], [0, cmath.exp(1j * theta / 2.0)]], dtype=complex
|
494
|
-
)
|
495
|
-
|
496
|
-
|
497
438
|
class TwoQubitBasisDecomposer:
|
498
439
|
"""A class for decomposing 2-qubit unitaries into minimal number of uses of a 2-qubit
|
499
440
|
basis gate.
|
qiskit/synthesis/unitary/qsd.py
CHANGED
@@ -47,7 +47,8 @@ def qs_decomposition(
|
|
47
47
|
|
48
48
|
This decomposition is described in Shende et al. [1].
|
49
49
|
|
50
|
-
..
|
50
|
+
.. code-block:: text
|
51
|
+
|
51
52
|
┌───┐ ┌───┐ ┌───┐ ┌───┐
|
52
53
|
─┤ ├─ ───────┤ Rz├─────┤ Ry├─────┤ Rz├─────
|
53
54
|
│ │ ≃ ┌───┐└─┬─┘┌───┐└─┬─┘┌───┐└─┬─┘┌───┐
|
@@ -250,14 +251,13 @@ def _get_ucry_cz(nqubits, angles):
|
|
250
251
|
|
251
252
|
|
252
253
|
def _apply_a2(circ):
|
253
|
-
from qiskit.compiler import transpile
|
254
254
|
from qiskit.quantum_info import Operator
|
255
255
|
from qiskit.circuit.library.generalized_gates.unitary import UnitaryGate
|
256
|
+
from qiskit.transpiler.passes.synthesis import HighLevelSynthesis
|
256
257
|
|
257
258
|
decomposer = two_qubit_decompose_up_to_diagonal
|
258
|
-
|
259
|
-
|
260
|
-
)
|
259
|
+
hls = HighLevelSynthesis(basis_gates=["u", "cx", "qsd2q"], qubits_initially_zero=False)
|
260
|
+
ccirc = hls(circ)
|
261
261
|
ind2q = []
|
262
262
|
# collect 2q instrs
|
263
263
|
for i, instruction in enumerate(ccirc.data):
|
qiskit/transpiler/__init__.py
CHANGED
@@ -106,8 +106,9 @@ also add initial logical optimization prior to routing, you would do something l
|
|
106
106
|
.. code-block:: python
|
107
107
|
|
108
108
|
import numpy as np
|
109
|
+
from qiskit.providers.fake_provider import GenericBackendV2
|
109
110
|
from qiskit.circuit.library import HGate, PhaseGate, RXGate, TdgGate, TGate, XGate
|
110
|
-
from qiskit.transpiler import PassManager
|
111
|
+
from qiskit.transpiler import PassManager, generate_preset_pass_manager
|
111
112
|
from qiskit.transpiler.passes import (
|
112
113
|
ALAPScheduleAnalysis,
|
113
114
|
CXCancellation,
|
@@ -115,6 +116,7 @@ also add initial logical optimization prior to routing, you would do something l
|
|
115
116
|
PadDynamicalDecoupling,
|
116
117
|
)
|
117
118
|
|
119
|
+
backend = GenericBackendV2(num_qubits=5)
|
118
120
|
dd_sequence = [XGate(), XGate()]
|
119
121
|
scheduling_pm = PassManager(
|
120
122
|
[
|
@@ -135,6 +137,9 @@ also add initial logical optimization prior to routing, you would do something l
|
|
135
137
|
]
|
136
138
|
)
|
137
139
|
|
140
|
+
pass_manager = generate_preset_pass_manager(
|
141
|
+
optimization_level=0
|
142
|
+
)
|
138
143
|
|
139
144
|
# Add pre-layout stage to run extra logical optimization
|
140
145
|
pass_manager.pre_layout = logical_opt
|
@@ -253,7 +258,7 @@ descriptions of the instructions it supports:
|
|
253
258
|
)
|
254
259
|
print(target)
|
255
260
|
|
256
|
-
..
|
261
|
+
.. code-block:: text
|
257
262
|
|
258
263
|
Target
|
259
264
|
Number of qubits: 3
|
@@ -578,7 +583,7 @@ original. This can be verified by checking the depth of both circuits:
|
|
578
583
|
|
579
584
|
print('Original depth:', qc.depth(), 'Decomposed Depth:', qc_basis.depth())
|
580
585
|
|
581
|
-
..
|
586
|
+
.. code-block:: text
|
582
587
|
|
583
588
|
Original depth: 4 Decomposed Depth: 10
|
584
589
|
|
@@ -598,7 +603,7 @@ It is important to highlight two special cases:
|
|
598
603
|
|
599
604
|
print(backend.operation_names)
|
600
605
|
|
601
|
-
..
|
606
|
+
.. code-block:: text
|
602
607
|
|
603
608
|
['id', 'rz', 'sx', 'x', 'cx', 'measure', 'delay']
|
604
609
|
|
@@ -1017,7 +1022,7 @@ classical register wires, though theoretically two conditional instructions
|
|
1017
1022
|
conditioned on the same register could commute, i.e. read-access to the
|
1018
1023
|
classical register doesn't change its state.
|
1019
1024
|
|
1020
|
-
..
|
1025
|
+
.. code-block:: text
|
1021
1026
|
|
1022
1027
|
qc = QuantumCircuit(2, 1)
|
1023
1028
|
qc.delay(100, 0)
|
@@ -1028,7 +1033,7 @@ The scheduler SHOULD comply with the above topological ordering policy of the
|
|
1028
1033
|
DAG circuit.
|
1029
1034
|
Accordingly, the `asap`-scheduled circuit will become
|
1030
1035
|
|
1031
|
-
..
|
1036
|
+
.. code-block:: text
|
1032
1037
|
|
1033
1038
|
┌────────────────┐ ┌───┐
|
1034
1039
|
q_0: ┤ Delay(100[dt]) ├───┤ X ├──────────────
|
@@ -1055,7 +1060,7 @@ then a discriminated (D) binary value is moved to the classical register (C).
|
|
1055
1060
|
A sequence from t0 to t1 of the measure instruction interval could be
|
1056
1061
|
modeled as follows:
|
1057
1062
|
|
1058
|
-
..
|
1063
|
+
.. code-block:: text
|
1059
1064
|
|
1060
1065
|
Q ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░
|
1061
1066
|
B ░░▒▒▒▒▒▒▒▒░░░░░░░░░
|
@@ -1070,7 +1075,7 @@ and the :class:`.Clbit` is only occupied at the very end of the interval.
|
|
1070
1075
|
The lack of precision representing the physical model may induce
|
1071
1076
|
edge cases in the scheduling:
|
1072
1077
|
|
1073
|
-
..
|
1078
|
+
.. code-block:: text
|
1074
1079
|
|
1075
1080
|
┌───┐
|
1076
1081
|
q_0: ───┤ X ├──────
|
@@ -1089,7 +1094,7 @@ is unchanged during the application of the stimulus, so two nodes are
|
|
1089
1094
|
simultaneously operated.
|
1090
1095
|
If one tries to `alap`-schedule this circuit, it may return following circuit:
|
1091
1096
|
|
1092
|
-
..
|
1097
|
+
.. code-block:: text
|
1093
1098
|
|
1094
1099
|
┌────────────────┐ ┌───┐
|
1095
1100
|
q_0: ┤ Delay(500[dt]) ├───┤ X ├──────
|
@@ -1105,7 +1110,7 @@ It looks like the topological ordering between the nodes is flipped in the
|
|
1105
1110
|
scheduled view.
|
1106
1111
|
This behavior can be understood by considering the control flow model described above,
|
1107
1112
|
|
1108
|
-
..
|
1113
|
+
.. code-block:: text
|
1109
1114
|
|
1110
1115
|
: Quantum Circuit, first-measure
|
1111
1116
|
0 ░░░░░░░░░░░░▒▒▒▒▒▒░
|
@@ -1137,7 +1142,7 @@ be copied to the pass manager property set before the pass is called.
|
|
1137
1142
|
|
1138
1143
|
Due to default latencies, the `alap`-scheduled circuit of above example may become
|
1139
1144
|
|
1140
|
-
..
|
1145
|
+
.. code-block:: text
|
1141
1146
|
|
1142
1147
|
┌───┐
|
1143
1148
|
q_0: ───┤ X ├──────
|
@@ -1151,7 +1156,8 @@ If the backend microarchitecture supports smart scheduling of the control flow
|
|
1151
1156
|
instructions, such as separately scheduling qubits and classical registers,
|
1152
1157
|
the insertion of the delay yields an unnecessarily longer total execution time.
|
1153
1158
|
|
1154
|
-
..
|
1159
|
+
.. code-block:: text
|
1160
|
+
|
1155
1161
|
: Quantum Circuit, first-XGate
|
1156
1162
|
0 ░▒▒▒░░░░░░░░░░░░░░░
|
1157
1163
|
1 ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░
|
@@ -1168,7 +1174,7 @@ However, this result is much more intuitive in the topological ordering view.
|
|
1168
1174
|
If a finite conditional latency value is provided, for example, 30 dt, the circuit
|
1169
1175
|
is scheduled as follows:
|
1170
1176
|
|
1171
|
-
..
|
1177
|
+
.. code-block:: text
|
1172
1178
|
|
1173
1179
|
┌───────────────┐ ┌───┐
|
1174
1180
|
q_0: ┤ Delay(30[dt]) ├───┤ X ├──────
|
@@ -1180,7 +1186,8 @@ is scheduled as follows:
|
|
1180
1186
|
|
1181
1187
|
with the timing model:
|
1182
1188
|
|
1183
|
-
..
|
1189
|
+
.. code-block:: text
|
1190
|
+
|
1184
1191
|
: Quantum Circuit, first-xgate
|
1185
1192
|
0 ░░▒▒▒░░░░░░░░░░░░░░░
|
1186
1193
|
1 ░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░
|
qiskit/transpiler/basepasses.py
CHANGED
@@ -201,7 +201,7 @@ class TransformationPass(BasePass): # pylint: disable=abstract-method
|
|
201
201
|
if state.workflow_status.previous_run == RunState.SUCCESS:
|
202
202
|
if isinstance(new_dag, DAGCircuit):
|
203
203
|
# Copy calibration data from the original program
|
204
|
-
new_dag.
|
204
|
+
new_dag._calibrations_prop = passmanager_ir._calibrations_prop
|
205
205
|
else:
|
206
206
|
raise TranspilerError(
|
207
207
|
"Transformation passes should return a transformed dag."
|
@@ -93,6 +93,7 @@ Optimizations
|
|
93
93
|
NormalizeRXAngle
|
94
94
|
OptimizeAnnotated
|
95
95
|
Split2QUnitaries
|
96
|
+
RemoveIdentityEquivalent
|
96
97
|
|
97
98
|
Calibration
|
98
99
|
=============
|
@@ -247,6 +248,7 @@ from .optimization import OptimizeCliffords
|
|
247
248
|
from .optimization import ElidePermutations
|
248
249
|
from .optimization import NormalizeRXAngle
|
249
250
|
from .optimization import OptimizeAnnotated
|
251
|
+
from .optimization import RemoveIdentityEquivalent
|
250
252
|
from .optimization import Split2QUnitaries
|
251
253
|
|
252
254
|
# circuit analysis
|