qiskit 1.3.0__cp39-abi3-win32.whl → 1.3.0b1__cp39-abi3-win32.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +1 -20
- qiskit/_accelerate.pyd +0 -0
- qiskit/assembler/assemble_schedules.py +0 -2
- qiskit/circuit/__init__.py +1 -44
- qiskit/circuit/_standard_gates_commutations.py +0 -585
- qiskit/circuit/barrier.py +0 -2
- qiskit/circuit/controlflow/builder.py +3 -3
- qiskit/circuit/controlflow/if_else.py +5 -13
- qiskit/circuit/controlflow/while_loop.py +2 -10
- qiskit/circuit/delay.py +3 -20
- qiskit/circuit/equivalence.py +214 -13
- qiskit/circuit/gate.py +1 -3
- qiskit/circuit/instruction.py +11 -32
- qiskit/circuit/instructionset.py +0 -2
- qiskit/circuit/library/__init__.py +14 -110
- qiskit/circuit/library/arithmetic/__init__.py +2 -9
- qiskit/circuit/library/arithmetic/adders/__init__.py +0 -1
- qiskit/circuit/library/arithmetic/adders/adder.py +2 -154
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +56 -20
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +1 -14
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +91 -21
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +0 -1
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -8
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +3 -94
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +1 -8
- qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
- qiskit/circuit/library/basis_change/qft.py +38 -20
- qiskit/circuit/library/blueprintcircuit.py +0 -64
- qiskit/circuit/library/boolean_logic/__init__.py +4 -4
- qiskit/circuit/library/boolean_logic/inner_product.py +4 -81
- qiskit/circuit/library/boolean_logic/quantum_and.py +4 -107
- qiskit/circuit/library/boolean_logic/quantum_or.py +3 -107
- qiskit/circuit/library/boolean_logic/quantum_xor.py +3 -97
- qiskit/circuit/library/data_preparation/__init__.py +3 -6
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +29 -342
- qiskit/circuit/library/data_preparation/{_z_feature_map.py → z_feature_map.py} +34 -45
- qiskit/circuit/library/data_preparation/zz_feature_map.py +118 -0
- qiskit/circuit/library/fourier_checking.py +11 -72
- qiskit/circuit/library/generalized_gates/__init__.py +1 -1
- qiskit/circuit/library/generalized_gates/diagonal.py +51 -45
- qiskit/circuit/library/generalized_gates/gms.py +14 -67
- qiskit/circuit/library/generalized_gates/gr.py +4 -4
- qiskit/circuit/library/generalized_gates/isometry.py +2 -2
- qiskit/circuit/library/generalized_gates/linear_function.py +6 -12
- qiskit/circuit/library/generalized_gates/mcmt.py +107 -167
- qiskit/circuit/library/generalized_gates/permutation.py +6 -8
- qiskit/circuit/library/generalized_gates/rv.py +9 -8
- qiskit/circuit/library/graph_state.py +10 -93
- qiskit/circuit/library/grover_operator.py +2 -270
- qiskit/circuit/library/hidden_linear_function.py +20 -83
- qiskit/circuit/library/iqp.py +20 -99
- qiskit/circuit/library/n_local/__init__.py +7 -19
- qiskit/circuit/library/n_local/efficient_su2.py +5 -118
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +0 -259
- qiskit/circuit/library/n_local/excitation_preserving.py +6 -130
- qiskit/circuit/library/n_local/n_local.py +5 -406
- qiskit/circuit/library/n_local/pauli_two_design.py +4 -106
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -80
- qiskit/circuit/library/n_local/real_amplitudes.py +7 -127
- qiskit/circuit/library/n_local/two_local.py +7 -14
- qiskit/circuit/library/overlap.py +26 -91
- qiskit/circuit/library/pauli_evolution.py +15 -17
- qiskit/circuit/library/phase_estimation.py +4 -80
- qiskit/circuit/library/quantum_volume.py +20 -72
- qiskit/circuit/library/standard_gates/__init__.py +1 -20
- qiskit/circuit/library/standard_gates/dcx.py +1 -2
- qiskit/circuit/library/standard_gates/ecr.py +2 -2
- qiskit/circuit/library/standard_gates/h.py +3 -4
- qiskit/circuit/library/standard_gates/i.py +1 -2
- qiskit/circuit/library/standard_gates/iswap.py +2 -2
- qiskit/circuit/library/standard_gates/p.py +12 -20
- qiskit/circuit/library/standard_gates/r.py +1 -1
- qiskit/circuit/library/standard_gates/rx.py +3 -4
- qiskit/circuit/library/standard_gates/rxx.py +2 -2
- qiskit/circuit/library/standard_gates/ry.py +3 -4
- qiskit/circuit/library/standard_gates/ryy.py +2 -2
- qiskit/circuit/library/standard_gates/rz.py +12 -13
- qiskit/circuit/library/standard_gates/rzx.py +6 -6
- qiskit/circuit/library/standard_gates/rzz.py +1 -1
- qiskit/circuit/library/standard_gates/s.py +4 -4
- qiskit/circuit/library/standard_gates/swap.py +3 -3
- qiskit/circuit/library/standard_gates/sx.py +3 -4
- qiskit/circuit/library/standard_gates/t.py +2 -2
- qiskit/circuit/library/standard_gates/u.py +3 -11
- qiskit/circuit/library/standard_gates/u1.py +15 -65
- qiskit/circuit/library/standard_gates/u2.py +1 -4
- qiskit/circuit/library/standard_gates/u3.py +3 -31
- qiskit/circuit/library/standard_gates/x.py +5 -7
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -2
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -2
- qiskit/circuit/library/standard_gates/y.py +3 -4
- qiskit/circuit/library/standard_gates/z.py +3 -3
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +8 -9
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +7 -9
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +8 -9
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +8 -9
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +8 -9
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +9 -10
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +7 -9
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +8 -10
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +14 -16
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +12 -14
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +12 -14
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +9 -11
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +9 -11
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +9 -11
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +9 -11
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +10 -12
- qiskit/circuit/library/templates/rzx/rzx_cy.py +10 -11
- qiskit/circuit/library/templates/rzx/rzx_xz.py +15 -16
- qiskit/circuit/library/templates/rzx/rzx_yz.py +10 -12
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +20 -22
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +15 -16
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +15 -17
- qiskit/circuit/parameter.py +0 -4
- qiskit/circuit/parameterexpression.py +34 -167
- qiskit/circuit/quantumcircuit.py +126 -162
- qiskit/circuit/singleton.py +0 -2
- qiskit/circuit/store.py +0 -2
- qiskit/compiler/assembler.py +4 -17
- qiskit/compiler/scheduler.py +0 -2
- qiskit/compiler/sequencer.py +0 -2
- qiskit/compiler/transpiler.py +26 -81
- qiskit/converters/circuit_to_dag.py +2 -2
- qiskit/converters/circuit_to_dagdependency.py +1 -1
- qiskit/converters/circuit_to_dagdependency_v2.py +1 -1
- qiskit/converters/circuit_to_instruction.py +1 -1
- qiskit/converters/dag_to_circuit.py +5 -7
- qiskit/converters/dag_to_dagdependency.py +1 -1
- qiskit/converters/dag_to_dagdependency_v2.py +1 -1
- qiskit/converters/dagdependency_to_circuit.py +1 -5
- qiskit/converters/dagdependency_to_dag.py +1 -6
- qiskit/dagcircuit/collect_blocks.py +3 -3
- qiskit/dagcircuit/dagdependency.py +5 -18
- qiskit/dagcircuit/dagdependency_v2.py +1 -1
- qiskit/dagcircuit/dagnode.py +2 -2
- qiskit/passmanager/__init__.py +2 -2
- qiskit/primitives/backend_estimator.py +2 -5
- qiskit/primitives/backend_sampler_v2.py +18 -61
- qiskit/primitives/base/base_estimator.py +2 -2
- qiskit/primitives/containers/data_bin.py +1 -9
- qiskit/primitives/statevector_sampler.py +1 -1
- qiskit/primitives/utils.py +1 -1
- qiskit/providers/__init__.py +3 -3
- qiskit/providers/backend.py +1 -12
- qiskit/providers/backend_compat.py +3 -23
- qiskit/providers/basic_provider/basic_simulator.py +2 -12
- qiskit/providers/fake_provider/fake_pulse_backend.py +1 -6
- qiskit/providers/fake_provider/generic_backend_v2.py +30 -46
- qiskit/providers/models/pulsedefaults.py +0 -2
- qiskit/pulse/builder.py +18 -59
- qiskit/pulse/calibration_entries.py +1 -4
- qiskit/pulse/channels.py +0 -2
- qiskit/pulse/exceptions.py +0 -2
- qiskit/pulse/instruction_schedule_map.py +6 -21
- qiskit/pulse/instructions/acquire.py +0 -2
- qiskit/pulse/instructions/delay.py +0 -2
- qiskit/pulse/instructions/directives.py +0 -8
- qiskit/pulse/instructions/frequency.py +0 -3
- qiskit/pulse/instructions/instruction.py +0 -2
- qiskit/pulse/instructions/phase.py +0 -3
- qiskit/pulse/instructions/play.py +0 -2
- qiskit/pulse/instructions/reference.py +0 -2
- qiskit/pulse/instructions/snapshot.py +0 -2
- qiskit/pulse/library/pulse.py +0 -2
- qiskit/pulse/library/symbolic_pulses.py +0 -28
- qiskit/pulse/library/waveform.py +0 -2
- qiskit/pulse/macros.py +1 -1
- qiskit/pulse/schedule.py +13 -12
- qiskit/pulse/transforms/alignments.py +3 -5
- qiskit/pulse/transforms/dag.py +0 -7
- qiskit/qasm2/export.py +3 -5
- qiskit/qasm2/parse.py +2 -46
- qiskit/qasm3/__init__.py +0 -1
- qiskit/qasm3/ast.py +15 -123
- qiskit/qasm3/exporter.py +77 -103
- qiskit/qobj/converters/pulse_instruction.py +4 -6
- qiskit/qpy/__init__.py +0 -181
- qiskit/qpy/binary_io/circuits.py +5 -20
- qiskit/qpy/binary_io/schedules.py +4 -3
- qiskit/qpy/binary_io/value.py +13 -310
- qiskit/qpy/common.py +2 -46
- qiskit/qpy/formats.py +0 -7
- qiskit/qpy/interface.py +4 -40
- qiskit/quantum_info/__init__.py +0 -4
- qiskit/quantum_info/operators/channel/transformations.py +21 -28
- qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
- qiskit/quantum_info/operators/operator.py +8 -54
- qiskit/quantum_info/operators/symplectic/base_pauli.py +19 -11
- qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +1 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +0 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +2 -23
- qiskit/quantum_info/states/densitymatrix.py +5 -5
- qiskit/quantum_info/states/stabilizerstate.py +1 -1
- qiskit/quantum_info/states/statevector.py +6 -6
- qiskit/result/mitigation/base_readout_mitigator.py +1 -1
- qiskit/result/mitigation/correlated_readout_mitigator.py +1 -9
- qiskit/result/mitigation/local_readout_mitigator.py +1 -9
- qiskit/result/mitigation/utils.py +0 -57
- qiskit/scheduler/config.py +0 -2
- qiskit/scheduler/methods/basic.py +0 -3
- qiskit/scheduler/schedule_circuit.py +0 -2
- qiskit/scheduler/sequence.py +0 -2
- qiskit/synthesis/__init__.py +0 -25
- qiskit/synthesis/clifford/clifford_decompose_bm.py +2 -1
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +2 -3
- qiskit/synthesis/clifford/clifford_decompose_layers.py +1 -2
- qiskit/synthesis/evolution/__init__.py +0 -1
- qiskit/synthesis/evolution/lie_trotter.py +42 -16
- qiskit/synthesis/evolution/product_formula.py +238 -165
- qiskit/synthesis/evolution/qdrift.py +29 -36
- qiskit/synthesis/evolution/suzuki_trotter.py +27 -87
- qiskit/synthesis/multi_controlled/__init__.py +0 -1
- qiskit/synthesis/qft/qft_decompose_full.py +1 -19
- qiskit/synthesis/qft/qft_decompose_lnn.py +1 -2
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +1 -2
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +63 -4
- qiskit/synthesis/two_qubit/weyl.py +97 -0
- qiskit/synthesis/unitary/qsd.py +5 -5
- qiskit/transpiler/__init__.py +14 -21
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/passes/__init__.py +0 -2
- qiskit/transpiler/passes/basis/basis_translator.py +565 -9
- qiskit/transpiler/passes/basis/decompose.py +12 -45
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
- qiskit/transpiler/passes/calibration/pulse_gate.py +2 -4
- qiskit/transpiler/passes/calibration/rx_builder.py +7 -11
- qiskit/transpiler/passes/calibration/rzx_builder.py +30 -46
- qiskit/transpiler/passes/layout/disjoint_utils.py +13 -15
- qiskit/transpiler/passes/layout/sabre_layout.py +2 -7
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +0 -5
- qiskit/transpiler/passes/optimization/__init__.py +0 -1
- qiskit/transpiler/passes/optimization/collect_cliffords.py +3 -19
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +131 -48
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +2 -4
- qiskit/transpiler/passes/optimization/elide_permutations.py +32 -9
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +0 -2
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +11 -5
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +3 -7
- qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
- qiskit/transpiler/passes/scheduling/alap.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -2
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
- qiskit/transpiler/passes/scheduling/asap.py +1 -1
- qiskit/transpiler/passes/scheduling/base_scheduler.py +12 -14
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +4 -9
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +5 -16
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +1 -4
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +2 -6
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -9
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +99 -262
- qiskit/transpiler/passes/synthesis/hls_plugins.py +7 -638
- qiskit/transpiler/passes/synthesis/qubit_tracker.py +132 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -55
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +56 -2
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -5
- qiskit/transpiler/passes/utils/gate_direction.py +275 -12
- qiskit/transpiler/passes/utils/gates_basis.py +30 -7
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +1 -2
- qiskit/transpiler/passmanager_config.py +4 -22
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +14 -40
- qiskit/transpiler/preset_passmanagers/common.py +3 -5
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +42 -125
- qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
- qiskit/transpiler/target.py +16 -74
- qiskit/visualization/circuit/_utils.py +2 -2
- qiskit/visualization/circuit/circuit_visualization.py +2 -3
- qiskit/visualization/circuit/matplotlib.py +1 -1
- qiskit/visualization/dag_visualization.py +1 -1
- qiskit/visualization/pass_manager_visualization.py +14 -3
- qiskit/visualization/pulse_v2/interface.py +1 -3
- qiskit/visualization/timeline/core.py +2 -25
- qiskit/visualization/timeline/interface.py +0 -12
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/METADATA +19 -20
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/RECORD +347 -358
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/WHEEL +1 -1
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/entry_points.txt +0 -19
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +0 -150
- qiskit/circuit/twirling.py +0 -145
- qiskit/synthesis/arithmetic/__init__.py +0 -16
- qiskit/synthesis/arithmetic/adders/__init__.py +0 -17
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +0 -154
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +0 -103
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +0 -161
- qiskit/synthesis/arithmetic/multipliers/__init__.py +0 -16
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +0 -102
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +0 -99
- qiskit/synthesis/evolution/pauli_network.py +0 -80
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +0 -52
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +0 -69
- qiskit/utils/deprecate_pulse.py +0 -119
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/top_level.txt +0 -0
@@ -13,123 +13,15 @@
|
|
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
|
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
|
24
22
|
from .two_local import TwoLocal
|
25
23
|
|
26
24
|
|
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
|
-
|
133
25
|
class RealAmplitudes(TwoLocal):
|
134
26
|
r"""The real-amplitudes 2-local circuit.
|
135
27
|
|
@@ -143,8 +35,7 @@ class RealAmplitudes(TwoLocal):
|
|
143
35
|
For example a ``RealAmplitudes`` circuit with 2 repetitions on 3 qubits with ``'reverse_linear'``
|
144
36
|
entanglement is
|
145
37
|
|
146
|
-
..
|
147
|
-
|
38
|
+
.. parsed-literal::
|
148
39
|
┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐
|
149
40
|
┤ Ry(θ[0]) ├─░────────■───░─┤ Ry(θ[3]) ├─░────────■───░─┤ Ry(θ[6]) ├
|
150
41
|
├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤
|
@@ -167,7 +58,7 @@ class RealAmplitudes(TwoLocal):
|
|
167
58
|
Examples:
|
168
59
|
|
169
60
|
>>> ansatz = RealAmplitudes(3, reps=2) # create the circuit on 3 qubits
|
170
|
-
>>> print(ansatz
|
61
|
+
>>> print(ansatz)
|
171
62
|
┌──────────┐ ┌──────────┐ ┌──────────┐
|
172
63
|
q_0: ┤ Ry(θ[0]) ├──────────■──────┤ Ry(θ[3]) ├──────────■──────┤ Ry(θ[6]) ├
|
173
64
|
├──────────┤ ┌─┴─┐ ├──────────┤ ┌─┴─┐ ├──────────┤
|
@@ -176,7 +67,7 @@ class RealAmplitudes(TwoLocal):
|
|
176
67
|
q_2: ┤ Ry(θ[2]) ├┤ X ├┤ Ry(θ[5]) ├────────────┤ X ├┤ Ry(θ[8]) ├────────────
|
177
68
|
└──────────┘└───┘└──────────┘ └───┘└──────────┘
|
178
69
|
|
179
|
-
>>> ansatz = RealAmplitudes(3, entanglement='full', reps=2
|
70
|
+
>>> ansatz = RealAmplitudes(3, entanglement='full', reps=2) # it is the same unitary as above
|
180
71
|
>>> print(ansatz)
|
181
72
|
┌──────────┐ ┌──────────┐ ┌──────────┐
|
182
73
|
q_0: ┤ RY(θ[0]) ├──■────■──┤ RY(θ[3]) ├──────────────■────■──┤ RY(θ[6]) ├────────────
|
@@ -186,8 +77,7 @@ class RealAmplitudes(TwoLocal):
|
|
186
77
|
q_2: ┤ RY(θ[2]) ├─────┤ X ├───┤ X ├────┤ RY(θ[5]) ├─────┤ X ├───┤ X ├────┤ RY(θ[8]) ├
|
187
78
|
└──────────┘ └───┘ └───┘ └──────────┘ └───┘ └───┘ └──────────┘
|
188
79
|
|
189
|
-
>>> ansatz = RealAmplitudes(3, entanglement='linear', reps=2, insert_barriers=True
|
190
|
-
... flatten=True)
|
80
|
+
>>> ansatz = RealAmplitudes(3, entanglement='linear', reps=2, insert_barriers=True)
|
191
81
|
>>> qc = QuantumCircuit(3) # create a circuit and append the RY variational form
|
192
82
|
>>> qc.compose(ansatz, inplace=True)
|
193
83
|
>>> qc.draw()
|
@@ -199,8 +89,7 @@ class RealAmplitudes(TwoLocal):
|
|
199
89
|
q_2: ┤ RY(θ[2]) ├─░──────┤ X ├─░─┤ RY(θ[5]) ├─░──────┤ X ├─░─┤ RY(θ[8]) ├
|
200
90
|
└──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘
|
201
91
|
|
202
|
-
>>> ansatz = RealAmplitudes(4, reps=1, entanglement='circular', insert_barriers=True
|
203
|
-
... flatten=True)
|
92
|
+
>>> ansatz = RealAmplitudes(4, reps=1, entanglement='circular', insert_barriers=True)
|
204
93
|
>>> print(ansatz)
|
205
94
|
┌──────────┐ ░ ┌───┐ ░ ┌──────────┐
|
206
95
|
q_0: ┤ RY(θ[0]) ├─░─┤ X ├──■─────────────░─┤ RY(θ[4]) ├
|
@@ -213,7 +102,7 @@ class RealAmplitudes(TwoLocal):
|
|
213
102
|
└──────────┘ ░ └───┘ ░ └──────────┘
|
214
103
|
|
215
104
|
>>> ansatz = RealAmplitudes(4, reps=2, entanglement=[[0,3], [0,2]],
|
216
|
-
... skip_unentangled_qubits=True
|
105
|
+
... skip_unentangled_qubits=True)
|
217
106
|
>>> print(ansatz)
|
218
107
|
┌──────────┐ ┌──────────┐ ┌──────────┐
|
219
108
|
q_0: ┤ RY(θ[0]) ├──■───────■──────┤ RY(θ[3]) ├──■───────■──────┤ RY(θ[6]) ├
|
@@ -225,17 +114,8 @@ class RealAmplitudes(TwoLocal):
|
|
225
114
|
q_3: ┤ RY(θ[2]) ├┤ X ├┤ RY(θ[5]) ├────────────┤ X ├┤ RY(θ[8]) ├────────────
|
226
115
|
└──────────┘└───┘└──────────┘ └───┘└──────────┘
|
227
116
|
|
228
|
-
.. seealso::
|
229
|
-
|
230
|
-
The :func:`.real_amplitudes` function constructs a functionally equivalent circuit, but faster.
|
231
|
-
|
232
117
|
"""
|
233
118
|
|
234
|
-
@deprecate_func(
|
235
|
-
since="1.3",
|
236
|
-
additional_msg="Use the function qiskit.circuit.library.real_amplitudes instead.",
|
237
|
-
pending=True,
|
238
|
-
)
|
239
119
|
def __init__(
|
240
120
|
self,
|
241
121
|
num_qubits: int | None = None,
|
@@ -18,7 +18,6 @@ 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
|
22
21
|
|
23
22
|
from .n_local import NLocal
|
24
23
|
from ..standard_gates import get_standard_gate_name_mapping
|
@@ -77,7 +76,7 @@ class TwoLocal(NLocal):
|
|
77
76
|
Examples:
|
78
77
|
|
79
78
|
>>> two = TwoLocal(3, 'ry', 'cx', 'linear', reps=2, insert_barriers=True)
|
80
|
-
>>> print(two
|
79
|
+
>>> print(two) # decompose the layers into standard gates
|
81
80
|
┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐
|
82
81
|
q_0: ┤ Ry(θ[0]) ├─░───■────────░─┤ Ry(θ[3]) ├─░───■────────░─┤ Ry(θ[6]) ├
|
83
82
|
├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤
|
@@ -86,10 +85,10 @@ class TwoLocal(NLocal):
|
|
86
85
|
q_2: ┤ Ry(θ[2]) ├─░──────┤ X ├─░─┤ Ry(θ[5]) ├─░──────┤ X ├─░─┤ Ry(θ[8]) ├
|
87
86
|
└──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘
|
88
87
|
|
89
|
-
>>> two = TwoLocal(3, ['ry','rz'], 'cz', 'full', reps=1, insert_barriers=True
|
88
|
+
>>> two = TwoLocal(3, ['ry','rz'], 'cz', 'full', reps=1, insert_barriers=True)
|
90
89
|
>>> qc = QuantumCircuit(3)
|
91
90
|
>>> qc &= two
|
92
|
-
>>> print(qc.draw())
|
91
|
+
>>> print(qc.decompose().draw())
|
93
92
|
┌──────────┐┌──────────┐ ░ ░ ┌──────────┐ ┌──────────┐
|
94
93
|
q_0: ┤ Ry(θ[0]) ├┤ Rz(θ[3]) ├─░──■──■─────░─┤ Ry(θ[6]) ├─┤ Rz(θ[9]) ├
|
95
94
|
├──────────┤├──────────┤ ░ │ │ ░ ├──────────┤┌┴──────────┤
|
@@ -99,7 +98,7 @@ class TwoLocal(NLocal):
|
|
99
98
|
└──────────┘└──────────┘ ░ ░ └──────────┘└───────────┘
|
100
99
|
|
101
100
|
>>> entangler_map = [[0, 1], [1, 2], [2, 0]] # circular entanglement for 3 qubits
|
102
|
-
>>> two = TwoLocal(3, 'x', 'crx', entangler_map, reps=1
|
101
|
+
>>> two = TwoLocal(3, 'x', 'crx', entangler_map, reps=1)
|
103
102
|
>>> print(two) # note: no barriers inserted this time!
|
104
103
|
┌───┐ ┌──────────┐┌───┐
|
105
104
|
q_0: |0>┤ X ├─────■───────────────────────┤ Rx(θ[2]) ├┤ X ├
|
@@ -110,9 +109,9 @@ class TwoLocal(NLocal):
|
|
110
109
|
└───┘ └──────────┘ └───┘
|
111
110
|
|
112
111
|
>>> entangler_map = [[0, 3], [0, 2]] # entangle the first and last two-way
|
113
|
-
>>> two = TwoLocal(4, [], 'cry', entangler_map, reps=1
|
112
|
+
>>> two = TwoLocal(4, [], 'cry', entangler_map, reps=1)
|
114
113
|
>>> circuit = two.compose(two)
|
115
|
-
>>> print(circuit.draw()) # note, that the parameters are the same!
|
114
|
+
>>> print(circuit.decompose().draw()) # note, that the parameters are the same!
|
116
115
|
q_0: ─────■───────────■───────────■───────────■──────
|
117
116
|
│ │ │ │
|
118
117
|
q_1: ─────┼───────────┼───────────┼───────────┼──────
|
@@ -124,8 +123,7 @@ class TwoLocal(NLocal):
|
|
124
123
|
|
125
124
|
>>> layer_1 = [(0, 1), (0, 2)]
|
126
125
|
>>> layer_2 = [(1, 2)]
|
127
|
-
>>> two = TwoLocal(3, 'x', 'cx', [layer_1, layer_2], reps=2, insert_barriers=True
|
128
|
-
... flatten=True)
|
126
|
+
>>> two = TwoLocal(3, 'x', 'cx', [layer_1, layer_2], reps=2, insert_barriers=True)
|
129
127
|
>>> print(two)
|
130
128
|
┌───┐ ░ ░ ┌───┐ ░ ░ ┌───┐
|
131
129
|
q_0: ┤ X ├─░───■────■───░─┤ X ├─░───────░─┤ X ├
|
@@ -137,11 +135,6 @@ class TwoLocal(NLocal):
|
|
137
135
|
|
138
136
|
"""
|
139
137
|
|
140
|
-
@deprecate_func(
|
141
|
-
since="1.3",
|
142
|
-
additional_msg="Use the function qiskit.circuit.library.n_local instead.",
|
143
|
-
pending=True,
|
144
|
-
)
|
145
138
|
def __init__(
|
146
139
|
self,
|
147
140
|
num_qubits: int | None = None,
|
@@ -16,7 +16,6 @@ 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
|
20
19
|
|
21
20
|
|
22
21
|
class UnitaryOverlap(QuantumCircuit):
|
@@ -42,13 +41,13 @@ class UnitaryOverlap(QuantumCircuit):
|
|
42
41
|
from qiskit.circuit.library import EfficientSU2, UnitaryOverlap
|
43
42
|
from qiskit.primitives import Sampler
|
44
43
|
|
45
|
-
# get two circuit to prepare states of which we
|
44
|
+
# get two circuit to prepare states of which we comput the overlap
|
46
45
|
circuit = EfficientSU2(2, reps=1)
|
47
46
|
unitary1 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
|
48
47
|
unitary2 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
|
49
48
|
|
50
49
|
# create the overlap circuit
|
51
|
-
overlap =
|
50
|
+
overlap = UnitaryOverap(unitary1, unitary2)
|
52
51
|
|
53
52
|
# sample from the overlap
|
54
53
|
sampler = Sampler(options={"shots": 100})
|
@@ -59,11 +58,6 @@ class UnitaryOverlap(QuantumCircuit):
|
|
59
58
|
|
60
59
|
"""
|
61
60
|
|
62
|
-
@deprecate_func(
|
63
|
-
since="1.3",
|
64
|
-
additional_msg="Use qiskit.circuit.library.unitary_overlap instead.",
|
65
|
-
pending=True,
|
66
|
-
)
|
67
61
|
def __init__(
|
68
62
|
self,
|
69
63
|
unitary1: QuantumCircuit,
|
@@ -86,9 +80,30 @@ class UnitaryOverlap(QuantumCircuit):
|
|
86
80
|
CircuitError: Number of qubits in ``unitary1`` and ``unitary2`` does not match.
|
87
81
|
CircuitError: Inputs contain measurements and/or resets.
|
88
82
|
"""
|
89
|
-
|
90
|
-
|
91
|
-
|
83
|
+
# check inputs are valid
|
84
|
+
if unitary1.num_qubits != unitary2.num_qubits:
|
85
|
+
raise CircuitError(
|
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)
|
92
107
|
|
93
108
|
|
94
109
|
def _check_unitary(circuit):
|
@@ -100,83 +115,3 @@ def _check_unitary(circuit):
|
|
100
115
|
"One or more instructions cannot be converted to"
|
101
116
|
f' a gate. "{instruction.operation.name}" is not a gate instruction'
|
102
117
|
)
|
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,11 +14,10 @@
|
|
14
14
|
|
15
15
|
from __future__ import annotations
|
16
16
|
|
17
|
-
from typing import TYPE_CHECKING
|
17
|
+
from typing import Union, Optional, 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
|
22
21
|
from qiskit.circuit.parameterexpression import ParameterExpression
|
23
22
|
from qiskit.quantum_info import Pauli, SparsePauliOp
|
24
23
|
|
@@ -57,7 +56,6 @@ class PauliEvolutionGate(Gate):
|
|
57
56
|
|
58
57
|
X = SparsePauliOp("X")
|
59
58
|
Z = SparsePauliOp("Z")
|
60
|
-
I = SparsePauliOp("I")
|
61
59
|
|
62
60
|
# build the evolution gate
|
63
61
|
operator = (Z ^ Z) - 0.1 * (X ^ I)
|
@@ -86,10 +84,10 @@ class PauliEvolutionGate(Gate):
|
|
86
84
|
|
87
85
|
def __init__(
|
88
86
|
self,
|
89
|
-
operator
|
90
|
-
time:
|
91
|
-
label: str
|
92
|
-
synthesis: EvolutionSynthesis
|
87
|
+
operator,
|
88
|
+
time: Union[int, float, ParameterExpression] = 1.0,
|
89
|
+
label: Optional[str] = None,
|
90
|
+
synthesis: Optional[EvolutionSynthesis] = None,
|
93
91
|
) -> None:
|
94
92
|
"""
|
95
93
|
Args:
|
@@ -110,23 +108,21 @@ class PauliEvolutionGate(Gate):
|
|
110
108
|
else:
|
111
109
|
operator = _to_sparse_pauli_op(operator)
|
112
110
|
|
111
|
+
if synthesis is None:
|
112
|
+
from qiskit.synthesis.evolution import LieTrotter
|
113
|
+
|
114
|
+
synthesis = LieTrotter()
|
115
|
+
|
113
116
|
if label is None:
|
114
117
|
label = _get_default_label(operator)
|
115
118
|
|
116
119
|
num_qubits = operator[0].num_qubits if isinstance(operator, list) else operator.num_qubits
|
117
120
|
super().__init__(name="PauliEvolution", num_qubits=num_qubits, params=[time], label=label)
|
118
121
|
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
|
-
|
126
122
|
self.synthesis = synthesis
|
127
123
|
|
128
124
|
@property
|
129
|
-
def time(self) ->
|
125
|
+
def time(self) -> Union[float, ParameterExpression]:
|
130
126
|
"""Return the evolution time as stored in the gate parameters.
|
131
127
|
|
132
128
|
Returns:
|
@@ -135,7 +131,7 @@ class PauliEvolutionGate(Gate):
|
|
135
131
|
return self.params[0]
|
136
132
|
|
137
133
|
@time.setter
|
138
|
-
def time(self, time:
|
134
|
+
def time(self, time: Union[float, ParameterExpression]) -> None:
|
139
135
|
"""Set the evolution time.
|
140
136
|
|
141
137
|
Args:
|
@@ -147,7 +143,9 @@ class PauliEvolutionGate(Gate):
|
|
147
143
|
"""Unroll, where the default synthesis is matrix based."""
|
148
144
|
self.definition = self.synthesis.synthesize(self)
|
149
145
|
|
150
|
-
def validate_parameter(
|
146
|
+
def validate_parameter(
|
147
|
+
self, parameter: Union[int, float, ParameterExpression]
|
148
|
+
) -> Union[float, ParameterExpression]:
|
151
149
|
"""Gate parameters should be int, float, or ParameterExpression"""
|
152
150
|
if isinstance(parameter, int):
|
153
151
|
parameter = float(parameter)
|
@@ -12,11 +12,11 @@
|
|
12
12
|
|
13
13
|
"""Phase estimation circuit."""
|
14
14
|
|
15
|
-
from
|
15
|
+
from typing import Optional
|
16
16
|
|
17
17
|
from qiskit.circuit import QuantumCircuit, QuantumRegister
|
18
|
-
|
19
|
-
from
|
18
|
+
|
19
|
+
from .basis_change import QFT
|
20
20
|
|
21
21
|
|
22
22
|
class PhaseEstimation(QuantumCircuit):
|
@@ -49,16 +49,11 @@ 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
|
-
)
|
57
52
|
def __init__(
|
58
53
|
self,
|
59
54
|
num_evaluation_qubits: int,
|
60
55
|
unitary: QuantumCircuit,
|
61
|
-
iqft: QuantumCircuit
|
56
|
+
iqft: Optional[QuantumCircuit] = None,
|
62
57
|
name: str = "QPE",
|
63
58
|
) -> None:
|
64
59
|
"""
|
@@ -102,74 +97,3 @@ class PhaseEstimation(QuantumCircuit):
|
|
102
97
|
|
103
98
|
super().__init__(*circuit.qregs, name=circuit.name)
|
104
99
|
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
|