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,14 +14,14 @@
|
|
14
14
|
|
15
15
|
from __future__ import annotations
|
16
16
|
|
17
|
-
import warnings
|
18
17
|
from collections.abc import Callable
|
19
18
|
|
20
19
|
from qiskit import circuit
|
21
|
-
from qiskit.circuit import ControlledGate, Gate, QuantumCircuit
|
22
|
-
from qiskit.
|
23
|
-
|
24
|
-
|
20
|
+
from qiskit.circuit import ControlledGate, Gate, QuantumRegister, QuantumCircuit
|
21
|
+
from qiskit.exceptions import QiskitError
|
22
|
+
|
23
|
+
# pylint: disable=cyclic-import
|
24
|
+
from ..standard_gates import XGate, YGate, ZGate, HGate, TGate, TdgGate, SGate, SdgGate
|
25
25
|
|
26
26
|
|
27
27
|
class MCMT(QuantumCircuit):
|
@@ -29,7 +29,7 @@ class MCMT(QuantumCircuit):
|
|
29
29
|
|
30
30
|
For example, the H gate controlled on 3 qubits and acting on 2 target qubit is represented as:
|
31
31
|
|
32
|
-
..
|
32
|
+
.. parsed-literal::
|
33
33
|
|
34
34
|
───■────
|
35
35
|
│
|
@@ -49,7 +49,6 @@ class MCMT(QuantumCircuit):
|
|
49
49
|
:class:`~qiskit.circuit.library.MCMTVChain`.
|
50
50
|
"""
|
51
51
|
|
52
|
-
@deprecate_func(since="1.3", additional_msg="Use MCMTGate instead.", pending=True)
|
53
52
|
def __init__(
|
54
53
|
self,
|
55
54
|
gate: Gate | Callable[[QuantumCircuit, circuit.Qubit, circuit.Qubit], circuit.Instruction],
|
@@ -72,41 +71,77 @@ class MCMT(QuantumCircuit):
|
|
72
71
|
if num_ctrl_qubits == 0 or num_target_qubits == 0:
|
73
72
|
raise AttributeError("Need at least one control and one target qubit.")
|
74
73
|
|
75
|
-
|
76
|
-
|
77
|
-
"Passing a callable to MCMT is pending deprecation since Qiskit 1.3. Pass a "
|
78
|
-
"gate instance or the gate name instead, e.g. pass 'h' instead of QuantumCircuit.h.",
|
79
|
-
category=PendingDeprecationWarning,
|
80
|
-
stacklevel=2,
|
81
|
-
)
|
82
|
-
gate = gate.__name__
|
83
|
-
elif isinstance(gate, QuantumCircuit):
|
84
|
-
warnings.warn(
|
85
|
-
"Passing a QuantumCircuit is pending deprecation since Qiskit 1.3. Pass a gate "
|
86
|
-
"or turn the circuit into a gate using the ``to_gate`` method, instead.",
|
87
|
-
category=PendingDeprecationWarning,
|
88
|
-
stacklevel=2,
|
89
|
-
)
|
90
|
-
gate = gate.to_gate()
|
91
|
-
|
92
|
-
self.gate = MCMTGate._identify_base_gate(gate)
|
74
|
+
# set the internal properties and determine the number of qubits
|
75
|
+
self.gate = self._identify_gate(gate)
|
93
76
|
self.num_ctrl_qubits = num_ctrl_qubits
|
94
77
|
self.num_target_qubits = num_target_qubits
|
78
|
+
num_qubits = num_ctrl_qubits + num_target_qubits + self.num_ancilla_qubits
|
95
79
|
|
96
80
|
# initialize the circuit object
|
97
|
-
num_qubits = num_ctrl_qubits + num_target_qubits + self.num_ancilla_qubits
|
98
81
|
super().__init__(num_qubits, name="mcmt")
|
82
|
+
self._label = f"{num_target_qubits}-{self.gate.name.capitalize()}"
|
83
|
+
|
84
|
+
# build the circuit
|
99
85
|
self._build()
|
100
86
|
|
101
87
|
def _build(self):
|
102
|
-
|
103
|
-
self.
|
88
|
+
"""Define the MCMT gate without ancillas."""
|
89
|
+
if self.num_target_qubits == 1:
|
90
|
+
# no broadcasting needed (makes for better circuit diagrams)
|
91
|
+
broadcasted_gate = self.gate
|
92
|
+
else:
|
93
|
+
broadcasted = QuantumCircuit(self.num_target_qubits, name=self._label)
|
94
|
+
for target in list(range(self.num_target_qubits)):
|
95
|
+
broadcasted.append(self.gate, [target], [])
|
96
|
+
broadcasted_gate = broadcasted.to_gate()
|
97
|
+
|
98
|
+
mcmt_gate = broadcasted_gate.control(self.num_ctrl_qubits)
|
99
|
+
self.append(mcmt_gate, self.qubits, [])
|
104
100
|
|
105
101
|
@property
|
106
102
|
def num_ancilla_qubits(self):
|
107
103
|
"""Return the number of ancillas."""
|
108
104
|
return 0
|
109
105
|
|
106
|
+
def _identify_gate(self, gate):
|
107
|
+
"""Case the gate input to a gate."""
|
108
|
+
valid_gates = {
|
109
|
+
"ch": HGate(),
|
110
|
+
"cx": XGate(),
|
111
|
+
"cy": YGate(),
|
112
|
+
"cz": ZGate(),
|
113
|
+
"h": HGate(),
|
114
|
+
"s": SGate(),
|
115
|
+
"sdg": SdgGate(),
|
116
|
+
"x": XGate(),
|
117
|
+
"y": YGate(),
|
118
|
+
"z": ZGate(),
|
119
|
+
"t": TGate(),
|
120
|
+
"tdg": TdgGate(),
|
121
|
+
}
|
122
|
+
if isinstance(gate, ControlledGate):
|
123
|
+
base_gate = gate.base_gate
|
124
|
+
elif isinstance(gate, Gate):
|
125
|
+
if gate.num_qubits != 1:
|
126
|
+
raise AttributeError("Base gate must act on one qubit only.")
|
127
|
+
base_gate = gate
|
128
|
+
elif isinstance(gate, QuantumCircuit):
|
129
|
+
if gate.num_qubits != 1:
|
130
|
+
raise AttributeError(
|
131
|
+
"The circuit you specified as control gate can only have one qubit!"
|
132
|
+
)
|
133
|
+
base_gate = gate.to_gate() # raises error if circuit contains non-unitary instructions
|
134
|
+
else:
|
135
|
+
if callable(gate): # identify via name of the passed function
|
136
|
+
name = gate.__name__
|
137
|
+
elif isinstance(gate, str):
|
138
|
+
name = gate
|
139
|
+
else:
|
140
|
+
raise AttributeError(f"Invalid gate specified: {gate}")
|
141
|
+
base_gate = valid_gates[name]
|
142
|
+
|
143
|
+
return base_gate
|
144
|
+
|
110
145
|
def control(self, num_ctrl_qubits=1, label=None, ctrl_state=None, annotated=False):
|
111
146
|
"""Return the controlled version of the MCMT circuit."""
|
112
147
|
if not annotated and ctrl_state is None:
|
@@ -156,161 +191,66 @@ class MCMTVChain(MCMT):
|
|
156
191
|
└───┘ └───┘
|
157
192
|
"""
|
158
193
|
|
159
|
-
@deprecate_func(
|
160
|
-
since="1.3",
|
161
|
-
additional_msg="Use MCMTGate with the V-chain synthesis plugin instead.",
|
162
|
-
pending=True,
|
163
|
-
)
|
164
|
-
def __init__(
|
165
|
-
self,
|
166
|
-
gate: Gate | Callable[[QuantumCircuit, circuit.Qubit, circuit.Qubit], circuit.Instruction],
|
167
|
-
num_ctrl_qubits: int,
|
168
|
-
num_target_qubits: int,
|
169
|
-
) -> None:
|
170
|
-
super().__init__(gate, num_ctrl_qubits, num_target_qubits)
|
171
|
-
|
172
194
|
def _build(self):
|
173
|
-
|
174
|
-
|
195
|
+
"""Define the MCMT gate."""
|
196
|
+
control_qubits = self.qubits[: self.num_ctrl_qubits]
|
197
|
+
target_qubits = self.qubits[
|
198
|
+
self.num_ctrl_qubits : self.num_ctrl_qubits + self.num_target_qubits
|
199
|
+
]
|
200
|
+
ancilla_qubits = self.qubits[self.num_ctrl_qubits + self.num_target_qubits :]
|
201
|
+
|
202
|
+
if len(ancilla_qubits) > 0:
|
203
|
+
master_control = ancilla_qubits[-1]
|
204
|
+
else:
|
205
|
+
master_control = control_qubits[0]
|
175
206
|
|
176
|
-
|
177
|
-
|
207
|
+
self._ccx_v_chain_rule(control_qubits, ancilla_qubits, reverse=False)
|
208
|
+
for qubit in target_qubits:
|
209
|
+
self.append(self.gate.control(), [master_control, qubit], [])
|
210
|
+
self._ccx_v_chain_rule(control_qubits, ancilla_qubits, reverse=True)
|
178
211
|
|
179
212
|
@property
|
180
213
|
def num_ancilla_qubits(self):
|
181
214
|
"""Return the number of ancilla qubits required."""
|
182
215
|
return max(0, self.num_ctrl_qubits - 1)
|
183
216
|
|
184
|
-
def
|
185
|
-
return MCMTVChain(self.gate, self.num_ctrl_qubits, self.num_target_qubits)
|
186
|
-
|
187
|
-
|
188
|
-
class MCMTGate(ControlledGate):
|
189
|
-
"""The multi-controlled multi-target gate, for an arbitrary singly controlled target gate.
|
190
|
-
|
191
|
-
For example, the H gate controlled on 3 qubits and acting on 2 target qubit is represented as:
|
192
|
-
|
193
|
-
.. parsed-literal::
|
194
|
-
|
195
|
-
───■────
|
196
|
-
│
|
197
|
-
───■────
|
198
|
-
│
|
199
|
-
───■────
|
200
|
-
┌──┴───┐
|
201
|
-
┤0 ├
|
202
|
-
│ 2-H │
|
203
|
-
┤1 ├
|
204
|
-
└──────┘
|
205
|
-
|
206
|
-
Depending on the number of available auxiliary qubits, this operation can be synthesized
|
207
|
-
using different methods. For example, if :math:`n - 1` clean auxiliary qubits are available
|
208
|
-
(where :math:`n` is the number of control qubits), a V-chain decomposition can be used whose
|
209
|
-
depth is linear in :math:`n`. See also :func:`.synth_mcmt_chain`.
|
210
|
-
"""
|
211
|
-
|
212
|
-
def __init__(
|
217
|
+
def _ccx_v_chain_rule(
|
213
218
|
self,
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
ctrl_state: int | str | None = None,
|
218
|
-
label: str | None = None,
|
219
|
+
control_qubits: QuantumRegister | list[circuit.Qubit],
|
220
|
+
ancilla_qubits: QuantumRegister | list[circuit.Qubit],
|
221
|
+
reverse: bool = False,
|
219
222
|
) -> None:
|
220
|
-
"""
|
221
|
-
Args:
|
222
|
-
gate: The base gate to apply on multiple target qubits, controlled by other qubits.
|
223
|
-
This must be a single-qubit gate or a controlled single-qubit gate.
|
224
|
-
num_ctrl_qubits: The number of control qubits.
|
225
|
-
num_target_qubits: The number of target qubits.
|
226
|
-
ctrl_state: The control state of the control qubits. Defaults to all closed controls.
|
227
|
-
label: The gate label.
|
228
|
-
"""
|
229
|
-
if num_target_qubits < 1:
|
230
|
-
raise ValueError("Need at least one target qubit.")
|
223
|
+
"""Get the rule for the CCX V-chain.
|
231
224
|
|
232
|
-
|
233
|
-
|
225
|
+
The CCX V-chain progressively computes the CCX of the control qubits and puts the final
|
226
|
+
result in the last ancillary qubit.
|
234
227
|
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
if label is None:
|
241
|
-
label = f"{num_target_qubits}-{gate.name.capitalize()}"
|
242
|
-
|
243
|
-
super().__init__(
|
244
|
-
"mcmt",
|
245
|
-
base_gate=base_gate,
|
246
|
-
num_qubits=num_qubits,
|
247
|
-
params=gate.params,
|
248
|
-
num_ctrl_qubits=num_ctrl_qubits,
|
249
|
-
ctrl_state=ctrl_state,
|
250
|
-
label=label,
|
251
|
-
)
|
252
|
-
|
253
|
-
def _define(self):
|
254
|
-
"""Default definition relying on gate.control. Control state is handled by superclass."""
|
255
|
-
# pylint: disable=cyclic-import
|
256
|
-
from qiskit.transpiler.passes.synthesis.hls_plugins import MCMTSynthesisDefault
|
257
|
-
|
258
|
-
self.definition = MCMTSynthesisDefault().run(self)
|
259
|
-
|
260
|
-
@staticmethod
|
261
|
-
def _identify_base_gate(gate):
|
262
|
-
"""Get the control base gate. Note this must be a single qubit gate."""
|
263
|
-
|
264
|
-
# try getting the standard name from the string
|
265
|
-
if isinstance(gate, str):
|
266
|
-
standard_gates = get_standard_gate_name_mapping()
|
267
|
-
if gate in standard_gates:
|
268
|
-
gate = standard_gates[gate]
|
269
|
-
else:
|
270
|
-
raise AttributeError(
|
271
|
-
f"Unknown gate {gate}. Available: {list(get_standard_gate_name_mapping.keys())}"
|
272
|
-
)
|
228
|
+
Args:
|
229
|
+
control_qubits: The control qubits.
|
230
|
+
ancilla_qubits: The ancilla qubits.
|
231
|
+
reverse: If True, compute the chain down to the qubit. If False, compute upwards.
|
273
232
|
|
274
|
-
|
275
|
-
|
276
|
-
warnings.warn(
|
277
|
-
"Passing a controlled gate to MCMT is pending deprecation since Qiskit 1.3. Pass a "
|
278
|
-
"single-qubit gate instance or the gate name instead, e.g. pass 'h' instead of 'ch'.",
|
279
|
-
category=PendingDeprecationWarning,
|
280
|
-
stacklevel=2,
|
281
|
-
)
|
282
|
-
base_gate = gate.base_gate
|
283
|
-
elif isinstance(gate, Gate):
|
284
|
-
base_gate = gate
|
285
|
-
else:
|
286
|
-
raise TypeError(f"Invalid gate type {type(gate)}.")
|
233
|
+
Returns:
|
234
|
+
The rule for the (reversed) CCX V-chain.
|
287
235
|
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
236
|
+
Raises:
|
237
|
+
QiskitError: If an insufficient number of ancilla qubits was provided.
|
238
|
+
"""
|
239
|
+
if len(ancilla_qubits) == 0:
|
240
|
+
return
|
292
241
|
|
293
|
-
|
242
|
+
if len(ancilla_qubits) < len(control_qubits) - 1:
|
243
|
+
raise QiskitError("Insufficient number of ancilla qubits.")
|
294
244
|
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
gate = MCMTGate(
|
302
|
-
self.base_gate,
|
303
|
-
self.num_ctrl_qubits + num_ctrl_qubits,
|
304
|
-
self.num_target_qubits,
|
305
|
-
ctrl_state=new_ctrl_state,
|
306
|
-
)
|
245
|
+
iterations = list(enumerate(range(2, len(control_qubits))))
|
246
|
+
if not reverse:
|
247
|
+
self.ccx(control_qubits[0], control_qubits[1], ancilla_qubits[0])
|
248
|
+
for i, j in iterations:
|
249
|
+
self.ccx(control_qubits[j], ancilla_qubits[i], ancilla_qubits[i + 1])
|
307
250
|
else:
|
308
|
-
|
309
|
-
|
310
|
-
|
251
|
+
for i, j in reversed(iterations):
|
252
|
+
self.ccx(control_qubits[j], ancilla_qubits[i], ancilla_qubits[i + 1])
|
253
|
+
self.ccx(control_qubits[0], control_qubits[1], ancilla_qubits[0])
|
311
254
|
|
312
255
|
def inverse(self, annotated: bool = False):
|
313
|
-
|
314
|
-
return MCMTGate(
|
315
|
-
self.base_gate.inverse(), self.num_ctrl_qubits, self.num_target_qubits, self.ctrl_state
|
316
|
-
)
|
256
|
+
return MCMTVChain(self.gate, self.num_ctrl_qubits, self.num_target_qubits)
|
@@ -22,13 +22,11 @@ import numpy as np
|
|
22
22
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
23
23
|
from qiskit.circuit.quantumcircuit import Gate
|
24
24
|
from qiskit.circuit.exceptions import CircuitError
|
25
|
-
from qiskit.utils.deprecation import deprecate_func
|
26
25
|
|
27
26
|
|
28
27
|
class Permutation(QuantumCircuit):
|
29
28
|
"""An n_qubit circuit that permutes qubits."""
|
30
29
|
|
31
|
-
@deprecate_func(since="1.3", pending=True, additional_msg="Use PermutationGate instead.")
|
32
30
|
def __init__(
|
33
31
|
self,
|
34
32
|
num_qubits: int,
|
@@ -119,11 +117,11 @@ class PermutationGate(Gate):
|
|
119
117
|
|
120
118
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
121
119
|
from qiskit.circuit.library import PermutationGate
|
122
|
-
A = [2,
|
120
|
+
A = [2,4,3,0,1]
|
123
121
|
permutation = PermutationGate(A)
|
124
122
|
circuit = QuantumCircuit(5)
|
125
123
|
circuit.append(permutation, [0, 1, 2, 3, 4])
|
126
|
-
circuit.draw(
|
124
|
+
circuit.draw('mpl')
|
127
125
|
|
128
126
|
Expanded Circuit:
|
129
127
|
.. plot::
|
@@ -131,7 +129,7 @@ class PermutationGate(Gate):
|
|
131
129
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
132
130
|
from qiskit.circuit.library import PermutationGate
|
133
131
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
134
|
-
A = [2,
|
132
|
+
A = [2,4,3,0,1]
|
135
133
|
permutation = PermutationGate(A)
|
136
134
|
circuit = QuantumCircuit(5)
|
137
135
|
circuit.append(permutation, [0, 1, 2, 3, 4])
|
@@ -143,7 +141,7 @@ class PermutationGate(Gate):
|
|
143
141
|
raise CircuitError(
|
144
142
|
"Permutation pattern must be some ordering of 0..num_qubits-1 in a list."
|
145
143
|
)
|
146
|
-
pattern = np.array(pattern
|
144
|
+
pattern = np.array(pattern)
|
147
145
|
|
148
146
|
super().__init__(name="permutation", num_qubits=num_qubits, params=[pattern])
|
149
147
|
|
@@ -170,11 +168,11 @@ class PermutationGate(Gate):
|
|
170
168
|
return parameter
|
171
169
|
|
172
170
|
@property
|
173
|
-
def pattern(self)
|
171
|
+
def pattern(self):
|
174
172
|
"""Returns the permutation pattern defining this permutation."""
|
175
173
|
return self.params[0]
|
176
174
|
|
177
|
-
def inverse(self, annotated: bool = False)
|
175
|
+
def inverse(self, annotated: bool = False):
|
178
176
|
"""Returns the inverse of the permutation."""
|
179
177
|
|
180
178
|
# pylint: disable=cyclic-import
|
@@ -27,7 +27,7 @@ class RVGate(Gate):
|
|
27
27
|
|
28
28
|
**Circuit symbol:**
|
29
29
|
|
30
|
-
..
|
30
|
+
.. parsed-literal::
|
31
31
|
|
32
32
|
┌─────────────────┐
|
33
33
|
q_0: ┤ RV(v_x,v_y,v_z) ├
|
@@ -51,13 +51,14 @@ class RVGate(Gate):
|
|
51
51
|
\end{pmatrix}
|
52
52
|
"""
|
53
53
|
|
54
|
-
def __init__(self, v_x
|
55
|
-
"""
|
54
|
+
def __init__(self, v_x, v_y, v_z, basis="U"):
|
55
|
+
"""Create new rv single-qubit gate.
|
56
|
+
|
56
57
|
Args:
|
57
|
-
v_x: x-component
|
58
|
-
v_y: y-component
|
59
|
-
v_z: z-component
|
60
|
-
basis: basis (see
|
58
|
+
v_x (float): x-component
|
59
|
+
v_y (float): y-component
|
60
|
+
v_z (float): z-component
|
61
|
+
basis (str, optional): basis (see
|
61
62
|
:class:`~qiskit.synthesis.one_qubit.one_qubit_decompose.OneQubitEulerDecomposer`)
|
62
63
|
"""
|
63
64
|
# pylint: disable=cyclic-import
|
@@ -79,7 +80,7 @@ class RVGate(Gate):
|
|
79
80
|
vx, vy, vz = self.params
|
80
81
|
return RVGate(-vx, -vy, -vz)
|
81
82
|
|
82
|
-
def to_matrix(self)
|
83
|
+
def to_matrix(self):
|
83
84
|
"""Return a numpy.array for the R(v) gate."""
|
84
85
|
v = numpy.asarray(self.params, dtype=float)
|
85
86
|
angle = math.sqrt(v.dot(v))
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# This code is part of Qiskit.
|
2
2
|
#
|
3
|
-
# (C) Copyright IBM 2017,
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
4
4
|
#
|
5
5
|
# This code is licensed under the Apache License, Version 2.0. You may
|
6
6
|
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
@@ -10,14 +10,13 @@
|
|
10
10
|
# copyright notice, and modified files need to carry a notice indicating
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
|
-
"""Graph State circuit
|
13
|
+
"""Graph State circuit."""
|
14
14
|
|
15
15
|
from __future__ import annotations
|
16
16
|
|
17
17
|
import numpy as np
|
18
|
-
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
18
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
19
19
|
from qiskit.circuit.exceptions import CircuitError
|
20
|
-
from qiskit.utils.deprecation import deprecate_func
|
21
20
|
|
22
21
|
|
23
22
|
class GraphState(QuantumCircuit):
|
@@ -57,11 +56,6 @@ class GraphState(QuantumCircuit):
|
|
57
56
|
`arXiv:1512.07892 <https://arxiv.org/pdf/1512.07892.pdf>`_
|
58
57
|
"""
|
59
58
|
|
60
|
-
@deprecate_func(
|
61
|
-
since="1.3",
|
62
|
-
additional_msg="Use qiskit.circuit.library.GraphStateGate instead.",
|
63
|
-
pending=True,
|
64
|
-
)
|
65
59
|
def __init__(self, adjacency_matrix: list | np.ndarray) -> None:
|
66
60
|
"""Create graph state preparation circuit.
|
67
61
|
|
@@ -79,91 +73,14 @@ class GraphState(QuantumCircuit):
|
|
79
73
|
if not np.allclose(adjacency_matrix, adjacency_matrix.transpose()):
|
80
74
|
raise CircuitError("The adjacency matrix must be symmetric.")
|
81
75
|
|
82
|
-
graph_state_gate = GraphStateGate(adjacency_matrix)
|
83
|
-
super().__init__(graph_state_gate.num_qubits, name=f"graph: {adjacency_matrix}")
|
84
|
-
self.compose(graph_state_gate, qubits=self.qubits, inplace=True)
|
85
|
-
|
86
|
-
|
87
|
-
class GraphStateGate(Gate):
|
88
|
-
r"""A gate representing a graph state.
|
89
|
-
|
90
|
-
Given a graph G = (V, E), with the set of vertices V and the set of edges E,
|
91
|
-
the corresponding graph state is defined as
|
92
|
-
|
93
|
-
.. math::
|
94
|
-
|
95
|
-
|G\rangle = \prod_{(a,b) \in E} CZ_{(a,b)} {|+\rangle}^{\otimes V}
|
96
|
-
|
97
|
-
Such a state can be prepared by first preparing all qubits in the :math:`+`
|
98
|
-
state, then applying a :math:`CZ` gate for each corresponding graph edge.
|
99
|
-
|
100
|
-
Graph state preparation circuits are Clifford circuits, and thus
|
101
|
-
easy to simulate classically. However, by adding a layer of measurements
|
102
|
-
in a product basis at the end, there is evidence that the circuit becomes
|
103
|
-
hard to simulate [2].
|
104
|
-
|
105
|
-
**Reference Circuit:**
|
106
|
-
|
107
|
-
.. plot::
|
108
|
-
:include-source:
|
109
|
-
|
110
|
-
from qiskit.circuit import QuantumCircuit
|
111
|
-
from qiskit.circuit.library import GraphStateGate
|
112
|
-
import rustworkx as rx
|
113
|
-
|
114
|
-
G = rx.generators.cycle_graph(5)
|
115
|
-
circuit = QuantumCircuit(5)
|
116
|
-
circuit.append(GraphStateGate(rx.adjacency_matrix(G)), [0, 1, 2, 3, 4])
|
117
|
-
circuit.decompose().draw('mpl')
|
118
|
-
|
119
|
-
**References:**
|
120
|
-
|
121
|
-
[1] M. Hein, J. Eisert, H.J. Briegel, Multi-party Entanglement in Graph States,
|
122
|
-
`arXiv:0307130 <https://arxiv.org/pdf/quant-ph/0307130.pdf>`_
|
123
|
-
[2] D. Koh, Further Extensions of Clifford Circuits & their Classical Simulation Complexities.
|
124
|
-
`arXiv:1512.07892 <https://arxiv.org/pdf/1512.07892.pdf>`_
|
125
|
-
"""
|
126
|
-
|
127
|
-
def __init__(self, adjacency_matrix: list | np.ndarray) -> None:
|
128
|
-
"""
|
129
|
-
Args:
|
130
|
-
adjacency_matrix: input graph as n-by-n list of 0-1 lists
|
131
|
-
|
132
|
-
Raises:
|
133
|
-
CircuitError: If adjacency_matrix is not symmetric.
|
134
|
-
|
135
|
-
The gate represents a graph state with the given adjacency matrix.
|
136
|
-
"""
|
137
|
-
|
138
|
-
adjacency_matrix = np.asarray(adjacency_matrix)
|
139
|
-
if not np.allclose(adjacency_matrix, adjacency_matrix.transpose()):
|
140
|
-
raise CircuitError("The adjacency matrix must be symmetric.")
|
141
76
|
num_qubits = len(adjacency_matrix)
|
77
|
+
circuit = QuantumCircuit(num_qubits, name=f"graph: {adjacency_matrix}")
|
142
78
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
adjacency_matrix = self.adjacency_matrix
|
147
|
-
circuit = QuantumCircuit(self.num_qubits, name=self.name)
|
148
|
-
circuit.h(range(self.num_qubits))
|
149
|
-
for i in range(self.num_qubits):
|
150
|
-
for j in range(i + 1, self.num_qubits):
|
79
|
+
circuit.h(range(num_qubits))
|
80
|
+
for i in range(num_qubits):
|
81
|
+
for j in range(i + 1, num_qubits):
|
151
82
|
if adjacency_matrix[i][j] == 1:
|
152
83
|
circuit.cz(i, j)
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
"""Parameter validation"""
|
157
|
-
return parameter
|
158
|
-
|
159
|
-
@property
|
160
|
-
def adjacency_matrix(self):
|
161
|
-
"""Returns the adjacency matrix."""
|
162
|
-
return self.params[0]
|
163
|
-
|
164
|
-
def __eq__(self, other):
|
165
|
-
return (
|
166
|
-
isinstance(other, GraphStateGate)
|
167
|
-
and self.num_qubits == other.num_qubits
|
168
|
-
and np.all(self.adjacency_matrix == other.adjacency_matrix)
|
169
|
-
)
|
84
|
+
|
85
|
+
super().__init__(*circuit.qregs, name=circuit.name)
|
86
|
+
self.compose(circuit.to_gate(), qubits=self.qubits, inplace=True)
|