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
@@ -14,121 +14,18 @@
|
|
14
14
|
|
15
15
|
from __future__ import annotations
|
16
16
|
import typing
|
17
|
-
from collections.abc import Callable
|
17
|
+
from collections.abc import Callable
|
18
18
|
|
19
19
|
from numpy import pi
|
20
20
|
|
21
|
-
from qiskit.circuit import QuantumCircuit
|
21
|
+
from qiskit.circuit import QuantumCircuit
|
22
22
|
from qiskit.circuit.library.standard_gates import RYGate, RZGate, CXGate
|
23
|
-
from qiskit.utils.deprecation import deprecate_func
|
24
|
-
from .n_local import n_local, BlockEntanglement
|
25
23
|
from .two_local import TwoLocal
|
26
24
|
|
27
25
|
if typing.TYPE_CHECKING:
|
28
26
|
import qiskit # pylint: disable=cyclic-import
|
29
27
|
|
30
28
|
|
31
|
-
def efficient_su2(
|
32
|
-
num_qubits: int,
|
33
|
-
su2_gates: str | Gate | Iterable[str | Gate] | None = None,
|
34
|
-
entanglement: (
|
35
|
-
BlockEntanglement
|
36
|
-
| Iterable[BlockEntanglement]
|
37
|
-
| Callable[[int], BlockEntanglement | Iterable[BlockEntanglement]]
|
38
|
-
) = "reverse_linear",
|
39
|
-
reps: int = 3,
|
40
|
-
skip_unentangled_qubits: bool = False,
|
41
|
-
skip_final_rotation_layer: bool = False,
|
42
|
-
parameter_prefix: str = "θ",
|
43
|
-
insert_barriers: bool = False,
|
44
|
-
name: str = "EfficientSU2",
|
45
|
-
):
|
46
|
-
r"""The hardware-efficient :math:`SU(2)` 2-local circuit.
|
47
|
-
|
48
|
-
The ``efficient_su2`` circuit consists of layers of single qubit operations spanned by
|
49
|
-
:math:`SU(2)` and CX entanglements. This is a heuristic pattern that can be used to prepare trial
|
50
|
-
wave functions for variational quantum algorithms or classification circuit for machine learning.
|
51
|
-
|
52
|
-
:math:`SU(2)` is the special unitary group of degree 2, its elements are :math:`2 \times 2`
|
53
|
-
unitary matrices with determinant 1, such as the Pauli rotation gates.
|
54
|
-
|
55
|
-
On 3 qubits and using the Pauli :math:`Y` and :math:`Z` rotations as single qubit gates, the
|
56
|
-
this circuit is represented by:
|
57
|
-
|
58
|
-
.. parsed-literal::
|
59
|
-
|
60
|
-
┌──────────┐┌──────────┐ ░ ░ ░ ┌───────────┐┌───────────┐
|
61
|
-
┤ RY(θ[0]) ├┤ RZ(θ[3]) ├─░────────■───░─ ... ─░─┤ RY(θ[12]) ├┤ RZ(θ[15]) ├
|
62
|
-
├──────────┤├──────────┤ ░ ┌─┴─┐ ░ ░ ├───────────┤├───────────┤
|
63
|
-
┤ RY(θ[1]) ├┤ RZ(θ[4]) ├─░───■──┤ X ├─░─ ... ─░─┤ RY(θ[13]) ├┤ RZ(θ[16]) ├
|
64
|
-
├──────────┤├──────────┤ ░ ┌─┴─┐└───┘ ░ ░ ├───────────┤├───────────┤
|
65
|
-
┤ RY(θ[2]) ├┤ RZ(θ[5]) ├─░─┤ X ├──────░─ ... ─░─┤ RY(θ[14]) ├┤ RZ(θ[17]) ├
|
66
|
-
└──────────┘└──────────┘ ░ └───┘ ░ ░ └───────────┘└───────────┘
|
67
|
-
|
68
|
-
Examples:
|
69
|
-
|
70
|
-
Per default, the ``"reverse_linear"`` entanglement is used, which, in the case of
|
71
|
-
CX gates, is equivalent to an all-to-all entanglement:
|
72
|
-
|
73
|
-
.. plot::
|
74
|
-
:include-source:
|
75
|
-
:context:
|
76
|
-
|
77
|
-
from qiskit.circuit.library import efficient_su2
|
78
|
-
|
79
|
-
circuit = efficient_su2(3, reps=1)
|
80
|
-
circuit.draw("mpl")
|
81
|
-
|
82
|
-
To specify which SU(2) gates should be used in the rotation layer, we can set the
|
83
|
-
``su2_gates`` argument. In addition, we can change the entanglement structure.
|
84
|
-
For example:
|
85
|
-
|
86
|
-
.. plot::
|
87
|
-
:include-source:
|
88
|
-
:context:
|
89
|
-
|
90
|
-
circuit = efficient_su2(4, su2_gates=["rx", "y"], entanglement="circular", reps=1)
|
91
|
-
circuit.draw("mpl")
|
92
|
-
|
93
|
-
Args:
|
94
|
-
num_qubits: The number of qubits.
|
95
|
-
su2_gates: The :math:`SU(2)` single qubit gates to apply in single qubit gate layers.
|
96
|
-
If only one gate is provided, the same gate is applied to each qubit.
|
97
|
-
If a list of gates is provided, all gates are applied to each qubit in the provided
|
98
|
-
order.
|
99
|
-
reps: Specifies how often the structure of a rotation layer followed by an entanglement
|
100
|
-
layer is repeated.
|
101
|
-
entanglement: The indices specifying on which qubits the input blocks act.
|
102
|
-
See :func:`.n_local` for detailed information.
|
103
|
-
skip_final_rotation_layer: Whether a final rotation layer is added to the circuit.
|
104
|
-
skip_unentangled_qubits: If ``True``, the rotation gates act only on qubits that
|
105
|
-
are entangled. If ``False``, the rotation gates act on all qubits.
|
106
|
-
parameter_prefix: The name of the free parameters.
|
107
|
-
insert_barriers: If True, barriers are inserted in between each layer. If False,
|
108
|
-
no barriers are inserted.
|
109
|
-
name: The name of the circuit.
|
110
|
-
|
111
|
-
Returns:
|
112
|
-
An efficient-SU(2) circuit.
|
113
|
-
"""
|
114
|
-
if su2_gates is None:
|
115
|
-
su2_gates = ["ry", "rz"]
|
116
|
-
|
117
|
-
return n_local(
|
118
|
-
num_qubits,
|
119
|
-
su2_gates,
|
120
|
-
["cx"],
|
121
|
-
entanglement,
|
122
|
-
reps,
|
123
|
-
insert_barriers,
|
124
|
-
parameter_prefix,
|
125
|
-
True,
|
126
|
-
skip_final_rotation_layer,
|
127
|
-
skip_unentangled_qubits,
|
128
|
-
name,
|
129
|
-
)
|
130
|
-
|
131
|
-
|
132
29
|
class EfficientSU2(TwoLocal):
|
133
30
|
r"""The hardware efficient SU(2) 2-local circuit.
|
134
31
|
|
@@ -142,7 +39,7 @@ class EfficientSU2(TwoLocal):
|
|
142
39
|
On 3 qubits and using the Pauli :math:`Y` and :math:`Z` su2_gates as single qubit gates, the
|
143
40
|
hardware efficient SU(2) circuit is represented by:
|
144
41
|
|
145
|
-
..
|
42
|
+
.. parsed-literal::
|
146
43
|
|
147
44
|
┌──────────┐┌──────────┐ ░ ░ ░ ┌───────────┐┌───────────┐
|
148
45
|
┤ RY(θ[0]) ├┤ RZ(θ[3]) ├─░────────■───░─ ... ─░─┤ RY(θ[12]) ├┤ RZ(θ[15]) ├
|
@@ -158,7 +55,7 @@ class EfficientSU2(TwoLocal):
|
|
158
55
|
Examples:
|
159
56
|
|
160
57
|
>>> circuit = EfficientSU2(3, reps=1)
|
161
|
-
>>> print(circuit
|
58
|
+
>>> print(circuit)
|
162
59
|
┌──────────┐┌──────────┐ ┌──────────┐┌──────────┐
|
163
60
|
q_0: ┤ RY(θ[0]) ├┤ RZ(θ[3]) ├──■────■──┤ RY(θ[6]) ├┤ RZ(θ[9]) ├─────────────
|
164
61
|
├──────────┤├──────────┤┌─┴─┐ │ └──────────┘├──────────┤┌───────────┐
|
@@ -167,8 +64,7 @@ class EfficientSU2(TwoLocal):
|
|
167
64
|
q_2: ┤ RY(θ[2]) ├┤ RZ(θ[5]) ├─────┤ X ├───┤ X ├────┤ RY(θ[8]) ├┤ RZ(θ[11]) ├
|
168
65
|
└──────────┘└──────────┘ └───┘ └───┘ └──────────┘└───────────┘
|
169
66
|
|
170
|
-
>>> ansatz = EfficientSU2(4, su2_gates=['rx', 'y'], entanglement='circular', reps=1
|
171
|
-
... flatten=True)
|
67
|
+
>>> ansatz = EfficientSU2(4, su2_gates=['rx', 'y'], entanglement='circular', reps=1)
|
172
68
|
>>> qc = QuantumCircuit(4) # create a circuit and append the RY variational form
|
173
69
|
>>> qc.compose(ansatz, inplace=True)
|
174
70
|
>>> qc.draw()
|
@@ -182,17 +78,8 @@ class EfficientSU2(TwoLocal):
|
|
182
78
|
q_3: ┤ RX(θ[3]) ├┤ Y ├──■──────────────────────┤ X ├────┤ RX(θ[7]) ├┤ Y ├
|
183
79
|
└──────────┘└───┘ └───┘ └──────────┘└───┘
|
184
80
|
|
185
|
-
.. seealso::
|
186
|
-
|
187
|
-
The :func:`.efficient_su2` function constructs a functionally equivalent circuit, but faster.
|
188
|
-
|
189
81
|
"""
|
190
82
|
|
191
|
-
@deprecate_func(
|
192
|
-
since="1.3",
|
193
|
-
additional_msg="Use the function qiskit.circuit.library.efficient_su2 instead.",
|
194
|
-
pending=True,
|
195
|
-
)
|
196
83
|
def __init__(
|
197
84
|
self,
|
198
85
|
num_qubits: int | None = None,
|
@@ -15,263 +15,16 @@
|
|
15
15
|
from __future__ import annotations
|
16
16
|
from collections.abc import Sequence
|
17
17
|
|
18
|
-
import typing
|
19
|
-
import warnings
|
20
|
-
import itertools
|
21
18
|
import numpy as np
|
22
19
|
|
23
20
|
from qiskit.circuit.library.pauli_evolution import PauliEvolutionGate
|
24
21
|
from qiskit.circuit.parameter import Parameter
|
25
|
-
from qiskit.circuit.parametervector import ParameterVector
|
26
22
|
from qiskit.circuit.quantumregister import QuantumRegister
|
27
23
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
28
24
|
from qiskit.quantum_info import Operator, Pauli, SparsePauliOp
|
29
|
-
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
30
|
-
|
31
|
-
from qiskit._accelerate.circuit_library import pauli_evolution
|
32
25
|
|
33
26
|
from .n_local import NLocal
|
34
27
|
|
35
|
-
if typing.TYPE_CHECKING:
|
36
|
-
from qiskit.synthesis.evolution import EvolutionSynthesis
|
37
|
-
|
38
|
-
|
39
|
-
def evolved_operator_ansatz(
|
40
|
-
operators: BaseOperator | Sequence[BaseOperator],
|
41
|
-
reps: int = 1,
|
42
|
-
evolution: EvolutionSynthesis | None = None,
|
43
|
-
insert_barriers: bool = False,
|
44
|
-
name: str = "EvolvedOps",
|
45
|
-
parameter_prefix: str | Sequence[str] = "t",
|
46
|
-
remove_identities: bool = True,
|
47
|
-
flatten: bool | None = None,
|
48
|
-
) -> QuantumCircuit:
|
49
|
-
r"""Construct an ansatz out of operator evolutions.
|
50
|
-
|
51
|
-
For a set of operators :math:`[O_1, ..., O_J]` and :math:`R` repetitions (``reps``), this circuit
|
52
|
-
is defined as
|
53
|
-
|
54
|
-
.. math::
|
55
|
-
|
56
|
-
\prod_{r=1}^{R} \left( \prod_{j=J}^1 e^{-i\theta_{j, r} O_j} \right)
|
57
|
-
|
58
|
-
where the exponentials :math:`exp(-i\theta O_j)` are expanded using the product formula
|
59
|
-
specified by ``evolution``.
|
60
|
-
|
61
|
-
Examples:
|
62
|
-
|
63
|
-
.. plot::
|
64
|
-
:include-source:
|
65
|
-
|
66
|
-
from qiskit.circuit.library import evolved_operator_ansatz
|
67
|
-
from qiskit.quantum_info import Pauli
|
68
|
-
|
69
|
-
ops = [Pauli("ZZI"), Pauli("IZZ"), Pauli("IXI")]
|
70
|
-
ansatz = evolved_operator_ansatz(ops, reps=3, insert_barriers=True)
|
71
|
-
ansatz.draw("mpl")
|
72
|
-
|
73
|
-
Args:
|
74
|
-
operators: The operators to evolve. Can be a single operator or a sequence thereof.
|
75
|
-
reps: The number of times to repeat the evolved operators.
|
76
|
-
evolution: A specification of which evolution synthesis to use for the
|
77
|
-
:class:`.PauliEvolutionGate`. Defaults to first order Trotterization. Note, that
|
78
|
-
operators of type :class:`.Operator` are evolved using the :class:`.HamiltonianGate`,
|
79
|
-
as there are no Hamiltonian terms to expand in Trotterization.
|
80
|
-
insert_barriers: Whether to insert barriers in between each evolution.
|
81
|
-
name: The name of the circuit.
|
82
|
-
parameter_prefix: Set the names of the circuit parameters. If a string, the same prefix
|
83
|
-
will be used for each parameters. Can also be a list to specify a prefix per
|
84
|
-
operator.
|
85
|
-
remove_identities: If ``True``, ignore identity operators (note that we do not check
|
86
|
-
:class:`.Operator` inputs). This will also remove parameters associated with identities.
|
87
|
-
flatten: If ``True``, a flat circuit is returned instead of nesting it inside multiple
|
88
|
-
layers of gate objects. Setting this to ``False`` is significantly less performant,
|
89
|
-
especially for parameter binding, but can be desirable for a cleaner visualization.
|
90
|
-
"""
|
91
|
-
if reps < 0:
|
92
|
-
raise ValueError("reps must be a non-negative integer.")
|
93
|
-
|
94
|
-
if isinstance(operators, BaseOperator):
|
95
|
-
operators = [operators]
|
96
|
-
elif len(operators) == 0:
|
97
|
-
return QuantumCircuit()
|
98
|
-
|
99
|
-
num_operators = len(operators)
|
100
|
-
if not isinstance(parameter_prefix, str):
|
101
|
-
if num_operators != len(parameter_prefix):
|
102
|
-
raise ValueError(
|
103
|
-
f"Mismatching number of operators ({len(operators)}) and parameter_prefix "
|
104
|
-
f"({len(parameter_prefix)})."
|
105
|
-
)
|
106
|
-
|
107
|
-
num_qubits = operators[0].num_qubits
|
108
|
-
if remove_identities:
|
109
|
-
operators, parameter_prefix = _remove_identities(operators, parameter_prefix)
|
110
|
-
|
111
|
-
if any(op.num_qubits != num_qubits for op in operators):
|
112
|
-
raise ValueError("Inconsistent numbers of qubits in the operators.")
|
113
|
-
|
114
|
-
# get the total number of parameters
|
115
|
-
if isinstance(parameter_prefix, str):
|
116
|
-
parameters = ParameterVector(parameter_prefix, reps * num_operators)
|
117
|
-
param_iter = iter(parameters)
|
118
|
-
else:
|
119
|
-
# this creates the parameter vectors per operator, e.g.
|
120
|
-
# [[a0, a1, a2, ...], [b0, b1, b2, ...], [c0, c1, c2, ...]]
|
121
|
-
# and turns them into an iterator
|
122
|
-
# a0 -> b0 -> c0 -> a1 -> b1 -> c1 -> a2 -> ...
|
123
|
-
per_operator = [ParameterVector(prefix, reps).params for prefix in parameter_prefix]
|
124
|
-
param_iter = itertools.chain.from_iterable(zip(*per_operator))
|
125
|
-
|
126
|
-
# fast, Rust-path
|
127
|
-
if (
|
128
|
-
flatten is not False # captures None and True
|
129
|
-
and evolution is None
|
130
|
-
and all(isinstance(op, SparsePauliOp) for op in operators)
|
131
|
-
):
|
132
|
-
sparse_labels = [op.to_sparse_list() for op in operators]
|
133
|
-
expanded_paulis = []
|
134
|
-
for _ in range(reps):
|
135
|
-
for term in sparse_labels:
|
136
|
-
param = next(param_iter)
|
137
|
-
expanded_paulis += [
|
138
|
-
(pauli, indices, 2 * coeff * param) for pauli, indices, coeff in term
|
139
|
-
]
|
140
|
-
|
141
|
-
data = pauli_evolution(num_qubits, expanded_paulis, insert_barriers, False)
|
142
|
-
circuit = QuantumCircuit._from_circuit_data(data, add_regs=True)
|
143
|
-
circuit.name = name
|
144
|
-
|
145
|
-
return circuit
|
146
|
-
|
147
|
-
# slower, Python-path
|
148
|
-
if evolution is None:
|
149
|
-
from qiskit.synthesis.evolution import LieTrotter
|
150
|
-
|
151
|
-
evolution = LieTrotter(insert_barriers=insert_barriers)
|
152
|
-
|
153
|
-
circuit = QuantumCircuit(num_qubits, name=name)
|
154
|
-
|
155
|
-
# pylint: disable=cyclic-import
|
156
|
-
from qiskit.circuit.library.hamiltonian_gate import HamiltonianGate
|
157
|
-
|
158
|
-
for rep in range(reps):
|
159
|
-
for i, op in enumerate(operators):
|
160
|
-
if isinstance(op, Operator):
|
161
|
-
gate = HamiltonianGate(op, next(param_iter))
|
162
|
-
if flatten:
|
163
|
-
warnings.warn(
|
164
|
-
"Cannot flatten the evolution of an Operator, flatten is set to "
|
165
|
-
"False for this operator."
|
166
|
-
)
|
167
|
-
flatten_operator = False
|
168
|
-
|
169
|
-
elif isinstance(op, BaseOperator):
|
170
|
-
gate = PauliEvolutionGate(op, next(param_iter), synthesis=evolution)
|
171
|
-
flatten_operator = flatten is True or flatten is None
|
172
|
-
else:
|
173
|
-
raise ValueError(f"Unsupported operator type: {type(op)}")
|
174
|
-
|
175
|
-
if flatten_operator:
|
176
|
-
circuit.compose(gate.definition, inplace=True)
|
177
|
-
else:
|
178
|
-
circuit.append(gate, circuit.qubits)
|
179
|
-
|
180
|
-
if insert_barriers and (rep < reps - 1 or i < num_operators - 1):
|
181
|
-
circuit.barrier()
|
182
|
-
|
183
|
-
return circuit
|
184
|
-
|
185
|
-
|
186
|
-
def hamiltonian_variational_ansatz(
|
187
|
-
hamiltonian: SparsePauliOp | Sequence[SparsePauliOp],
|
188
|
-
reps: int = 1,
|
189
|
-
insert_barriers: bool = False,
|
190
|
-
name: str = "HVA",
|
191
|
-
parameter_prefix: str = "t",
|
192
|
-
) -> QuantumCircuit:
|
193
|
-
r"""Construct a Hamiltonian variational ansatz.
|
194
|
-
|
195
|
-
For a Hamiltonian :math:`H = \sum_{k=1}^K H_k` where the terms :math:`H_k` consist of only
|
196
|
-
commuting Paulis, but the terms do not commute among each other :math:`[H_k, H_{k'}] \neq 0`, the
|
197
|
-
Hamiltonian variational ansatz (HVA) is
|
198
|
-
|
199
|
-
.. math::
|
200
|
-
|
201
|
-
\prod_{r=1}^{R} \left( \prod_{k=K}^1 e^{-i\theta_{k, r} H_k} \right)
|
202
|
-
|
203
|
-
where the exponentials :math:`exp(-i\theta H_k)` are implemented exactly [1, 2]. Note that this
|
204
|
-
differs from :func:`.evolved_operator_ansatz`, where no assumptions on the structure of the
|
205
|
-
operators are done.
|
206
|
-
|
207
|
-
The Hamiltonian can be passed as :class:`.SparsePauliOp`, in which case we split the Hamiltonian
|
208
|
-
into commuting terms :math:`\{H_k\}_k`. Note, that this may not be optimal and if the
|
209
|
-
minimal set of commuting terms is known it can be passed as sequence into this function.
|
210
|
-
|
211
|
-
Examples:
|
212
|
-
|
213
|
-
A single operator will be split into commuting terms automatically:
|
214
|
-
|
215
|
-
.. plot::
|
216
|
-
:include-source:
|
217
|
-
|
218
|
-
from qiskit.quantum_info import SparsePauliOp
|
219
|
-
from qiskit.circuit.library import hamiltonian_variational_ansatz
|
220
|
-
|
221
|
-
# this Hamiltonian will be split into the two terms [ZZI, IZZ] and [IXI]
|
222
|
-
hamiltonian = SparsePauliOp(["ZZI", "IZZ", "IXI"])
|
223
|
-
ansatz = hamiltonian_variational_ansatz(hamiltonian, reps=2)
|
224
|
-
ansatz.draw("mpl")
|
225
|
-
|
226
|
-
Alternatively, we can directly provide the terms:
|
227
|
-
|
228
|
-
.. plot::
|
229
|
-
:include-source:
|
230
|
-
|
231
|
-
from qiskit.quantum_info import SparsePauliOp
|
232
|
-
from qiskit.circuit.library import hamiltonian_variational_ansatz
|
233
|
-
|
234
|
-
zz = SparsePauliOp(["ZZI", "IZZ"])
|
235
|
-
x = SparsePauliOp(["IXI"])
|
236
|
-
ansatz = hamiltonian_variational_ansatz([zz, x], reps=2)
|
237
|
-
ansatz.draw("mpl")
|
238
|
-
|
239
|
-
|
240
|
-
Args:
|
241
|
-
hamiltonian: The Hamiltonian to evolve. If given as single operator, it will be split into
|
242
|
-
commuting terms. If a sequence of :class:`.SparsePauliOp`, then it is assumed that
|
243
|
-
each element consists of commuting terms, but the elements do not commute among each
|
244
|
-
other.
|
245
|
-
reps: The number of times to repeat the evolved operators.
|
246
|
-
insert_barriers: Whether to insert barriers in between each evolution.
|
247
|
-
name: The name of the circuit.
|
248
|
-
parameter_prefix: Set the names of the circuit parameters. If a string, the same prefix
|
249
|
-
will be used for each parameters. Can also be a list to specify a prefix per
|
250
|
-
operator.
|
251
|
-
|
252
|
-
References:
|
253
|
-
|
254
|
-
[1] D. Wecker et al. Progress towards practical quantum variational algorithms (2015)
|
255
|
-
`Phys Rev A 92, 042303 <https://journals.aps.org/pra/abstract/10.1103/PhysRevA.92.042303>`__
|
256
|
-
[2] R. Wiersema et al. Exploring entanglement and optimization within the Hamiltonian
|
257
|
-
Variational Ansatz (2020) `arXiv:2008.02941 <https://arxiv.org/abs/2008.02941>`__
|
258
|
-
|
259
|
-
"""
|
260
|
-
# If a single operator is given, check if it is a sum of operators (a SparsePauliOp),
|
261
|
-
# and split it into commuting terms. Otherwise treat it as single operator.
|
262
|
-
if isinstance(hamiltonian, SparsePauliOp):
|
263
|
-
hamiltonian = hamiltonian.group_commuting()
|
264
|
-
|
265
|
-
return evolved_operator_ansatz(
|
266
|
-
hamiltonian,
|
267
|
-
reps=reps,
|
268
|
-
evolution=None,
|
269
|
-
insert_barriers=insert_barriers,
|
270
|
-
name=name,
|
271
|
-
parameter_prefix=parameter_prefix,
|
272
|
-
flatten=True,
|
273
|
-
)
|
274
|
-
|
275
28
|
|
276
29
|
class EvolvedOperatorAnsatz(NLocal):
|
277
30
|
"""The evolved operator ansatz."""
|
@@ -501,15 +254,3 @@ def _is_pauli_identity(operator):
|
|
501
254
|
if isinstance(operator, Pauli):
|
502
255
|
return not np.any(np.logical_or(operator.x, operator.z))
|
503
256
|
return False
|
504
|
-
|
505
|
-
|
506
|
-
def _remove_identities(operators, prefixes):
|
507
|
-
identity_ops = {index for index, op in enumerate(operators) if _is_pauli_identity(op)}
|
508
|
-
|
509
|
-
if len(identity_ops) == 0:
|
510
|
-
return operators, prefixes
|
511
|
-
|
512
|
-
cleaned_ops = [op for i, op in enumerate(operators) if i not in identity_ops]
|
513
|
-
cleaned_prefix = [prefix for i, prefix in enumerate(prefixes) if i not in identity_ops]
|
514
|
-
|
515
|
-
return cleaned_ops, cleaned_prefix
|
@@ -13,127 +13,14 @@
|
|
13
13
|
"""The ExcitationPreserving 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
|
from numpy import pi
|
18
18
|
|
19
19
|
from qiskit.circuit import QuantumCircuit, Parameter
|
20
20
|
from qiskit.circuit.library.standard_gates import RZGate
|
21
|
-
from qiskit.utils.deprecation import deprecate_func
|
22
|
-
from .n_local import n_local, BlockEntanglement
|
23
21
|
from .two_local import TwoLocal
|
24
22
|
|
25
23
|
|
26
|
-
def excitation_preserving(
|
27
|
-
num_qubits: int,
|
28
|
-
mode: str = "iswap",
|
29
|
-
entanglement: (
|
30
|
-
BlockEntanglement
|
31
|
-
| Iterable[BlockEntanglement]
|
32
|
-
| Callable[[int], BlockEntanglement | Iterable[BlockEntanglement]]
|
33
|
-
) = "full",
|
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 = "ExcitationPreserving",
|
40
|
-
):
|
41
|
-
r"""The heuristic excitation-preserving wave function ansatz.
|
42
|
-
|
43
|
-
The ``excitation_preserving`` circuit preserves the ratio of :math:`|00\rangle`,
|
44
|
-
:math:`|01\rangle + |10\rangle` and :math:`|11\rangle` states. To this end, this circuit
|
45
|
-
uses two-qubit interactions of the form
|
46
|
-
|
47
|
-
.. math::
|
48
|
-
|
49
|
-
\newcommand{\rotationangle}{\theta/2}
|
50
|
-
|
51
|
-
\begin{pmatrix}
|
52
|
-
1 & 0 & 0 & 0 \\
|
53
|
-
0 & \cos\left(\rotationangle\right) & -i\sin\left(\rotationangle\right) & 0 \\
|
54
|
-
0 & -i\sin\left(\rotationangle\right) & \cos\left(\rotationangle\right) & 0 \\
|
55
|
-
0 & 0 & 0 & e^{-i\phi}
|
56
|
-
\end{pmatrix}
|
57
|
-
|
58
|
-
for the mode ``"fsim"`` or with :math:`e^{-i\phi} = 1` for the mode ``"iswap"``.
|
59
|
-
|
60
|
-
Note that other wave functions, such as UCC-ansatzes, are also excitation preserving.
|
61
|
-
However these can become complex quickly, while this heuristically motivated circuit follows
|
62
|
-
a simpler pattern.
|
63
|
-
|
64
|
-
This trial wave function consists of layers of :math:`Z` rotations with 2-qubit entanglements.
|
65
|
-
The entangling is creating using :math:`XX+YY` rotations and optionally a controlled-phase
|
66
|
-
gate for the mode ``"fsim"``.
|
67
|
-
|
68
|
-
Examples:
|
69
|
-
|
70
|
-
With linear entanglement, this circuit is given by:
|
71
|
-
|
72
|
-
.. plot::
|
73
|
-
:include-source:
|
74
|
-
:context:
|
75
|
-
|
76
|
-
from qiskit.circuit.library import excitation_preserving
|
77
|
-
|
78
|
-
ansatz = excitation_preserving(3, reps=1, insert_barriers=True, entanglement="linear")
|
79
|
-
ansatz.draw("mpl")
|
80
|
-
|
81
|
-
The entanglement structure can be explicitly specified with the ``entanglement``
|
82
|
-
argument. The ``"fsim"`` mode includes an additional parameterized :class:`.CPhaseGate`
|
83
|
-
in each block:
|
84
|
-
|
85
|
-
.. plot::
|
86
|
-
:include-source:
|
87
|
-
:context:
|
88
|
-
|
89
|
-
ansatz = excitation_preserving(3, reps=1, mode="fsim", entanglement=[[0, 2]])
|
90
|
-
ansatz.draw("mpl")
|
91
|
-
|
92
|
-
Args:
|
93
|
-
num_qubits: The number of qubits.
|
94
|
-
mode: Choose the entangler mode, can be `"iswap"` or `"fsim"`.
|
95
|
-
reps: Specifies how often the structure of a rotation layer followed by an entanglement
|
96
|
-
layer is repeated.
|
97
|
-
entanglement: The indices specifying on which qubits the input blocks act.
|
98
|
-
See :func:`.n_local` for detailed information.
|
99
|
-
skip_final_rotation_layer: Whether a final rotation layer is added to the circuit.
|
100
|
-
skip_unentangled_qubits: If ``True``, the rotation gates act only on qubits that
|
101
|
-
are entangled. If ``False``, the rotation gates act on all qubits.
|
102
|
-
parameter_prefix: The name of the free parameters.
|
103
|
-
insert_barriers: If True, barriers are inserted in between each layer. If False,
|
104
|
-
no barriers are inserted.
|
105
|
-
name: The name of the circuit.
|
106
|
-
|
107
|
-
Returns:
|
108
|
-
An excitation-preserving circuit.
|
109
|
-
"""
|
110
|
-
supported_modes = ["iswap", "fsim"]
|
111
|
-
if mode not in supported_modes:
|
112
|
-
raise ValueError(f"Unsupported mode {mode}, choose one of {supported_modes}")
|
113
|
-
|
114
|
-
theta = Parameter("θ")
|
115
|
-
swap = QuantumCircuit(2, name="Interaction")
|
116
|
-
swap.rxx(theta, 0, 1)
|
117
|
-
swap.ryy(theta, 0, 1)
|
118
|
-
if mode == "fsim":
|
119
|
-
phi = Parameter("φ")
|
120
|
-
swap.cp(phi, 0, 1)
|
121
|
-
|
122
|
-
return n_local(
|
123
|
-
num_qubits,
|
124
|
-
["rz"],
|
125
|
-
[swap.to_gate()],
|
126
|
-
entanglement,
|
127
|
-
reps,
|
128
|
-
insert_barriers,
|
129
|
-
parameter_prefix,
|
130
|
-
True,
|
131
|
-
skip_final_rotation_layer,
|
132
|
-
skip_unentangled_qubits,
|
133
|
-
name,
|
134
|
-
)
|
135
|
-
|
136
|
-
|
137
24
|
class ExcitationPreserving(TwoLocal):
|
138
25
|
r"""The heuristic excitation-preserving wave function ansatz.
|
139
26
|
|
@@ -170,7 +57,7 @@ class ExcitationPreserving(TwoLocal):
|
|
170
57
|
Examples:
|
171
58
|
|
172
59
|
>>> ansatz = ExcitationPreserving(3, reps=1, insert_barriers=True, entanglement='linear')
|
173
|
-
>>> print(ansatz
|
60
|
+
>>> print(ansatz) # show the circuit
|
174
61
|
┌──────────┐ ░ ┌────────────┐┌────────────┐ ░ ┌──────────┐
|
175
62
|
q_0: ┤ RZ(θ[0]) ├─░─┤0 ├┤0 ├─────────────────────────────░─┤ RZ(θ[5]) ├
|
176
63
|
├──────────┤ ░ │ RXX(θ[3]) ││ RYY(θ[3]) │┌────────────┐┌────────────┐ ░ ├──────────┤
|
@@ -179,10 +66,10 @@ class ExcitationPreserving(TwoLocal):
|
|
179
66
|
q_2: ┤ RZ(θ[2]) ├─░─────────────────────────────┤1 ├┤1 ├─░─┤ RZ(θ[7]) ├
|
180
67
|
└──────────┘ ░ └────────────┘└────────────┘ ░ └──────────┘
|
181
68
|
|
182
|
-
>>> ansatz = ExcitationPreserving(2, reps=1
|
69
|
+
>>> ansatz = ExcitationPreserving(2, reps=1)
|
183
70
|
>>> qc = QuantumCircuit(2) # create a circuit and append the RY variational form
|
184
71
|
>>> qc.cry(0.2, 0, 1) # do some previous operation
|
185
|
-
>>> qc.compose(ansatz, inplace=True) # add the
|
72
|
+
>>> qc.compose(ansatz, inplace=True) # add the swaprz
|
186
73
|
>>> qc.draw()
|
187
74
|
┌──────────┐┌────────────┐┌────────────┐┌──────────┐
|
188
75
|
q_0: ─────■─────┤ RZ(θ[0]) ├┤0 ├┤0 ├┤ RZ(θ[3]) ├
|
@@ -191,8 +78,8 @@ class ExcitationPreserving(TwoLocal):
|
|
191
78
|
└─────────┘└──────────┘└────────────┘└────────────┘└──────────┘
|
192
79
|
|
193
80
|
>>> ansatz = ExcitationPreserving(3, reps=1, mode='fsim', entanglement=[[0,2]],
|
194
|
-
... insert_barriers=True
|
195
|
-
>>> print(ansatz
|
81
|
+
... insert_barriers=True)
|
82
|
+
>>> print(ansatz)
|
196
83
|
┌──────────┐ ░ ┌────────────┐┌────────────┐ ░ ┌──────────┐
|
197
84
|
q_0: ┤ RZ(θ[0]) ├─░─┤0 ├┤0 ├─■──────░─┤ RZ(θ[5]) ├
|
198
85
|
├──────────┤ ░ │ ││ │ │ ░ ├──────────┤
|
@@ -200,19 +87,8 @@ class ExcitationPreserving(TwoLocal):
|
|
200
87
|
├──────────┤ ░ │ ││ │ │θ[4] ░ ├──────────┤
|
201
88
|
q_2: ┤ RZ(θ[2]) ├─░─┤1 ├┤1 ├─■──────░─┤ RZ(θ[7]) ├
|
202
89
|
└──────────┘ ░ └────────────┘└────────────┘ ░ └──────────┘
|
203
|
-
|
204
|
-
.. seealso::
|
205
|
-
|
206
|
-
The :func:`.excitation_preserving` function constructs a functionally equivalent circuit,
|
207
|
-
but faster.
|
208
|
-
|
209
90
|
"""
|
210
91
|
|
211
|
-
@deprecate_func(
|
212
|
-
since="1.3",
|
213
|
-
additional_msg="Use the function qiskit.circuit.library.excitation_preserving instead.",
|
214
|
-
pending=True,
|
215
|
-
)
|
216
92
|
def __init__(
|
217
93
|
self,
|
218
94
|
num_qubits: int | None = None,
|