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
@@ -13,15 +13,123 @@
|
|
13
13
|
"""The real-amplitudes 2-local circuit."""
|
14
14
|
|
15
15
|
from __future__ import annotations
|
16
|
-
from collections.abc import Callable
|
16
|
+
from collections.abc import Callable, Iterable
|
17
17
|
|
18
18
|
import numpy as np
|
19
19
|
|
20
20
|
from qiskit.circuit import QuantumCircuit
|
21
21
|
from qiskit.circuit.library.standard_gates import RYGate, CXGate
|
22
|
+
from qiskit.utils.deprecation import deprecate_func
|
23
|
+
from .n_local import n_local, BlockEntanglement
|
22
24
|
from .two_local import TwoLocal
|
23
25
|
|
24
26
|
|
27
|
+
def real_amplitudes(
|
28
|
+
num_qubits: int,
|
29
|
+
entanglement: (
|
30
|
+
BlockEntanglement
|
31
|
+
| Iterable[BlockEntanglement]
|
32
|
+
| Callable[[int], BlockEntanglement | Iterable[BlockEntanglement]]
|
33
|
+
) = "reverse_linear",
|
34
|
+
reps: int = 3,
|
35
|
+
skip_unentangled_qubits: bool = False,
|
36
|
+
skip_final_rotation_layer: bool = False,
|
37
|
+
parameter_prefix: str = "θ",
|
38
|
+
insert_barriers: bool = False,
|
39
|
+
name: str = "RealAmplitudes",
|
40
|
+
) -> QuantumCircuit:
|
41
|
+
r"""Construct a real-amplitudes 2-local circuit.
|
42
|
+
|
43
|
+
This circuit is a heuristic trial wave function used, e.g., as ansatz in chemistry, optimization
|
44
|
+
or machine learning applications. The circuit consists of alternating layers of :math:`Y`
|
45
|
+
rotations and :math:`CX` entanglements. The entanglement pattern can be user-defined or selected
|
46
|
+
from a predefined set. This circuit is "real amplitudes" since the prepared quantum states will
|
47
|
+
only have real amplitudes.
|
48
|
+
|
49
|
+
For example a ``real_amplitudes`` circuit with 2 repetitions on 3 qubits with ``"reverse_linear"``
|
50
|
+
entanglement is
|
51
|
+
|
52
|
+
.. parsed-literal::
|
53
|
+
|
54
|
+
┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐
|
55
|
+
┤ Ry(θ[0]) ├─░────────■───░─┤ Ry(θ[3]) ├─░────────■───░─┤ Ry(θ[6]) ├
|
56
|
+
├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤
|
57
|
+
┤ Ry(θ[1]) ├─░───■──┤ X ├─░─┤ Ry(θ[4]) ├─░───■──┤ X ├─░─┤ Ry(θ[7]) ├
|
58
|
+
├──────────┤ ░ ┌─┴─┐└───┘ ░ ├──────────┤ ░ ┌─┴─┐└───┘ ░ ├──────────┤
|
59
|
+
┤ Ry(θ[2]) ├─░─┤ X ├──────░─┤ Ry(θ[5]) ├─░─┤ X ├──────░─┤ Ry(θ[8]) ├
|
60
|
+
└──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘
|
61
|
+
|
62
|
+
The entanglement can be set using the ``entanglement`` keyword as string or a list of
|
63
|
+
index-pairs. See the documentation of :func:`.n_local`. Additional options that can be set include
|
64
|
+
the number of repetitions, skipping rotation gates on qubits that are not entangled, leaving out
|
65
|
+
the final rotation layer and inserting barriers in between the rotation and entanglement
|
66
|
+
layers.
|
67
|
+
|
68
|
+
Examples:
|
69
|
+
|
70
|
+
.. plot::
|
71
|
+
:include-source:
|
72
|
+
:context:
|
73
|
+
|
74
|
+
from qiskit.circuit.library import real_amplitudes
|
75
|
+
|
76
|
+
ansatz = real_amplitudes(3, reps=2) # create the circuit on 3 qubits
|
77
|
+
ansatz.draw("mpl")
|
78
|
+
|
79
|
+
.. plot::
|
80
|
+
:include-source:
|
81
|
+
:context:
|
82
|
+
|
83
|
+
ansatz = real_amplitudes(3, entanglement="full", reps=2) # it is the same unitary as above
|
84
|
+
ansatz.draw("mpl")
|
85
|
+
|
86
|
+
.. plot::
|
87
|
+
:include-source:
|
88
|
+
:context:
|
89
|
+
|
90
|
+
ansatz = real_amplitudes(3, entanglement="linear", reps=2, insert_barriers=True)
|
91
|
+
ansatz.draw("mpl")
|
92
|
+
|
93
|
+
.. plot::
|
94
|
+
:include-source:
|
95
|
+
:context:
|
96
|
+
|
97
|
+
ansatz = real_amplitudes(4, reps=2, entanglement=[[0,3], [0,2]], skip_unentangled_qubits=True)
|
98
|
+
ansatz.draw("mpl")
|
99
|
+
|
100
|
+
Args:
|
101
|
+
num_qubits: The number of qubits of the RealAmplitudes circuit.
|
102
|
+
reps: Specifies how often the structure of a rotation layer followed by an entanglement
|
103
|
+
layer is repeated.
|
104
|
+
entanglement: The indices specifying on which qubits the input blocks act.
|
105
|
+
See :func:`.n_local` for detailed information.
|
106
|
+
skip_final_rotation_layer: Whether a final rotation layer is added to the circuit.
|
107
|
+
skip_unentangled_qubits: If ``True``, the rotation gates act only on qubits that
|
108
|
+
are entangled. If ``False``, the rotation gates act on all qubits.
|
109
|
+
parameter_prefix: The name of the free parameters.
|
110
|
+
insert_barriers: If True, barriers are inserted in between each layer. If False,
|
111
|
+
no barriers are inserted.
|
112
|
+
name: The name of the circuit.
|
113
|
+
|
114
|
+
Returns:
|
115
|
+
A real-amplitudes circuit.
|
116
|
+
"""
|
117
|
+
|
118
|
+
return n_local(
|
119
|
+
num_qubits,
|
120
|
+
["ry"],
|
121
|
+
["cx"],
|
122
|
+
entanglement,
|
123
|
+
reps,
|
124
|
+
insert_barriers,
|
125
|
+
parameter_prefix,
|
126
|
+
True,
|
127
|
+
skip_final_rotation_layer,
|
128
|
+
skip_unentangled_qubits,
|
129
|
+
name,
|
130
|
+
)
|
131
|
+
|
132
|
+
|
25
133
|
class RealAmplitudes(TwoLocal):
|
26
134
|
r"""The real-amplitudes 2-local circuit.
|
27
135
|
|
@@ -35,7 +143,8 @@ class RealAmplitudes(TwoLocal):
|
|
35
143
|
For example a ``RealAmplitudes`` circuit with 2 repetitions on 3 qubits with ``'reverse_linear'``
|
36
144
|
entanglement is
|
37
145
|
|
38
|
-
..
|
146
|
+
.. code-block:: text
|
147
|
+
|
39
148
|
┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐
|
40
149
|
┤ Ry(θ[0]) ├─░────────■───░─┤ Ry(θ[3]) ├─░────────■───░─┤ Ry(θ[6]) ├
|
41
150
|
├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤
|
@@ -58,7 +167,7 @@ class RealAmplitudes(TwoLocal):
|
|
58
167
|
Examples:
|
59
168
|
|
60
169
|
>>> ansatz = RealAmplitudes(3, reps=2) # create the circuit on 3 qubits
|
61
|
-
>>> print(ansatz)
|
170
|
+
>>> print(ansatz.decompose())
|
62
171
|
┌──────────┐ ┌──────────┐ ┌──────────┐
|
63
172
|
q_0: ┤ Ry(θ[0]) ├──────────■──────┤ Ry(θ[3]) ├──────────■──────┤ Ry(θ[6]) ├
|
64
173
|
├──────────┤ ┌─┴─┐ ├──────────┤ ┌─┴─┐ ├──────────┤
|
@@ -67,7 +176,7 @@ class RealAmplitudes(TwoLocal):
|
|
67
176
|
q_2: ┤ Ry(θ[2]) ├┤ X ├┤ Ry(θ[5]) ├────────────┤ X ├┤ Ry(θ[8]) ├────────────
|
68
177
|
└──────────┘└───┘└──────────┘ └───┘└──────────┘
|
69
178
|
|
70
|
-
>>> ansatz = RealAmplitudes(3, entanglement='full', reps=2)
|
179
|
+
>>> ansatz = RealAmplitudes(3, entanglement='full', reps=2, flatten=True)
|
71
180
|
>>> print(ansatz)
|
72
181
|
┌──────────┐ ┌──────────┐ ┌──────────┐
|
73
182
|
q_0: ┤ RY(θ[0]) ├──■────■──┤ RY(θ[3]) ├──────────────■────■──┤ RY(θ[6]) ├────────────
|
@@ -77,7 +186,8 @@ class RealAmplitudes(TwoLocal):
|
|
77
186
|
q_2: ┤ RY(θ[2]) ├─────┤ X ├───┤ X ├────┤ RY(θ[5]) ├─────┤ X ├───┤ X ├────┤ RY(θ[8]) ├
|
78
187
|
└──────────┘ └───┘ └───┘ └──────────┘ └───┘ └───┘ └──────────┘
|
79
188
|
|
80
|
-
>>> ansatz = RealAmplitudes(3, entanglement='linear', reps=2, insert_barriers=True
|
189
|
+
>>> ansatz = RealAmplitudes(3, entanglement='linear', reps=2, insert_barriers=True,
|
190
|
+
... flatten=True)
|
81
191
|
>>> qc = QuantumCircuit(3) # create a circuit and append the RY variational form
|
82
192
|
>>> qc.compose(ansatz, inplace=True)
|
83
193
|
>>> qc.draw()
|
@@ -89,7 +199,8 @@ class RealAmplitudes(TwoLocal):
|
|
89
199
|
q_2: ┤ RY(θ[2]) ├─░──────┤ X ├─░─┤ RY(θ[5]) ├─░──────┤ X ├─░─┤ RY(θ[8]) ├
|
90
200
|
└──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘
|
91
201
|
|
92
|
-
>>> ansatz = RealAmplitudes(4, reps=1, entanglement='circular', insert_barriers=True
|
202
|
+
>>> ansatz = RealAmplitudes(4, reps=1, entanglement='circular', insert_barriers=True,
|
203
|
+
... flatten=True)
|
93
204
|
>>> print(ansatz)
|
94
205
|
┌──────────┐ ░ ┌───┐ ░ ┌──────────┐
|
95
206
|
q_0: ┤ RY(θ[0]) ├─░─┤ X ├──■─────────────░─┤ RY(θ[4]) ├
|
@@ -102,7 +213,7 @@ class RealAmplitudes(TwoLocal):
|
|
102
213
|
└──────────┘ ░ └───┘ ░ └──────────┘
|
103
214
|
|
104
215
|
>>> ansatz = RealAmplitudes(4, reps=2, entanglement=[[0,3], [0,2]],
|
105
|
-
... skip_unentangled_qubits=True)
|
216
|
+
... skip_unentangled_qubits=True, flatten=True)
|
106
217
|
>>> print(ansatz)
|
107
218
|
┌──────────┐ ┌──────────┐ ┌──────────┐
|
108
219
|
q_0: ┤ RY(θ[0]) ├──■───────■──────┤ RY(θ[3]) ├──■───────■──────┤ RY(θ[6]) ├
|
@@ -114,8 +225,17 @@ class RealAmplitudes(TwoLocal):
|
|
114
225
|
q_3: ┤ RY(θ[2]) ├┤ X ├┤ RY(θ[5]) ├────────────┤ X ├┤ RY(θ[8]) ├────────────
|
115
226
|
└──────────┘└───┘└──────────┘ └───┘└──────────┘
|
116
227
|
|
228
|
+
.. seealso::
|
229
|
+
|
230
|
+
The :func:`.real_amplitudes` function constructs a functionally equivalent circuit, but faster.
|
231
|
+
|
117
232
|
"""
|
118
233
|
|
234
|
+
@deprecate_func(
|
235
|
+
since="1.3",
|
236
|
+
additional_msg="Use the function qiskit.circuit.library.real_amplitudes instead.",
|
237
|
+
pending=True,
|
238
|
+
)
|
119
239
|
def __init__(
|
120
240
|
self,
|
121
241
|
num_qubits: int | None = None,
|
@@ -18,6 +18,7 @@ from collections.abc import Callable, Sequence
|
|
18
18
|
|
19
19
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
20
20
|
from qiskit.circuit import Gate, Instruction
|
21
|
+
from qiskit.utils.deprecation import deprecate_func
|
21
22
|
|
22
23
|
from .n_local import NLocal
|
23
24
|
from ..standard_gates import get_standard_gate_name_mapping
|
@@ -76,7 +77,7 @@ class TwoLocal(NLocal):
|
|
76
77
|
Examples:
|
77
78
|
|
78
79
|
>>> two = TwoLocal(3, 'ry', 'cx', 'linear', reps=2, insert_barriers=True)
|
79
|
-
>>> print(two) # decompose the layers into standard gates
|
80
|
+
>>> print(two.decompose()) # decompose the layers into standard gates
|
80
81
|
┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐
|
81
82
|
q_0: ┤ Ry(θ[0]) ├─░───■────────░─┤ Ry(θ[3]) ├─░───■────────░─┤ Ry(θ[6]) ├
|
82
83
|
├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤
|
@@ -85,10 +86,10 @@ class TwoLocal(NLocal):
|
|
85
86
|
q_2: ┤ Ry(θ[2]) ├─░──────┤ X ├─░─┤ Ry(θ[5]) ├─░──────┤ X ├─░─┤ Ry(θ[8]) ├
|
86
87
|
└──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘
|
87
88
|
|
88
|
-
>>> two = TwoLocal(3, ['ry','rz'], 'cz', 'full', reps=1, insert_barriers=True)
|
89
|
+
>>> two = TwoLocal(3, ['ry','rz'], 'cz', 'full', reps=1, insert_barriers=True, flatten=True)
|
89
90
|
>>> qc = QuantumCircuit(3)
|
90
91
|
>>> qc &= two
|
91
|
-
>>> print(qc.
|
92
|
+
>>> print(qc.draw())
|
92
93
|
┌──────────┐┌──────────┐ ░ ░ ┌──────────┐ ┌──────────┐
|
93
94
|
q_0: ┤ Ry(θ[0]) ├┤ Rz(θ[3]) ├─░──■──■─────░─┤ Ry(θ[6]) ├─┤ Rz(θ[9]) ├
|
94
95
|
├──────────┤├──────────┤ ░ │ │ ░ ├──────────┤┌┴──────────┤
|
@@ -98,7 +99,7 @@ class TwoLocal(NLocal):
|
|
98
99
|
└──────────┘└──────────┘ ░ ░ └──────────┘└───────────┘
|
99
100
|
|
100
101
|
>>> entangler_map = [[0, 1], [1, 2], [2, 0]] # circular entanglement for 3 qubits
|
101
|
-
>>> two = TwoLocal(3, 'x', 'crx', entangler_map, reps=1)
|
102
|
+
>>> two = TwoLocal(3, 'x', 'crx', entangler_map, reps=1, flatten=True)
|
102
103
|
>>> print(two) # note: no barriers inserted this time!
|
103
104
|
┌───┐ ┌──────────┐┌───┐
|
104
105
|
q_0: |0>┤ X ├─────■───────────────────────┤ Rx(θ[2]) ├┤ X ├
|
@@ -109,9 +110,9 @@ class TwoLocal(NLocal):
|
|
109
110
|
└───┘ └──────────┘ └───┘
|
110
111
|
|
111
112
|
>>> entangler_map = [[0, 3], [0, 2]] # entangle the first and last two-way
|
112
|
-
>>> two = TwoLocal(4, [], 'cry', entangler_map, reps=1)
|
113
|
+
>>> two = TwoLocal(4, [], 'cry', entangler_map, reps=1, flatten=True)
|
113
114
|
>>> circuit = two.compose(two)
|
114
|
-
>>> print(circuit.
|
115
|
+
>>> print(circuit.draw()) # note, that the parameters are the same!
|
115
116
|
q_0: ─────■───────────■───────────■───────────■──────
|
116
117
|
│ │ │ │
|
117
118
|
q_1: ─────┼───────────┼───────────┼───────────┼──────
|
@@ -123,7 +124,8 @@ class TwoLocal(NLocal):
|
|
123
124
|
|
124
125
|
>>> layer_1 = [(0, 1), (0, 2)]
|
125
126
|
>>> layer_2 = [(1, 2)]
|
126
|
-
>>> two = TwoLocal(3, 'x', 'cx', [layer_1, layer_2], reps=2, insert_barriers=True
|
127
|
+
>>> two = TwoLocal(3, 'x', 'cx', [layer_1, layer_2], reps=2, insert_barriers=True,
|
128
|
+
... flatten=True)
|
127
129
|
>>> print(two)
|
128
130
|
┌───┐ ░ ░ ┌───┐ ░ ░ ┌───┐
|
129
131
|
q_0: ┤ X ├─░───■────■───░─┤ X ├─░───────░─┤ X ├
|
@@ -135,6 +137,11 @@ class TwoLocal(NLocal):
|
|
135
137
|
|
136
138
|
"""
|
137
139
|
|
140
|
+
@deprecate_func(
|
141
|
+
since="1.3",
|
142
|
+
additional_msg="Use the function qiskit.circuit.library.n_local instead.",
|
143
|
+
pending=True,
|
144
|
+
)
|
138
145
|
def __init__(
|
139
146
|
self,
|
140
147
|
num_qubits: int | None = None,
|
@@ -16,6 +16,7 @@ from qiskit.circuit import QuantumCircuit, Gate
|
|
16
16
|
from qiskit.circuit.parametervector import ParameterVector
|
17
17
|
from qiskit.circuit.exceptions import CircuitError
|
18
18
|
from qiskit.circuit import Barrier
|
19
|
+
from qiskit.utils.deprecation import deprecate_func
|
19
20
|
|
20
21
|
|
21
22
|
class UnitaryOverlap(QuantumCircuit):
|
@@ -41,13 +42,13 @@ class UnitaryOverlap(QuantumCircuit):
|
|
41
42
|
from qiskit.circuit.library import EfficientSU2, UnitaryOverlap
|
42
43
|
from qiskit.primitives import Sampler
|
43
44
|
|
44
|
-
# get two circuit to prepare states of which we
|
45
|
+
# get two circuit to prepare states of which we compute the overlap
|
45
46
|
circuit = EfficientSU2(2, reps=1)
|
46
47
|
unitary1 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
|
47
48
|
unitary2 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
|
48
49
|
|
49
50
|
# create the overlap circuit
|
50
|
-
overlap =
|
51
|
+
overlap = UnitaryOverlap(unitary1, unitary2)
|
51
52
|
|
52
53
|
# sample from the overlap
|
53
54
|
sampler = Sampler(options={"shots": 100})
|
@@ -58,6 +59,11 @@ class UnitaryOverlap(QuantumCircuit):
|
|
58
59
|
|
59
60
|
"""
|
60
61
|
|
62
|
+
@deprecate_func(
|
63
|
+
since="1.3",
|
64
|
+
additional_msg="Use qiskit.circuit.library.unitary_overlap instead.",
|
65
|
+
pending=True,
|
66
|
+
)
|
61
67
|
def __init__(
|
62
68
|
self,
|
63
69
|
unitary1: QuantumCircuit,
|
@@ -80,30 +86,9 @@ class UnitaryOverlap(QuantumCircuit):
|
|
80
86
|
CircuitError: Number of qubits in ``unitary1`` and ``unitary2`` does not match.
|
81
87
|
CircuitError: Inputs contain measurements and/or resets.
|
82
88
|
"""
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
f"Number of qubits in unitaries does "
|
87
|
-
f"not match: {unitary1.num_qubits} != {unitary2.num_qubits}."
|
88
|
-
)
|
89
|
-
|
90
|
-
unitaries = [unitary1, unitary2]
|
91
|
-
for unitary in unitaries:
|
92
|
-
_check_unitary(unitary)
|
93
|
-
|
94
|
-
# Vectors of new parameters, if any. Need the unitaries in a list here to ensure
|
95
|
-
# we can overwrite them.
|
96
|
-
for i, prefix in enumerate([prefix1, prefix2]):
|
97
|
-
if unitaries[i].num_parameters > 0:
|
98
|
-
new_params = ParameterVector(prefix, unitaries[i].num_parameters)
|
99
|
-
unitaries[i] = unitaries[i].assign_parameters(new_params)
|
100
|
-
|
101
|
-
# Generate the actual overlap circuit
|
102
|
-
super().__init__(unitaries[0].num_qubits, name="UnitaryOverlap")
|
103
|
-
self.compose(unitaries[0], inplace=True)
|
104
|
-
if insert_barrier:
|
105
|
-
self.barrier()
|
106
|
-
self.compose(unitaries[1].inverse(), inplace=True)
|
89
|
+
circuit = unitary_overlap(unitary1, unitary2, prefix1, prefix2, insert_barrier)
|
90
|
+
super().__init__(*circuit.qregs, name=circuit.name)
|
91
|
+
self.compose(circuit, qubits=self.qubits, inplace=True)
|
107
92
|
|
108
93
|
|
109
94
|
def _check_unitary(circuit):
|
@@ -115,3 +100,83 @@ def _check_unitary(circuit):
|
|
115
100
|
"One or more instructions cannot be converted to"
|
116
101
|
f' a gate. "{instruction.operation.name}" is not a gate instruction'
|
117
102
|
)
|
103
|
+
|
104
|
+
|
105
|
+
def unitary_overlap(
|
106
|
+
unitary1: QuantumCircuit,
|
107
|
+
unitary2: QuantumCircuit,
|
108
|
+
prefix1: str = "p1",
|
109
|
+
prefix2: str = "p2",
|
110
|
+
insert_barrier: bool = False,
|
111
|
+
) -> QuantumCircuit:
|
112
|
+
r"""Circuit that returns the overlap between two unitaries :math:`U_2^{\dag} U_1`.
|
113
|
+
|
114
|
+
The input quantum circuits must represent unitary operations, since they must be invertible.
|
115
|
+
If the inputs will have parameters, they are replaced by :class:`.ParameterVector`\s with
|
116
|
+
names `"p1"` (for circuit ``unitary1``) and `"p2"` (for circuit ``unitary_2``) in the output
|
117
|
+
circuit.
|
118
|
+
|
119
|
+
This circuit is usually employed in computing the fidelity:
|
120
|
+
|
121
|
+
.. math::
|
122
|
+
|
123
|
+
\left|\langle 0| U_2^{\dag} U_1|0\rangle\right|^{2}
|
124
|
+
|
125
|
+
by computing the probability of being in the all-zeros bit-string, or equivalently,
|
126
|
+
the expectation value of projector :math:`|0\rangle\langle 0|`.
|
127
|
+
|
128
|
+
**Reference Circuit:**
|
129
|
+
|
130
|
+
.. plot::
|
131
|
+
:include-source:
|
132
|
+
|
133
|
+
import numpy as np
|
134
|
+
from qiskit.circuit.library import EfficientSU2, unitary_overlap
|
135
|
+
|
136
|
+
# get two circuit to prepare states of which we compute the overlap
|
137
|
+
circuit = EfficientSU2(2, reps=1)
|
138
|
+
unitary1 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
|
139
|
+
unitary2 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
|
140
|
+
|
141
|
+
# create the overlap circuit
|
142
|
+
overlap = unitary_overlap(unitary1, unitary2)
|
143
|
+
overlap.draw('mpl')
|
144
|
+
|
145
|
+
Args:
|
146
|
+
unitary1: Unitary acting on the ket vector.
|
147
|
+
unitary2: Unitary whose inverse operates on the bra vector.
|
148
|
+
prefix1: The name of the parameter vector associated to ``unitary1``,
|
149
|
+
if it is parameterized. Defaults to ``"p1"``.
|
150
|
+
prefix2: The name of the parameter vector associated to ``unitary2``,
|
151
|
+
if it is parameterized. Defaults to ``"p2"``.
|
152
|
+
insert_barrier: Whether to insert a barrier between the two unitaries.
|
153
|
+
|
154
|
+
Raises:
|
155
|
+
CircuitError: Number of qubits in ``unitary1`` and ``unitary2`` does not match.
|
156
|
+
CircuitError: Inputs contain measurements and/or resets.
|
157
|
+
"""
|
158
|
+
# check inputs are valid
|
159
|
+
if unitary1.num_qubits != unitary2.num_qubits:
|
160
|
+
raise CircuitError(
|
161
|
+
f"Number of qubits in unitaries does "
|
162
|
+
f"not match: {unitary1.num_qubits} != {unitary2.num_qubits}."
|
163
|
+
)
|
164
|
+
|
165
|
+
unitaries = [unitary1, unitary2]
|
166
|
+
for unitary in unitaries:
|
167
|
+
_check_unitary(unitary)
|
168
|
+
|
169
|
+
# Vectors of new parameters, if any. Need the unitaries in a list here to ensure
|
170
|
+
# we can overwrite them.
|
171
|
+
for i, prefix in enumerate([prefix1, prefix2]):
|
172
|
+
if unitaries[i].num_parameters > 0:
|
173
|
+
new_params = ParameterVector(prefix, unitaries[i].num_parameters)
|
174
|
+
unitaries[i] = unitaries[i].assign_parameters(new_params)
|
175
|
+
|
176
|
+
# Generate the actual overlap circuit
|
177
|
+
circuit = QuantumCircuit(unitaries[0].num_qubits, name="UnitaryOverlap")
|
178
|
+
circuit.compose(unitaries[0], inplace=True)
|
179
|
+
if insert_barrier:
|
180
|
+
circuit.barrier()
|
181
|
+
circuit.compose(unitaries[1].inverse(), inplace=True)
|
182
|
+
return circuit
|
@@ -14,10 +14,11 @@
|
|
14
14
|
|
15
15
|
from __future__ import annotations
|
16
16
|
|
17
|
-
from typing import
|
17
|
+
from typing import TYPE_CHECKING
|
18
18
|
import numpy as np
|
19
19
|
|
20
20
|
from qiskit.circuit.gate import Gate
|
21
|
+
from qiskit.circuit.quantumcircuit import ParameterValueType
|
21
22
|
from qiskit.circuit.parameterexpression import ParameterExpression
|
22
23
|
from qiskit.quantum_info import Pauli, SparsePauliOp
|
23
24
|
|
@@ -56,6 +57,7 @@ class PauliEvolutionGate(Gate):
|
|
56
57
|
|
57
58
|
X = SparsePauliOp("X")
|
58
59
|
Z = SparsePauliOp("Z")
|
60
|
+
I = SparsePauliOp("I")
|
59
61
|
|
60
62
|
# build the evolution gate
|
61
63
|
operator = (Z ^ Z) - 0.1 * (X ^ I)
|
@@ -84,10 +86,10 @@ class PauliEvolutionGate(Gate):
|
|
84
86
|
|
85
87
|
def __init__(
|
86
88
|
self,
|
87
|
-
operator,
|
88
|
-
time:
|
89
|
-
label:
|
90
|
-
synthesis:
|
89
|
+
operator: Pauli | SparsePauliOp | list[Pauli | SparsePauliOp],
|
90
|
+
time: ParameterValueType = 1.0,
|
91
|
+
label: str | None = None,
|
92
|
+
synthesis: EvolutionSynthesis | None = None,
|
91
93
|
) -> None:
|
92
94
|
"""
|
93
95
|
Args:
|
@@ -108,21 +110,23 @@ class PauliEvolutionGate(Gate):
|
|
108
110
|
else:
|
109
111
|
operator = _to_sparse_pauli_op(operator)
|
110
112
|
|
111
|
-
if synthesis is None:
|
112
|
-
from qiskit.synthesis.evolution import LieTrotter
|
113
|
-
|
114
|
-
synthesis = LieTrotter()
|
115
|
-
|
116
113
|
if label is None:
|
117
114
|
label = _get_default_label(operator)
|
118
115
|
|
119
116
|
num_qubits = operator[0].num_qubits if isinstance(operator, list) else operator.num_qubits
|
120
117
|
super().__init__(name="PauliEvolution", num_qubits=num_qubits, params=[time], label=label)
|
121
118
|
self.operator = operator
|
119
|
+
|
120
|
+
if synthesis is None:
|
121
|
+
# pylint: disable=cyclic-import
|
122
|
+
from qiskit.synthesis.evolution import LieTrotter
|
123
|
+
|
124
|
+
synthesis = LieTrotter()
|
125
|
+
|
122
126
|
self.synthesis = synthesis
|
123
127
|
|
124
128
|
@property
|
125
|
-
def time(self) ->
|
129
|
+
def time(self) -> ParameterValueType:
|
126
130
|
"""Return the evolution time as stored in the gate parameters.
|
127
131
|
|
128
132
|
Returns:
|
@@ -131,7 +135,7 @@ class PauliEvolutionGate(Gate):
|
|
131
135
|
return self.params[0]
|
132
136
|
|
133
137
|
@time.setter
|
134
|
-
def time(self, time:
|
138
|
+
def time(self, time: ParameterValueType) -> None:
|
135
139
|
"""Set the evolution time.
|
136
140
|
|
137
141
|
Args:
|
@@ -143,9 +147,7 @@ class PauliEvolutionGate(Gate):
|
|
143
147
|
"""Unroll, where the default synthesis is matrix based."""
|
144
148
|
self.definition = self.synthesis.synthesize(self)
|
145
149
|
|
146
|
-
def validate_parameter(
|
147
|
-
self, parameter: Union[int, float, ParameterExpression]
|
148
|
-
) -> Union[float, ParameterExpression]:
|
150
|
+
def validate_parameter(self, parameter: ParameterValueType) -> ParameterValueType:
|
149
151
|
"""Gate parameters should be int, float, or ParameterExpression"""
|
150
152
|
if isinstance(parameter, int):
|
151
153
|
parameter = float(parameter)
|
@@ -12,11 +12,11 @@
|
|
12
12
|
|
13
13
|
"""Phase estimation circuit."""
|
14
14
|
|
15
|
-
from
|
15
|
+
from __future__ import annotations
|
16
16
|
|
17
17
|
from qiskit.circuit import QuantumCircuit, QuantumRegister
|
18
|
-
|
19
|
-
from .
|
18
|
+
from qiskit.utils.deprecation import deprecate_func
|
19
|
+
from qiskit.circuit.library import QFT
|
20
20
|
|
21
21
|
|
22
22
|
class PhaseEstimation(QuantumCircuit):
|
@@ -49,11 +49,16 @@ class PhaseEstimation(QuantumCircuit):
|
|
49
49
|
|
50
50
|
"""
|
51
51
|
|
52
|
+
@deprecate_func(
|
53
|
+
since="1.3",
|
54
|
+
additional_msg="Use qiskit.circuit.library.phase_estimation instead.",
|
55
|
+
pending=True,
|
56
|
+
)
|
52
57
|
def __init__(
|
53
58
|
self,
|
54
59
|
num_evaluation_qubits: int,
|
55
60
|
unitary: QuantumCircuit,
|
56
|
-
iqft:
|
61
|
+
iqft: QuantumCircuit | None = None,
|
57
62
|
name: str = "QPE",
|
58
63
|
) -> None:
|
59
64
|
"""
|
@@ -97,3 +102,74 @@ class PhaseEstimation(QuantumCircuit):
|
|
97
102
|
|
98
103
|
super().__init__(*circuit.qregs, name=circuit.name)
|
99
104
|
self.compose(circuit.to_gate(), qubits=self.qubits, inplace=True)
|
105
|
+
|
106
|
+
|
107
|
+
def phase_estimation(
|
108
|
+
num_evaluation_qubits: int,
|
109
|
+
unitary: QuantumCircuit,
|
110
|
+
name: str = "QPE",
|
111
|
+
) -> QuantumCircuit:
|
112
|
+
r"""Phase Estimation circuit.
|
113
|
+
|
114
|
+
In the Quantum Phase Estimation (QPE) algorithm [1, 2, 3], the Phase Estimation circuit is used
|
115
|
+
to estimate the phase :math:`\phi` of an eigenvalue :math:`e^{2\pi i\phi}` of a unitary operator
|
116
|
+
:math:`U`, provided with the corresponding eigenstate :math:`|\psi\rangle`.
|
117
|
+
That is
|
118
|
+
|
119
|
+
.. math::
|
120
|
+
|
121
|
+
U|\psi\rangle = e^{2\pi i\phi} |\psi\rangle
|
122
|
+
|
123
|
+
This estimation (and thereby this circuit) is a central routine to several well-known
|
124
|
+
algorithms, such as Shor's algorithm or Quantum Amplitude Estimation.
|
125
|
+
|
126
|
+
Args:
|
127
|
+
num_evaluation_qubits: The number of evaluation qubits.
|
128
|
+
unitary: The unitary operation :math:`U` which will be repeated and controlled.
|
129
|
+
name: The name of the circuit.
|
130
|
+
|
131
|
+
**Reference Circuit:**
|
132
|
+
|
133
|
+
.. plot::
|
134
|
+
:include-source:
|
135
|
+
|
136
|
+
from qiskit.circuit import QuantumCircuit
|
137
|
+
from qiskit.circuit.library import phase_estimation
|
138
|
+
unitary = QuantumCircuit(2)
|
139
|
+
unitary.x(0)
|
140
|
+
unitary.y(1)
|
141
|
+
circuit = phase_estimation(3, unitary)
|
142
|
+
circuit.draw('mpl')
|
143
|
+
|
144
|
+
**References:**
|
145
|
+
|
146
|
+
[1]: Kitaev, A. Y. (1995). Quantum measurements and the Abelian Stabilizer Problem. 1–22.
|
147
|
+
`quant-ph/9511026 <http://arxiv.org/abs/quant-ph/9511026>`_
|
148
|
+
|
149
|
+
[2]: Michael A. Nielsen and Isaac L. Chuang. 2011.
|
150
|
+
Quantum Computation and Quantum Information: 10th Anniversary Edition (10th ed.).
|
151
|
+
Cambridge University Press, New York, NY, USA.
|
152
|
+
|
153
|
+
[3]: Qiskit
|
154
|
+
`textbook <https://github.com/Qiskit/textbook/blob/main/notebooks/ch-algorithms/
|
155
|
+
quantum-phase-estimation.ipynb>`_
|
156
|
+
|
157
|
+
"""
|
158
|
+
# pylint: disable=cyclic-import
|
159
|
+
from qiskit.circuit.library import PermutationGate, QFTGate
|
160
|
+
|
161
|
+
qr_eval = QuantumRegister(num_evaluation_qubits, "eval")
|
162
|
+
qr_state = QuantumRegister(unitary.num_qubits, "q")
|
163
|
+
circuit = QuantumCircuit(qr_eval, qr_state, name=name)
|
164
|
+
|
165
|
+
circuit.h(qr_eval) # hadamards on evaluation qubits
|
166
|
+
|
167
|
+
for j in range(num_evaluation_qubits): # controlled powers
|
168
|
+
circuit.compose(unitary.power(2**j).control(), qubits=[j] + qr_state[:], inplace=True)
|
169
|
+
|
170
|
+
circuit.append(QFTGate(num_evaluation_qubits).inverse(), qr_eval[:])
|
171
|
+
|
172
|
+
reversal_pattern = list(reversed(range(num_evaluation_qubits)))
|
173
|
+
circuit.append(PermutationGate(reversal_pattern), qr_eval[:])
|
174
|
+
|
175
|
+
return circuit
|