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
@@ -0,0 +1,118 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Second-order Pauli-Z expansion circuit."""
|
14
|
+
|
15
|
+
from typing import Callable, List, Union, Optional, Dict, Tuple
|
16
|
+
import numpy as np
|
17
|
+
from .pauli_feature_map import PauliFeatureMap
|
18
|
+
|
19
|
+
|
20
|
+
class ZZFeatureMap(PauliFeatureMap):
|
21
|
+
r"""Second-order Pauli-Z evolution circuit.
|
22
|
+
|
23
|
+
For 3 qubits and 1 repetition and linear entanglement the circuit is represented by:
|
24
|
+
|
25
|
+
.. parsed-literal::
|
26
|
+
|
27
|
+
┌───┐┌─────────────────┐
|
28
|
+
┤ H ├┤ U1(2.0*φ(x[0])) ├──■────────────────────────────■────────────────────────────────────
|
29
|
+
├───┤├─────────────────┤┌─┴─┐┌──────────────────────┐┌─┴─┐
|
30
|
+
┤ H ├┤ U1(2.0*φ(x[1])) ├┤ X ├┤ U1(2.0*φ(x[0],x[1])) ├┤ X ├──■────────────────────────────■──
|
31
|
+
├───┤├─────────────────┤└───┘└──────────────────────┘└───┘┌─┴─┐┌──────────────────────┐┌─┴─┐
|
32
|
+
┤ H ├┤ U1(2.0*φ(x[2])) ├──────────────────────────────────┤ X ├┤ U1(2.0*φ(x[1],x[2])) ├┤ X ├
|
33
|
+
└───┘└─────────────────┘ └───┘└──────────────────────┘└───┘
|
34
|
+
|
35
|
+
where :math:`\varphi` is a classical non-linear function, which defaults to :math:`\varphi(x) = x`
|
36
|
+
if and :math:`\varphi(x,y) = (\pi - x)(\pi - y)`.
|
37
|
+
|
38
|
+
Examples:
|
39
|
+
|
40
|
+
>>> from qiskit.circuit.library import ZZFeatureMap
|
41
|
+
>>> prep = ZZFeatureMap(2, reps=1)
|
42
|
+
>>> print(prep)
|
43
|
+
┌───┐┌──────────────┐
|
44
|
+
q_0: ┤ H ├┤ U1(2.0*x[0]) ├──■───────────────────────────────────────■──
|
45
|
+
├───┤├──────────────┤┌─┴─┐┌─────────────────────────────────┐┌─┴─┐
|
46
|
+
q_1: ┤ H ├┤ U1(2.0*x[1]) ├┤ X ├┤ U1(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
|
47
|
+
└───┘└──────────────┘└───┘└─────────────────────────────────┘└───┘
|
48
|
+
|
49
|
+
>>> from qiskit.circuit.library import EfficientSU2
|
50
|
+
>>> classifier = ZZFeatureMap(3) + EfficientSU2(3)
|
51
|
+
>>> classifier.num_parameters
|
52
|
+
15
|
53
|
+
>>> classifier.parameters # 'x' for the data preparation, 'θ' for the SU2 parameters
|
54
|
+
ParameterView([
|
55
|
+
ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
|
56
|
+
ParameterVectorElement(x[2]), ParameterVectorElement(θ[0]),
|
57
|
+
ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]),
|
58
|
+
ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]),
|
59
|
+
ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]),
|
60
|
+
ParameterVectorElement(θ[7]), ParameterVectorElement(θ[8]),
|
61
|
+
ParameterVectorElement(θ[9]), ParameterVectorElement(θ[10]),
|
62
|
+
ParameterVectorElement(θ[11]), ParameterVectorElement(θ[12]),
|
63
|
+
ParameterVectorElement(θ[13]), ParameterVectorElement(θ[14]),
|
64
|
+
ParameterVectorElement(θ[15]), ParameterVectorElement(θ[16]),
|
65
|
+
ParameterVectorElement(θ[17]), ParameterVectorElement(θ[18]),
|
66
|
+
ParameterVectorElement(θ[19]), ParameterVectorElement(θ[20]),
|
67
|
+
ParameterVectorElement(θ[21]), ParameterVectorElement(θ[22]),
|
68
|
+
ParameterVectorElement(θ[23])
|
69
|
+
])
|
70
|
+
>>> classifier.count_ops()
|
71
|
+
OrderedDict([('ZZFeatureMap', 1), ('EfficientSU2', 1)])
|
72
|
+
"""
|
73
|
+
|
74
|
+
def __init__(
|
75
|
+
self,
|
76
|
+
feature_dimension: int,
|
77
|
+
reps: int = 2,
|
78
|
+
entanglement: Union[
|
79
|
+
str,
|
80
|
+
Dict[int, List[Tuple[int]]],
|
81
|
+
Callable[[int], Union[str, Dict[int, List[Tuple[int]]]]],
|
82
|
+
] = "full",
|
83
|
+
data_map_func: Optional[Callable[[np.ndarray], float]] = None,
|
84
|
+
parameter_prefix: str = "x",
|
85
|
+
insert_barriers: bool = False,
|
86
|
+
name: str = "ZZFeatureMap",
|
87
|
+
) -> None:
|
88
|
+
"""Create a new second-order Pauli-Z expansion.
|
89
|
+
|
90
|
+
Args:
|
91
|
+
feature_dimension: Number of features.
|
92
|
+
reps: The number of repeated circuits, has a min. value of 1.
|
93
|
+
entanglement: Specifies the entanglement structure. Refer to
|
94
|
+
:class:`~qiskit.circuit.library.PauliFeatureMap` for detail.
|
95
|
+
data_map_func: A mapping function for data x.
|
96
|
+
parameter_prefix: The prefix used if default parameters are generated.
|
97
|
+
insert_barriers: If True, barriers are inserted in between the evolution instructions
|
98
|
+
and hadamard layers.
|
99
|
+
|
100
|
+
Raises:
|
101
|
+
ValueError: If the feature dimension is smaller than 2.
|
102
|
+
"""
|
103
|
+
if feature_dimension < 2:
|
104
|
+
raise ValueError(
|
105
|
+
"The ZZFeatureMap contains 2-local interactions and cannot be "
|
106
|
+
f"defined for less than 2 qubits. You provided {feature_dimension}."
|
107
|
+
)
|
108
|
+
|
109
|
+
super().__init__(
|
110
|
+
feature_dimension=feature_dimension,
|
111
|
+
reps=reps,
|
112
|
+
entanglement=entanglement,
|
113
|
+
paulis=["Z", "ZZ"],
|
114
|
+
data_map_func=data_map_func,
|
115
|
+
parameter_prefix=parameter_prefix,
|
116
|
+
insert_barriers=insert_barriers,
|
117
|
+
name=name,
|
118
|
+
)
|
@@ -12,14 +12,13 @@
|
|
12
12
|
|
13
13
|
"""Fourier checking circuit."""
|
14
14
|
|
15
|
-
from
|
16
|
-
import math
|
15
|
+
from typing import List
|
17
16
|
|
17
|
+
import math
|
18
18
|
from qiskit.circuit import QuantumCircuit
|
19
19
|
from qiskit.circuit.exceptions import CircuitError
|
20
|
-
from qiskit.utils.deprecation import deprecate_func
|
21
20
|
|
22
|
-
from .generalized_gates.diagonal import Diagonal
|
21
|
+
from .generalized_gates.diagonal import Diagonal
|
23
22
|
|
24
23
|
|
25
24
|
class FourierChecking(QuantumCircuit):
|
@@ -53,12 +52,7 @@ class FourierChecking(QuantumCircuit):
|
|
53
52
|
`arXiv:1411.5729 <https://arxiv.org/abs/1411.5729>`_
|
54
53
|
"""
|
55
54
|
|
56
|
-
|
57
|
-
since="1.3",
|
58
|
-
additional_msg="Use qiskit.circuit.library.fourier_checking instead.",
|
59
|
-
pending=True,
|
60
|
-
)
|
61
|
-
def __init__(self, f: Sequence[int], g: Sequence[int]) -> None:
|
55
|
+
def __init__(self, f: List[int], g: List[int]) -> None:
|
62
56
|
"""Create Fourier checking circuit.
|
63
57
|
|
64
58
|
Args:
|
@@ -87,72 +81,17 @@ class FourierChecking(QuantumCircuit):
|
|
87
81
|
"{1, -1}."
|
88
82
|
)
|
89
83
|
|
90
|
-
|
91
|
-
|
92
|
-
# of Diagonal circuits.
|
93
|
-
circuit = QuantumCircuit(int(num_qubits), name=f"fc: {f}, {g}")
|
84
|
+
circuit = QuantumCircuit(num_qubits, name=f"fc: {f}, {g}")
|
85
|
+
|
94
86
|
circuit.h(circuit.qubits)
|
87
|
+
|
95
88
|
circuit.compose(Diagonal(f), inplace=True)
|
89
|
+
|
96
90
|
circuit.h(circuit.qubits)
|
91
|
+
|
97
92
|
circuit.compose(Diagonal(g), inplace=True)
|
93
|
+
|
98
94
|
circuit.h(circuit.qubits)
|
95
|
+
|
99
96
|
super().__init__(*circuit.qregs, name=circuit.name)
|
100
97
|
self.compose(circuit.to_gate(), qubits=self.qubits, inplace=True)
|
101
|
-
|
102
|
-
|
103
|
-
def fourier_checking(f: Sequence[int], g: Sequence[int]) -> QuantumCircuit:
|
104
|
-
"""Fourier checking circuit.
|
105
|
-
|
106
|
-
The circuit for the Fourier checking algorithm, introduced in [1],
|
107
|
-
involves a layer of Hadamards, the function :math:`f`, another layer of
|
108
|
-
Hadamards, the function :math:`g`, followed by a final layer of Hadamards.
|
109
|
-
The functions :math:`f` and :math:`g` are classical functions realized
|
110
|
-
as phase oracles (diagonal operators with {-1, 1} on the diagonal).
|
111
|
-
|
112
|
-
The probability of observing the all-zeros string is :math:`p(f,g)`.
|
113
|
-
The algorithm solves the promise Fourier checking problem,
|
114
|
-
which decides if f is correlated with the Fourier transform
|
115
|
-
of g, by testing if :math:`p(f,g) <= 0.01` or :math:`p(f,g) >= 0.05`,
|
116
|
-
promised that one or the other of these is true.
|
117
|
-
|
118
|
-
The functions :math:`f` and :math:`g` are currently implemented
|
119
|
-
from their truth tables but could be represented concisely and
|
120
|
-
implemented efficiently for special classes of functions.
|
121
|
-
|
122
|
-
Fourier checking is a special case of :math:`k`-fold forrelation [2].
|
123
|
-
|
124
|
-
**Reference Circuit:**
|
125
|
-
|
126
|
-
.. plot::
|
127
|
-
:include-source:
|
128
|
-
|
129
|
-
from qiskit.circuit.library import fourier_checking
|
130
|
-
circuit = fourier_checking([1, -1, -1, -1], [1, 1, -1, -1])
|
131
|
-
circuit.draw('mpl')
|
132
|
-
|
133
|
-
**Reference:**
|
134
|
-
|
135
|
-
[1] S. Aaronson, BQP and the Polynomial Hierarchy, 2009 (Section 3.2).
|
136
|
-
`arXiv:0910.4698 <https://arxiv.org/abs/0910.4698>`_
|
137
|
-
|
138
|
-
[2] S. Aaronson, A. Ambainis, Forrelation: a problem that
|
139
|
-
optimally separates quantum from classical computing, 2014.
|
140
|
-
`arXiv:1411.5729 <https://arxiv.org/abs/1411.5729>`_
|
141
|
-
"""
|
142
|
-
num_qubits = math.log2(len(f))
|
143
|
-
|
144
|
-
if len(f) != len(g) or num_qubits == 0 or not num_qubits.is_integer():
|
145
|
-
raise CircuitError(
|
146
|
-
"The functions f and g must be given as truth "
|
147
|
-
"tables, each as a list of 2**n entries of "
|
148
|
-
"{1, -1}."
|
149
|
-
)
|
150
|
-
num_qubits = int(num_qubits)
|
151
|
-
|
152
|
-
circuit = QuantumCircuit(num_qubits, name=f"fc: {f}, {g}")
|
153
|
-
circuit.h(circuit.qubits)
|
154
|
-
circuit.append(DiagonalGate(f), range(num_qubits))
|
155
|
-
circuit.h(circuit.qubits)
|
156
|
-
circuit.append(DiagonalGate(g), range(num_qubits))
|
157
|
-
circuit.h(circuit.qubits)
|
158
|
-
return circuit
|
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
from .diagonal import Diagonal, DiagonalGate
|
16
16
|
from .permutation import Permutation, PermutationGate
|
17
|
-
from .mcmt import MCMT, MCMTVChain
|
17
|
+
from .mcmt import MCMT, MCMTVChain
|
18
18
|
from .gms import GMS, MSGate
|
19
19
|
from .gr import GR, GRX, GRY, GRZ
|
20
20
|
from .pauli import PauliGate
|
@@ -23,8 +23,6 @@ import numpy as np
|
|
23
23
|
from qiskit.circuit.gate import Gate
|
24
24
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
25
25
|
from qiskit.circuit.exceptions import CircuitError
|
26
|
-
from qiskit.circuit.annotated_operation import AnnotatedOperation, InverseModifier
|
27
|
-
from qiskit.utils.deprecation import deprecate_func
|
28
26
|
|
29
27
|
from .ucrz import UCRZGate
|
30
28
|
|
@@ -32,28 +30,19 @@ _EPS = 1e-10
|
|
32
30
|
|
33
31
|
|
34
32
|
class Diagonal(QuantumCircuit):
|
35
|
-
"""
|
33
|
+
r"""Diagonal circuit.
|
36
34
|
|
37
|
-
|
38
|
-
def __init__(self, diag: Sequence[complex]) -> None:
|
39
|
-
r"""
|
40
|
-
Args:
|
41
|
-
diag: List of the :math:`2^k` diagonal entries (for a diagonal gate on :math:`k` qubits).
|
42
|
-
|
43
|
-
Raises:
|
44
|
-
CircuitError: if the list of the diagonal entries or the qubit list is in bad format;
|
45
|
-
if the number of diagonal entries is not :math:`2^k`, where :math:`k` denotes the
|
46
|
-
number of qubits.
|
47
|
-
"""
|
48
|
-
DiagonalGate._check_input(diag)
|
49
|
-
num_qubits = int(math.log2(len(diag)))
|
50
|
-
|
51
|
-
super().__init__(num_qubits, name="Diagonal")
|
52
|
-
self.append(DiagonalGate(diag), self.qubits)
|
35
|
+
Circuit symbol:
|
53
36
|
|
37
|
+
.. parsed-literal::
|
54
38
|
|
55
|
-
|
56
|
-
|
39
|
+
┌───────────┐
|
40
|
+
q_0: ┤0 ├
|
41
|
+
│ │
|
42
|
+
q_1: ┤1 Diagonal ├
|
43
|
+
│ │
|
44
|
+
q_2: ┤2 ├
|
45
|
+
└───────────┘
|
57
46
|
|
58
47
|
Matrix form:
|
59
48
|
|
@@ -91,28 +80,30 @@ class DiagonalGate(Gate):
|
|
91
80
|
def __init__(self, diag: Sequence[complex]) -> None:
|
92
81
|
r"""
|
93
82
|
Args:
|
94
|
-
diag:
|
83
|
+
diag: List of the :math:`2^k` diagonal entries (for a diagonal gate on :math:`k` qubits).
|
84
|
+
|
85
|
+
Raises:
|
86
|
+
CircuitError: if the list of the diagonal entries or the qubit list is in bad format;
|
87
|
+
if the number of diagonal entries is not :math:`2^k`, where :math:`k` denotes the
|
88
|
+
number of qubits.
|
95
89
|
"""
|
96
90
|
self._check_input(diag)
|
97
91
|
num_qubits = int(math.log2(len(diag)))
|
98
92
|
|
99
|
-
|
93
|
+
circuit = QuantumCircuit(num_qubits, name="Diagonal")
|
100
94
|
|
101
|
-
def _define(self):
|
102
95
|
# Since the diagonal is a unitary, all its entries have absolute value
|
103
96
|
# one and the diagonal is fully specified by the phases of its entries.
|
104
|
-
diag_phases = [cmath.phase(z) for z in
|
105
|
-
n = len(
|
106
|
-
circuit = QuantumCircuit(self.num_qubits)
|
107
|
-
|
97
|
+
diag_phases = [cmath.phase(z) for z in diag]
|
98
|
+
n = len(diag)
|
108
99
|
while n >= 2:
|
109
100
|
angles_rz = []
|
110
101
|
for i in range(0, n, 2):
|
111
102
|
diag_phases[i // 2], rz_angle = _extract_rz(diag_phases[i], diag_phases[i + 1])
|
112
103
|
angles_rz.append(rz_angle)
|
113
104
|
num_act_qubits = int(math.log2(n))
|
114
|
-
ctrl_qubits = list(range(
|
115
|
-
target_qubit =
|
105
|
+
ctrl_qubits = list(range(num_qubits - num_act_qubits + 1, num_qubits))
|
106
|
+
target_qubit = num_qubits - num_act_qubits
|
116
107
|
|
117
108
|
ucrz = UCRZGate(angles_rz)
|
118
109
|
circuit.append(ucrz, [target_qubit] + ctrl_qubits)
|
@@ -120,7 +111,36 @@ class DiagonalGate(Gate):
|
|
120
111
|
n //= 2
|
121
112
|
circuit.global_phase += diag_phases[0]
|
122
113
|
|
123
|
-
|
114
|
+
super().__init__(num_qubits, name="Diagonal")
|
115
|
+
self.append(circuit.to_gate(), self.qubits)
|
116
|
+
|
117
|
+
@staticmethod
|
118
|
+
def _check_input(diag):
|
119
|
+
"""Check if ``diag`` is in valid format."""
|
120
|
+
if not isinstance(diag, (list, np.ndarray)):
|
121
|
+
raise CircuitError("Diagonal entries must be in a list or numpy array.")
|
122
|
+
num_qubits = math.log2(len(diag))
|
123
|
+
if num_qubits < 1 or not num_qubits.is_integer():
|
124
|
+
raise CircuitError("The number of diagonal entries is not a positive power of 2.")
|
125
|
+
if not np.allclose(np.abs(diag), 1, atol=_EPS):
|
126
|
+
raise CircuitError("A diagonal element does not have absolute value one.")
|
127
|
+
|
128
|
+
|
129
|
+
class DiagonalGate(Gate):
|
130
|
+
"""Gate implementing a diagonal transformation."""
|
131
|
+
|
132
|
+
def __init__(self, diag: Sequence[complex]) -> None:
|
133
|
+
r"""
|
134
|
+
Args:
|
135
|
+
diag: list of the :math:`2^k` diagonal entries (for a diagonal gate on :math:`k` qubits).
|
136
|
+
"""
|
137
|
+
Diagonal._check_input(diag)
|
138
|
+
num_qubits = int(math.log2(len(diag)))
|
139
|
+
|
140
|
+
super().__init__("diagonal", num_qubits, diag)
|
141
|
+
|
142
|
+
def _define(self):
|
143
|
+
self.definition = Diagonal(self.params).decompose()
|
124
144
|
|
125
145
|
def validate_parameter(self, parameter):
|
126
146
|
"""Diagonal Gate parameter should accept complex
|
@@ -132,22 +152,8 @@ class DiagonalGate(Gate):
|
|
132
152
|
|
133
153
|
def inverse(self, annotated: bool = False):
|
134
154
|
"""Return the inverse of the diagonal gate."""
|
135
|
-
if annotated:
|
136
|
-
return AnnotatedOperation(self.copy(), InverseModifier)
|
137
|
-
|
138
155
|
return DiagonalGate([np.conj(entry) for entry in self.params])
|
139
156
|
|
140
|
-
@staticmethod
|
141
|
-
def _check_input(diag):
|
142
|
-
"""Check if ``diag`` is in valid format."""
|
143
|
-
if not isinstance(diag, (list, np.ndarray)):
|
144
|
-
raise CircuitError("Diagonal entries must be in a list or numpy array.")
|
145
|
-
num_qubits = math.log2(len(diag))
|
146
|
-
if num_qubits < 1 or not num_qubits.is_integer():
|
147
|
-
raise CircuitError("The number of diagonal entries is not a positive power of 2.")
|
148
|
-
if not np.allclose(np.abs(diag), 1, atol=_EPS):
|
149
|
-
raise CircuitError("A diagonal element does not have absolute value one.")
|
150
|
-
|
151
157
|
|
152
158
|
def _extract_rz(phi1, phi2):
|
153
159
|
"""
|
@@ -15,16 +15,13 @@
|
|
15
15
|
Global Mølmer–Sørensen gate.
|
16
16
|
"""
|
17
17
|
|
18
|
-
from
|
19
|
-
from collections.abc import Sequence
|
18
|
+
from typing import Union, List
|
20
19
|
|
21
20
|
import numpy as np
|
22
21
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
23
22
|
from qiskit.circuit.quantumregister import QuantumRegister
|
24
|
-
from qiskit.circuit.parameterexpression import ParameterValueType
|
25
23
|
from qiskit.circuit.library.standard_gates import RXXGate
|
26
24
|
from qiskit.circuit.gate import Gate
|
27
|
-
from qiskit.utils.deprecation import deprecate_func
|
28
25
|
|
29
26
|
|
30
27
|
class GMS(QuantumCircuit):
|
@@ -32,7 +29,7 @@ class GMS(QuantumCircuit):
|
|
32
29
|
|
33
30
|
**Circuit symbol:**
|
34
31
|
|
35
|
-
..
|
32
|
+
.. parsed-literal::
|
36
33
|
|
37
34
|
┌───────────┐
|
38
35
|
q_0: ┤0 ├
|
@@ -77,8 +74,7 @@ class GMS(QuantumCircuit):
|
|
77
74
|
`arXiv:1707.06356 <https://arxiv.org/abs/1707.06356>`_
|
78
75
|
"""
|
79
76
|
|
80
|
-
|
81
|
-
def __init__(self, num_qubits: int, theta: list[list[float]] | np.ndarray) -> None:
|
77
|
+
def __init__(self, num_qubits: int, theta: Union[List[List[float]], np.ndarray]) -> None:
|
82
78
|
"""Create a new Global Mølmer–Sørensen (GMS) gate.
|
83
79
|
|
84
80
|
Args:
|
@@ -98,77 +94,28 @@ class GMS(QuantumCircuit):
|
|
98
94
|
|
99
95
|
|
100
96
|
class MSGate(Gate):
|
101
|
-
|
97
|
+
"""MSGate has been deprecated.
|
98
|
+
Please use ``GMS`` in ``qiskit.circuit.generalized_gates`` instead.
|
102
99
|
|
103
|
-
|
104
|
-
can be applied to multiple ions to entangle multiple qubits simultaneously [1].
|
105
|
-
|
106
|
-
In the two-qubit case, this is equivalent to an XX interaction,
|
107
|
-
and is thus reduced to the :class:`.RXXGate`. The global MS gate is a sum of XX
|
108
|
-
interactions on all pairs [2].
|
109
|
-
|
110
|
-
.. math::
|
111
|
-
|
112
|
-
MS(\chi_{12}, \chi_{13}, ..., \chi_{n-1 n}) =
|
113
|
-
exp(-i \sum_{i=1}^{n} \sum_{j=i+1}^{n} X{\otimes}X \frac{\chi_{ij}}{2})
|
114
|
-
|
115
|
-
Example::
|
116
|
-
|
117
|
-
import numpy as np
|
118
|
-
from qiskit.circuit.library import MSGate
|
119
|
-
from qiskit.quantum_info import Operator
|
120
|
-
|
121
|
-
gate = MSGate(num_qubits=3, theta=[[0, np.pi/4, np.pi/8],
|
122
|
-
[0, 0, np.pi/2],
|
123
|
-
[0, 0, 0]])
|
124
|
-
print(Operator(gate))
|
125
|
-
|
126
|
-
|
127
|
-
**References:**
|
100
|
+
Global Mølmer–Sørensen gate.
|
128
101
|
|
129
|
-
|
130
|
-
|
131
|
-
`arXiv:9810040 <https://arxiv.org/abs/quant-ph/9810040>`_
|
102
|
+
The Mølmer–Sørensen gate is native to ion-trap systems. The global MS can be
|
103
|
+
applied to multiple ions to entangle multiple qubits simultaneously.
|
132
104
|
|
133
|
-
|
134
|
-
|
135
|
-
`arXiv:1707.06356 <https://arxiv.org/abs/1707.06356>`_
|
105
|
+
In the two-qubit case, this is equivalent to an XX(theta) interaction,
|
106
|
+
and is thus reduced to the RXXGate.
|
136
107
|
"""
|
137
108
|
|
138
|
-
def __init__(
|
139
|
-
|
140
|
-
num_qubits: int,
|
141
|
-
theta: ParameterValueType | Sequence[Sequence[ParameterValueType]],
|
142
|
-
label: str | None = None,
|
143
|
-
):
|
144
|
-
"""
|
145
|
-
Args:
|
146
|
-
num_qubits: The number of qubits the MS gate acts on.
|
147
|
-
theta: The XX rotation angles. If a single value, the same angle is used on all
|
148
|
-
interactions. Alternatively an upper-triangular, square matrix with width
|
149
|
-
``num_qubits`` can be provided with interaction angles for each qubit pair.
|
150
|
-
label: A gate label.
|
151
|
-
"""
|
109
|
+
def __init__(self, num_qubits, theta, label=None):
|
110
|
+
"""Create new MS gate."""
|
152
111
|
super().__init__("ms", num_qubits, [theta], label=label)
|
153
112
|
|
154
113
|
def _define(self):
|
155
|
-
|
156
|
-
q = QuantumRegister(self.num_qubits,
|
114
|
+
theta = self.params[0]
|
115
|
+
q = QuantumRegister(self.num_qubits, "q")
|
157
116
|
qc = QuantumCircuit(q, name=self.name)
|
158
117
|
for i in range(self.num_qubits):
|
159
118
|
for j in range(i + 1, self.num_qubits):
|
160
|
-
# if theta is just a single angle, use that, otherwise use the correct index
|
161
|
-
theta = thetas if not isinstance(thetas, Sequence) else thetas[i][j]
|
162
119
|
qc._append(RXXGate(theta), [q[i], q[j]], [])
|
163
120
|
|
164
121
|
self.definition = qc
|
165
|
-
|
166
|
-
def validate_parameter(self, parameter):
|
167
|
-
if isinstance(parameter, Sequence):
|
168
|
-
# pylint: disable=super-with-arguments
|
169
|
-
return [
|
170
|
-
[super(MSGate, self).validate_parameter(theta) for theta in row]
|
171
|
-
for row in parameter
|
172
|
-
]
|
173
|
-
|
174
|
-
return super().validate_parameter(parameter)
|
@@ -21,7 +21,7 @@ class GR(QuantumCircuit):
|
|
21
21
|
|
22
22
|
**Circuit symbol:**
|
23
23
|
|
24
|
-
..
|
24
|
+
.. parsed-literal::
|
25
25
|
|
26
26
|
┌──────────┐
|
27
27
|
q_0: ┤0 ├
|
@@ -75,7 +75,7 @@ class GRX(GR):
|
|
75
75
|
|
76
76
|
**Circuit symbol:**
|
77
77
|
|
78
|
-
..
|
78
|
+
.. parsed-literal::
|
79
79
|
|
80
80
|
┌──────────┐
|
81
81
|
q_0: ┤0 ├
|
@@ -123,7 +123,7 @@ class GRY(GR):
|
|
123
123
|
|
124
124
|
**Circuit symbol:**
|
125
125
|
|
126
|
-
..
|
126
|
+
.. parsed-literal::
|
127
127
|
|
128
128
|
┌──────────┐
|
129
129
|
q_0: ┤0 ├
|
@@ -171,7 +171,7 @@ class GRZ(QuantumCircuit):
|
|
171
171
|
|
172
172
|
**Circuit symbol:**
|
173
173
|
|
174
|
-
..
|
174
|
+
.. parsed-literal::
|
175
175
|
|
176
176
|
┌──────────┐
|
177
177
|
q_0: ┤0 ├
|
@@ -31,7 +31,7 @@ from qiskit.exceptions import QiskitError
|
|
31
31
|
from qiskit.quantum_info.operators.predicates import is_isometry
|
32
32
|
from qiskit._accelerate import isometry as isometry_rs
|
33
33
|
|
34
|
-
from .diagonal import
|
34
|
+
from .diagonal import Diagonal
|
35
35
|
from .uc import UCGate
|
36
36
|
from .mcg_up_to_diagonal import MCGupDiag
|
37
37
|
|
@@ -167,7 +167,7 @@ class Isometry(Instruction):
|
|
167
167
|
if len(diag) > 1 and not isometry_rs.diag_is_identity_up_to_global_phase(
|
168
168
|
diag, self._epsilon
|
169
169
|
):
|
170
|
-
diagonal =
|
170
|
+
diagonal = Diagonal(np.conj(diag))
|
171
171
|
circuit.append(diagonal, q_input)
|
172
172
|
return circuit
|
173
173
|
|
@@ -17,7 +17,6 @@ import numpy as np
|
|
17
17
|
from qiskit.circuit.quantumcircuit import QuantumCircuit, Gate
|
18
18
|
from qiskit.circuit.exceptions import CircuitError
|
19
19
|
from qiskit.circuit.library.generalized_gates.permutation import PermutationGate
|
20
|
-
from qiskit.utils.deprecation import deprecate_func
|
21
20
|
|
22
21
|
# pylint: disable=cyclic-import
|
23
22
|
from qiskit.quantum_info import Clifford
|
@@ -38,7 +37,7 @@ class LinearFunction(Gate):
|
|
38
37
|
|
39
38
|
**Example:** the circuit
|
40
39
|
|
41
|
-
..
|
40
|
+
.. parsed-literal::
|
42
41
|
|
43
42
|
q_0: ──■──
|
44
43
|
┌─┴─┐
|
@@ -68,7 +67,7 @@ class LinearFunction(Gate):
|
|
68
67
|
def __init__(
|
69
68
|
self,
|
70
69
|
linear: (
|
71
|
-
list[list
|
70
|
+
list[list]
|
72
71
|
| np.ndarray[bool]
|
73
72
|
| QuantumCircuit
|
74
73
|
| LinearFunction
|
@@ -222,22 +221,17 @@ class LinearFunction(Gate):
|
|
222
221
|
|
223
222
|
def _define(self):
|
224
223
|
"""Populates self.definition with a decomposition of this gate."""
|
225
|
-
|
226
|
-
|
227
|
-
self.definition = synth_cnot_count_full_pmh(self.linear)
|
224
|
+
self.definition = self.synthesize()
|
228
225
|
|
229
|
-
@deprecate_func(
|
230
|
-
since="1.3",
|
231
|
-
pending=True,
|
232
|
-
additional_msg="Call LinearFunction.definition instead, or compile the circuit.",
|
233
|
-
)
|
234
226
|
def synthesize(self):
|
235
227
|
"""Synthesizes the linear function into a quantum circuit.
|
236
228
|
|
237
229
|
Returns:
|
238
230
|
QuantumCircuit: A circuit implementing the evolution.
|
239
231
|
"""
|
240
|
-
|
232
|
+
from qiskit.synthesis.linear import synth_cnot_count_full_pmh
|
233
|
+
|
234
|
+
return synth_cnot_count_full_pmh(self.linear)
|
241
235
|
|
242
236
|
@property
|
243
237
|
def linear(self):
|