qiskit 1.3.0b1__cp39-abi3-macosx_11_0_arm64.whl → 1.3.0rc1__cp39-abi3-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +20 -1
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/assembler/assemble_schedules.py +2 -0
- qiskit/circuit/__init__.py +44 -1
- qiskit/circuit/_standard_gates_commutations.py +585 -0
- qiskit/circuit/barrier.py +2 -0
- qiskit/circuit/controlflow/builder.py +3 -3
- qiskit/circuit/controlflow/if_else.py +13 -5
- qiskit/circuit/controlflow/while_loop.py +10 -2
- qiskit/circuit/delay.py +20 -3
- qiskit/circuit/equivalence.py +13 -214
- qiskit/circuit/gate.py +3 -1
- qiskit/circuit/instruction.py +32 -11
- qiskit/circuit/instructionset.py +2 -0
- qiskit/circuit/library/__init__.py +83 -14
- qiskit/circuit/library/arithmetic/__init__.py +9 -2
- qiskit/circuit/library/arithmetic/adders/__init__.py +1 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +153 -1
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +20 -56
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +14 -1
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +21 -91
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +1 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +8 -1
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +94 -3
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +8 -1
- qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
- qiskit/circuit/library/basis_change/qft.py +20 -38
- qiskit/circuit/library/blueprintcircuit.py +64 -0
- qiskit/circuit/library/boolean_logic/__init__.py +4 -4
- qiskit/circuit/library/boolean_logic/inner_product.py +81 -4
- qiskit/circuit/library/boolean_logic/quantum_and.py +107 -4
- qiskit/circuit/library/boolean_logic/quantum_or.py +107 -3
- qiskit/circuit/library/boolean_logic/quantum_xor.py +97 -3
- qiskit/circuit/library/data_preparation/__init__.py +6 -3
- qiskit/circuit/library/data_preparation/{z_feature_map.py → _z_feature_map.py} +45 -34
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +342 -29
- qiskit/circuit/library/fourier_checking.py +72 -11
- qiskit/circuit/library/generalized_gates/__init__.py +1 -1
- qiskit/circuit/library/generalized_gates/diagonal.py +45 -51
- qiskit/circuit/library/generalized_gates/gms.py +67 -14
- qiskit/circuit/library/generalized_gates/gr.py +4 -4
- qiskit/circuit/library/generalized_gates/isometry.py +2 -2
- qiskit/circuit/library/generalized_gates/linear_function.py +12 -6
- qiskit/circuit/library/generalized_gates/mcmt.py +167 -107
- qiskit/circuit/library/generalized_gates/permutation.py +8 -6
- qiskit/circuit/library/generalized_gates/rv.py +8 -9
- qiskit/circuit/library/graph_state.py +93 -10
- qiskit/circuit/library/grover_operator.py +270 -2
- qiskit/circuit/library/hidden_linear_function.py +83 -20
- qiskit/circuit/library/iqp.py +99 -20
- qiskit/circuit/library/n_local/__init__.py +19 -7
- qiskit/circuit/library/n_local/efficient_su2.py +118 -5
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +259 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +130 -6
- qiskit/circuit/library/n_local/n_local.py +406 -5
- qiskit/circuit/library/n_local/pauli_two_design.py +106 -4
- qiskit/circuit/library/n_local/qaoa_ansatz.py +80 -1
- qiskit/circuit/library/n_local/real_amplitudes.py +127 -7
- qiskit/circuit/library/n_local/two_local.py +14 -7
- qiskit/circuit/library/overlap.py +91 -26
- qiskit/circuit/library/pauli_evolution.py +17 -15
- qiskit/circuit/library/phase_estimation.py +80 -4
- qiskit/circuit/library/quantum_volume.py +72 -20
- qiskit/circuit/library/standard_gates/__init__.py +20 -1
- qiskit/circuit/library/standard_gates/dcx.py +2 -1
- qiskit/circuit/library/standard_gates/ecr.py +2 -2
- qiskit/circuit/library/standard_gates/h.py +4 -3
- qiskit/circuit/library/standard_gates/i.py +2 -1
- qiskit/circuit/library/standard_gates/iswap.py +2 -2
- qiskit/circuit/library/standard_gates/p.py +20 -12
- qiskit/circuit/library/standard_gates/r.py +1 -1
- qiskit/circuit/library/standard_gates/rx.py +4 -3
- qiskit/circuit/library/standard_gates/rxx.py +2 -2
- qiskit/circuit/library/standard_gates/ry.py +4 -3
- qiskit/circuit/library/standard_gates/ryy.py +2 -2
- qiskit/circuit/library/standard_gates/rz.py +13 -12
- qiskit/circuit/library/standard_gates/rzx.py +6 -6
- qiskit/circuit/library/standard_gates/rzz.py +1 -1
- qiskit/circuit/library/standard_gates/s.py +4 -4
- qiskit/circuit/library/standard_gates/swap.py +3 -3
- qiskit/circuit/library/standard_gates/sx.py +4 -3
- qiskit/circuit/library/standard_gates/t.py +2 -2
- qiskit/circuit/library/standard_gates/u.py +11 -3
- qiskit/circuit/library/standard_gates/u1.py +65 -15
- qiskit/circuit/library/standard_gates/u2.py +4 -1
- qiskit/circuit/library/standard_gates/u3.py +31 -3
- qiskit/circuit/library/standard_gates/x.py +7 -5
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -2
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -2
- qiskit/circuit/library/standard_gates/y.py +4 -3
- qiskit/circuit/library/standard_gates/z.py +3 -3
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +9 -7
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +10 -9
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +9 -7
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +10 -8
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +16 -14
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +14 -12
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +14 -12
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +12 -10
- qiskit/circuit/library/templates/rzx/rzx_cy.py +11 -10
- qiskit/circuit/library/templates/rzx/rzx_xz.py +16 -15
- qiskit/circuit/library/templates/rzx/rzx_yz.py +12 -10
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +22 -20
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +16 -15
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +17 -15
- qiskit/circuit/parameter.py +4 -0
- qiskit/circuit/parameterexpression.py +167 -34
- qiskit/circuit/quantumcircuit.py +162 -126
- qiskit/circuit/singleton.py +2 -0
- qiskit/circuit/store.py +2 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/assembler.py +17 -4
- qiskit/compiler/scheduler.py +2 -0
- qiskit/compiler/sequencer.py +2 -0
- qiskit/compiler/transpiler.py +81 -26
- qiskit/converters/circuit_to_dag.py +2 -2
- qiskit/converters/circuit_to_dagdependency.py +1 -1
- qiskit/converters/circuit_to_dagdependency_v2.py +1 -1
- qiskit/converters/circuit_to_instruction.py +1 -1
- qiskit/converters/dag_to_circuit.py +7 -5
- qiskit/converters/dag_to_dagdependency.py +1 -1
- qiskit/converters/dag_to_dagdependency_v2.py +1 -1
- qiskit/converters/dagdependency_to_circuit.py +5 -1
- qiskit/converters/dagdependency_to_dag.py +6 -1
- qiskit/dagcircuit/collect_blocks.py +3 -3
- qiskit/dagcircuit/dagdependency.py +18 -5
- qiskit/dagcircuit/dagdependency_v2.py +1 -1
- qiskit/dagcircuit/dagnode.py +2 -2
- qiskit/passmanager/__init__.py +2 -2
- qiskit/primitives/backend_estimator.py +5 -2
- qiskit/primitives/backend_sampler_v2.py +61 -18
- qiskit/primitives/base/base_estimator.py +2 -2
- qiskit/primitives/containers/data_bin.py +9 -1
- qiskit/primitives/statevector_sampler.py +1 -1
- qiskit/providers/__init__.py +1 -1
- qiskit/providers/backend.py +12 -1
- qiskit/providers/backend_compat.py +23 -3
- qiskit/providers/basic_provider/basic_simulator.py +12 -2
- qiskit/providers/fake_provider/fake_pulse_backend.py +6 -1
- qiskit/providers/fake_provider/generic_backend_v2.py +46 -30
- qiskit/providers/models/pulsedefaults.py +2 -0
- qiskit/pulse/builder.py +59 -18
- qiskit/pulse/calibration_entries.py +4 -1
- qiskit/pulse/channels.py +2 -0
- qiskit/pulse/exceptions.py +2 -0
- qiskit/pulse/instruction_schedule_map.py +21 -6
- qiskit/pulse/instructions/acquire.py +2 -0
- qiskit/pulse/instructions/delay.py +2 -0
- qiskit/pulse/instructions/directives.py +8 -0
- qiskit/pulse/instructions/frequency.py +3 -0
- qiskit/pulse/instructions/instruction.py +2 -0
- qiskit/pulse/instructions/phase.py +3 -0
- qiskit/pulse/instructions/play.py +2 -0
- qiskit/pulse/instructions/reference.py +2 -0
- qiskit/pulse/instructions/snapshot.py +2 -0
- qiskit/pulse/library/pulse.py +2 -0
- qiskit/pulse/library/symbolic_pulses.py +28 -0
- qiskit/pulse/library/waveform.py +2 -0
- qiskit/pulse/macros.py +1 -1
- qiskit/pulse/schedule.py +12 -13
- qiskit/pulse/transforms/alignments.py +5 -3
- qiskit/pulse/transforms/dag.py +7 -0
- qiskit/qasm2/export.py +5 -3
- qiskit/qasm2/parse.py +46 -2
- qiskit/qasm3/__init__.py +1 -0
- qiskit/qasm3/ast.py +123 -15
- qiskit/qasm3/exporter.py +103 -77
- qiskit/qobj/converters/pulse_instruction.py +6 -4
- qiskit/qpy/__init__.py +181 -0
- qiskit/qpy/binary_io/circuits.py +20 -5
- qiskit/qpy/binary_io/schedules.py +3 -4
- qiskit/qpy/binary_io/value.py +310 -13
- qiskit/qpy/common.py +46 -2
- qiskit/qpy/formats.py +7 -0
- qiskit/qpy/interface.py +40 -4
- qiskit/quantum_info/__init__.py +4 -0
- qiskit/quantum_info/operators/channel/transformations.py +28 -21
- qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
- qiskit/quantum_info/operators/operator.py +54 -8
- qiskit/quantum_info/operators/symplectic/base_pauli.py +11 -19
- qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +1 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +2 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +23 -2
- qiskit/quantum_info/states/densitymatrix.py +5 -5
- qiskit/quantum_info/states/stabilizerstate.py +1 -1
- qiskit/quantum_info/states/statevector.py +5 -5
- qiskit/result/mitigation/base_readout_mitigator.py +1 -1
- qiskit/result/mitigation/correlated_readout_mitigator.py +9 -1
- qiskit/result/mitigation/local_readout_mitigator.py +9 -1
- qiskit/result/mitigation/utils.py +57 -0
- qiskit/scheduler/config.py +2 -0
- qiskit/scheduler/methods/basic.py +3 -0
- qiskit/scheduler/schedule_circuit.py +2 -0
- qiskit/scheduler/sequence.py +2 -0
- qiskit/synthesis/__init__.py +25 -0
- qiskit/synthesis/arithmetic/__init__.py +16 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +1 -2
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +3 -2
- qiskit/synthesis/clifford/clifford_decompose_layers.py +2 -1
- qiskit/synthesis/evolution/__init__.py +1 -0
- qiskit/synthesis/evolution/lie_trotter.py +16 -42
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +165 -238
- qiskit/synthesis/evolution/qdrift.py +36 -29
- qiskit/synthesis/evolution/suzuki_trotter.py +87 -27
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/qft/qft_decompose_full.py +19 -1
- qiskit/synthesis/qft/qft_decompose_lnn.py +2 -1
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -1
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +4 -63
- qiskit/synthesis/unitary/qsd.py +5 -5
- qiskit/transpiler/__init__.py +21 -14
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/passes/__init__.py +2 -0
- qiskit/transpiler/passes/basis/basis_translator.py +9 -565
- qiskit/transpiler/passes/basis/decompose.py +45 -12
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
- qiskit/transpiler/passes/calibration/pulse_gate.py +4 -2
- qiskit/transpiler/passes/calibration/rx_builder.py +11 -7
- qiskit/transpiler/passes/calibration/rzx_builder.py +46 -30
- qiskit/transpiler/passes/layout/disjoint_utils.py +15 -13
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -2
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +5 -0
- qiskit/transpiler/passes/optimization/__init__.py +1 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +19 -3
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +40 -130
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +4 -2
- qiskit/transpiler/passes/optimization/elide_permutations.py +9 -32
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +5 -11
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +7 -3
- qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
- qiskit/transpiler/passes/scheduling/alap.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
- qiskit/transpiler/passes/scheduling/asap.py +1 -1
- qiskit/transpiler/passes/scheduling/base_scheduler.py +14 -12
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +9 -4
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +16 -5
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +4 -1
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +6 -2
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +9 -4
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +257 -93
- qiskit/transpiler/passes/synthesis/hls_plugins.py +637 -7
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +55 -34
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +2 -56
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +5 -0
- qiskit/transpiler/passes/utils/gate_direction.py +12 -275
- qiskit/transpiler/passes/utils/gates_basis.py +7 -30
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +2 -1
- qiskit/transpiler/passmanager_config.py +22 -4
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +40 -14
- qiskit/transpiler/preset_passmanagers/common.py +5 -3
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +124 -42
- qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
- qiskit/transpiler/target.py +74 -16
- qiskit/utils/deprecate_pulse.py +119 -0
- qiskit/visualization/circuit/_utils.py +2 -2
- qiskit/visualization/circuit/circuit_visualization.py +3 -2
- qiskit/visualization/circuit/matplotlib.py +1 -1
- qiskit/visualization/dag_visualization.py +1 -1
- qiskit/visualization/pass_manager_visualization.py +3 -14
- qiskit/visualization/pulse_v2/interface.py +3 -1
- qiskit/visualization/timeline/core.py +25 -2
- qiskit/visualization/timeline/interface.py +12 -0
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/METADATA +3 -2
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/RECORD +356 -345
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/WHEEL +1 -1
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/entry_points.txt +19 -0
- qiskit/circuit/library/data_preparation/zz_feature_map.py +0 -118
- qiskit/synthesis/two_qubit/weyl.py +0 -97
- qiskit/transpiler/passes/synthesis/qubit_tracker.py +0 -132
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/top_level.txt +0 -0
@@ -36,7 +36,11 @@ For example, to append a multi-controlled CNOT:
|
|
36
36
|
circuit.append(gate, [0, 1, 4, 2, 3])
|
37
37
|
circuit.draw('mpl')
|
38
38
|
|
39
|
-
The library is organized in several sections.
|
39
|
+
The library is organized in several sections. The function
|
40
|
+
:func:`.get_standard_gate_name_mapping` allows you to see the available standard gates and operations.
|
41
|
+
|
42
|
+
.. autofunction:: get_standard_gate_name_mapping
|
43
|
+
|
40
44
|
|
41
45
|
Standard gates
|
42
46
|
==============
|
@@ -56,7 +60,7 @@ For example:
|
|
56
60
|
print(gate.power(1/2).to_matrix()) # √X gate
|
57
61
|
print(gate.control(1).to_matrix()) # CX (controlled X) gate
|
58
62
|
|
59
|
-
..
|
63
|
+
.. code-block:: text
|
60
64
|
|
61
65
|
[[0.+0.j 1.+0.j]
|
62
66
|
[1.+0.j 0.+0.j]]
|
@@ -126,6 +130,7 @@ For example:
|
|
126
130
|
ZGate
|
127
131
|
GlobalPhaseGate
|
128
132
|
|
133
|
+
|
129
134
|
Standard Directives
|
130
135
|
===================
|
131
136
|
|
@@ -152,15 +157,15 @@ set the amount of qubits involved at instantiation time.
|
|
152
157
|
|
153
158
|
.. code-block::
|
154
159
|
|
155
|
-
from qiskit.circuit.library import
|
160
|
+
from qiskit.circuit.library import DiagonalGate
|
156
161
|
|
157
|
-
diagonal =
|
162
|
+
diagonal = DiagonalGate([1, 1j])
|
158
163
|
print(diagonal.num_qubits)
|
159
164
|
|
160
|
-
diagonal =
|
165
|
+
diagonal = DiagonalGate([1, 1, 1, -1])
|
161
166
|
print(diagonal.num_qubits)
|
162
167
|
|
163
|
-
..
|
168
|
+
.. code-block:: text
|
164
169
|
|
165
170
|
1
|
166
171
|
2
|
@@ -181,6 +186,7 @@ set the amount of qubits involved at instantiation time.
|
|
181
186
|
GRX
|
182
187
|
GRY
|
183
188
|
GRZ
|
189
|
+
MCMTGate
|
184
190
|
MCPhaseGate
|
185
191
|
MCXGate
|
186
192
|
MCXGrayCode
|
@@ -210,9 +216,15 @@ or of a set of qubit states.
|
|
210
216
|
:template: autosummary/class_no_inherited_members.rst
|
211
217
|
|
212
218
|
AND
|
219
|
+
AndGate
|
213
220
|
OR
|
221
|
+
OrGate
|
214
222
|
XOR
|
223
|
+
BitwiseXorGate
|
215
224
|
InnerProduct
|
225
|
+
InnerProductGate
|
226
|
+
|
227
|
+
.. autofunction:: random_bitwise_xor
|
216
228
|
|
217
229
|
Basis Change Circuits
|
218
230
|
=====================
|
@@ -314,21 +326,45 @@ Particular Quantum Circuits
|
|
314
326
|
:template: autosummary/class_no_inherited_members.rst
|
315
327
|
|
316
328
|
FourierChecking
|
329
|
+
fourier_checking
|
317
330
|
GraphState
|
331
|
+
GraphStateGate
|
318
332
|
HiddenLinearFunction
|
333
|
+
hidden_linear_function
|
319
334
|
IQP
|
335
|
+
iqp
|
336
|
+
random_iqp
|
320
337
|
QuantumVolume
|
338
|
+
quantum_volume
|
321
339
|
PhaseEstimation
|
340
|
+
phase_estimation
|
322
341
|
GroverOperator
|
342
|
+
grover_operator
|
323
343
|
PhaseOracle
|
324
344
|
PauliEvolutionGate
|
325
345
|
HamiltonianGate
|
326
346
|
UnitaryOverlap
|
347
|
+
unitary_overlap
|
327
348
|
|
328
349
|
|
329
350
|
N-local circuits
|
330
351
|
================
|
331
352
|
|
353
|
+
The following functions return a parameterized :class:`.QuantumCircuit` to use as ansatz in
|
354
|
+
a broad set of variational quantum algorithms:
|
355
|
+
|
356
|
+
.. autosummary::
|
357
|
+
:toctree: ../stubs/
|
358
|
+
:template: autosummary/class_no_inherited_members.rst
|
359
|
+
|
360
|
+
n_local
|
361
|
+
efficient_su2
|
362
|
+
real_amplitudes
|
363
|
+
pauli_two_design
|
364
|
+
excitation_preserving
|
365
|
+
hamiltonian_variational_ansatz
|
366
|
+
evolved_operator_ansatz
|
367
|
+
|
332
368
|
These :class:`~qiskit.circuit.library.BlueprintCircuit` subclasses are used
|
333
369
|
as parameterized models (a.k.a. ansatzes or variational forms) in variational algorithms.
|
334
370
|
They are heavily used in near-term algorithms in e.g. Chemistry, Physics or Optimization.
|
@@ -350,6 +386,17 @@ They are heavily used in near-term algorithms in e.g. Chemistry, Physics or Opti
|
|
350
386
|
Data encoding circuits
|
351
387
|
======================
|
352
388
|
|
389
|
+
The following functions return a parameterized :class:`.QuantumCircuit` to use as data
|
390
|
+
encoding circuits in a series of variational quantum algorithms:
|
391
|
+
|
392
|
+
.. autosummary::
|
393
|
+
:toctree: ../stubs/
|
394
|
+
:template: autosummary/class_no_inherited_members.rst
|
395
|
+
|
396
|
+
pauli_feature_map
|
397
|
+
z_feature_map
|
398
|
+
zz_feature_map
|
399
|
+
|
353
400
|
These :class:`~qiskit.circuit.library.BlueprintCircuit` encode classical
|
354
401
|
data in quantum states and are used as feature maps for classification.
|
355
402
|
|
@@ -500,6 +547,7 @@ from .generalized_gates import (
|
|
500
547
|
Permutation,
|
501
548
|
PermutationGate,
|
502
549
|
GMS,
|
550
|
+
MCMTGate,
|
503
551
|
MSGate,
|
504
552
|
GR,
|
505
553
|
GRX,
|
@@ -520,12 +568,21 @@ from .pauli_evolution import PauliEvolutionGate
|
|
520
568
|
from .hamiltonian_gate import HamiltonianGate
|
521
569
|
from .boolean_logic import (
|
522
570
|
AND,
|
571
|
+
AndGate,
|
523
572
|
OR,
|
573
|
+
OrGate,
|
524
574
|
XOR,
|
575
|
+
BitwiseXorGate,
|
576
|
+
random_bitwise_xor,
|
525
577
|
InnerProduct,
|
578
|
+
InnerProductGate,
|
526
579
|
)
|
527
580
|
from .basis_change import QFT, QFTGate
|
528
581
|
from .arithmetic import (
|
582
|
+
ModularAdderGate,
|
583
|
+
HalfAdderGate,
|
584
|
+
FullAdderGate,
|
585
|
+
MultiplierGate,
|
529
586
|
FunctionalPauliRotations,
|
530
587
|
LinearPauliRotations,
|
531
588
|
PiecewiseLinearPauliRotations,
|
@@ -545,28 +602,40 @@ from .arithmetic import (
|
|
545
602
|
)
|
546
603
|
|
547
604
|
from .n_local import (
|
605
|
+
n_local,
|
548
606
|
NLocal,
|
549
607
|
TwoLocal,
|
608
|
+
pauli_two_design,
|
550
609
|
PauliTwoDesign,
|
610
|
+
real_amplitudes,
|
551
611
|
RealAmplitudes,
|
612
|
+
efficient_su2,
|
552
613
|
EfficientSU2,
|
614
|
+
hamiltonian_variational_ansatz,
|
615
|
+
evolved_operator_ansatz,
|
553
616
|
EvolvedOperatorAnsatz,
|
617
|
+
excitation_preserving,
|
554
618
|
ExcitationPreserving,
|
619
|
+
qaoa_ansatz,
|
555
620
|
QAOAAnsatz,
|
556
621
|
)
|
557
622
|
from .data_preparation import (
|
623
|
+
z_feature_map,
|
624
|
+
zz_feature_map,
|
625
|
+
pauli_feature_map,
|
558
626
|
PauliFeatureMap,
|
559
627
|
ZFeatureMap,
|
560
628
|
ZZFeatureMap,
|
561
629
|
StatePreparation,
|
562
630
|
Initialize,
|
563
631
|
)
|
564
|
-
from .quantum_volume import QuantumVolume
|
565
|
-
from .fourier_checking import FourierChecking
|
566
|
-
from .graph_state import GraphState
|
567
|
-
from .hidden_linear_function import HiddenLinearFunction
|
568
|
-
from .iqp import IQP
|
569
|
-
from .phase_estimation import PhaseEstimation
|
570
|
-
from .grover_operator import GroverOperator
|
632
|
+
from .quantum_volume import QuantumVolume, quantum_volume
|
633
|
+
from .fourier_checking import FourierChecking, fourier_checking
|
634
|
+
from .graph_state import GraphState, GraphStateGate
|
635
|
+
from .hidden_linear_function import HiddenLinearFunction, hidden_linear_function
|
636
|
+
from .iqp import IQP, iqp, random_iqp
|
637
|
+
from .phase_estimation import PhaseEstimation, phase_estimation
|
638
|
+
from .grover_operator import GroverOperator, grover_operator
|
571
639
|
from .phase_oracle import PhaseOracle
|
572
|
-
from .overlap import UnitaryOverlap
|
640
|
+
from .overlap import UnitaryOverlap, unitary_overlap
|
641
|
+
from .standard_gates import get_standard_gate_name_mapping
|
@@ -21,7 +21,14 @@ from .polynomial_pauli_rotations import PolynomialPauliRotations
|
|
21
21
|
from .weighted_adder import WeightedAdder
|
22
22
|
from .quadratic_form import QuadraticForm
|
23
23
|
from .linear_amplitude_function import LinearAmplitudeFunction
|
24
|
-
from .adders import
|
24
|
+
from .adders import (
|
25
|
+
VBERippleCarryAdder,
|
26
|
+
CDKMRippleCarryAdder,
|
27
|
+
DraperQFTAdder,
|
28
|
+
ModularAdderGate,
|
29
|
+
HalfAdderGate,
|
30
|
+
FullAdderGate,
|
31
|
+
)
|
25
32
|
from .piecewise_chebyshev import PiecewiseChebyshev
|
26
|
-
from .multipliers import HRSCumulativeMultiplier, RGQFTMultiplier
|
33
|
+
from .multipliers import HRSCumulativeMultiplier, RGQFTMultiplier, MultiplierGate
|
27
34
|
from .exact_reciprocal import ExactReciprocal
|
@@ -12,7 +12,10 @@
|
|
12
12
|
|
13
13
|
"""Compute the sum of two equally sized qubit registers."""
|
14
14
|
|
15
|
-
from
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from qiskit.circuit import QuantumCircuit, Gate
|
18
|
+
from qiskit.utils.deprecation import deprecate_func
|
16
19
|
|
17
20
|
|
18
21
|
class Adder(QuantumCircuit):
|
@@ -39,6 +42,16 @@ class Adder(QuantumCircuit):
|
|
39
42
|
|
40
43
|
"""
|
41
44
|
|
45
|
+
@deprecate_func(
|
46
|
+
since="1.3",
|
47
|
+
additional_msg=(
|
48
|
+
"Use the adder gates provided in qiskit.circuit.library.arithmetic instead. "
|
49
|
+
"The gate type depends on the adder kind: fixed, half, full are represented by "
|
50
|
+
"ModularAdderGate, HalfAdderGate, FullAdderGate, respectively. For different adder "
|
51
|
+
"implementations, see https://docs.quantum.ibm.com/api/qiskit/synthesis.",
|
52
|
+
),
|
53
|
+
pending=True,
|
54
|
+
)
|
42
55
|
def __init__(self, num_state_qubits: int, name: str = "Adder") -> None:
|
43
56
|
"""
|
44
57
|
Args:
|
@@ -56,3 +69,142 @@ class Adder(QuantumCircuit):
|
|
56
69
|
The number of state qubits.
|
57
70
|
"""
|
58
71
|
return self._num_state_qubits
|
72
|
+
|
73
|
+
|
74
|
+
class HalfAdderGate(Gate):
|
75
|
+
r"""Compute the sum of two equally-sized qubit registers, including a carry-out bit.
|
76
|
+
|
77
|
+
For two registers :math:`|a\rangle_n` and :math:|b\rangle_n` with :math:`n` qubits each, an
|
78
|
+
adder performs the following operation
|
79
|
+
|
80
|
+
.. math::
|
81
|
+
|
82
|
+
|a\rangle_n |b\rangle_n \mapsto |a\rangle_n |a + b\rangle_{n + 1}.
|
83
|
+
|
84
|
+
The quantum register :math:`|a\rangle_n` (and analogously :math:`|b\rangle_n`)
|
85
|
+
|
86
|
+
.. math::
|
87
|
+
|
88
|
+
|a\rangle_n = |a_0\rangle \otimes \cdots \otimes |a_{n - 1}\rangle,
|
89
|
+
|
90
|
+
for :math:`a_i \in \{0, 1\}`, is associated with the integer value
|
91
|
+
|
92
|
+
.. math::
|
93
|
+
|
94
|
+
a = 2^{0}a_{0} + 2^{1}a_{1} + \cdots + 2^{n - 1}a_{n - 1}.
|
95
|
+
|
96
|
+
"""
|
97
|
+
|
98
|
+
def __init__(self, num_state_qubits: int, label: str | None = None) -> None:
|
99
|
+
"""
|
100
|
+
Args:
|
101
|
+
num_state_qubits: The number of qubits in each of the registers.
|
102
|
+
name: The name of the circuit.
|
103
|
+
"""
|
104
|
+
if num_state_qubits < 1:
|
105
|
+
raise ValueError("Need at least 1 state qubit.")
|
106
|
+
|
107
|
+
super().__init__("HalfAdder", 2 * num_state_qubits + 1, [], label=label)
|
108
|
+
self._num_state_qubits = num_state_qubits
|
109
|
+
|
110
|
+
@property
|
111
|
+
def num_state_qubits(self) -> int:
|
112
|
+
"""The number of state qubits, i.e. the number of bits in each input register.
|
113
|
+
|
114
|
+
Returns:
|
115
|
+
The number of state qubits.
|
116
|
+
"""
|
117
|
+
return self._num_state_qubits
|
118
|
+
|
119
|
+
|
120
|
+
class ModularAdderGate(Gate):
|
121
|
+
r"""Compute the sum modulo :math:`2^n` of two :math:`n`-sized qubit registers.
|
122
|
+
|
123
|
+
For two registers :math:`|a\rangle_n` and :math:|b\rangle_n` with :math:`n` qubits each, an
|
124
|
+
adder performs the following operation
|
125
|
+
|
126
|
+
.. math::
|
127
|
+
|
128
|
+
|a\rangle_n |b\rangle_n \mapsto |a\rangle_n |a + b \text{ mod } 2^n\rangle_n.
|
129
|
+
|
130
|
+
The quantum register :math:`|a\rangle_n` (and analogously :math:`|b\rangle_n`)
|
131
|
+
|
132
|
+
.. math::
|
133
|
+
|
134
|
+
|a\rangle_n = |a_0\rangle \otimes \cdots \otimes |a_{n - 1}\rangle,
|
135
|
+
|
136
|
+
for :math:`a_i \in \{0, 1\}`, is associated with the integer value
|
137
|
+
|
138
|
+
.. math::
|
139
|
+
|
140
|
+
a = 2^{0}a_{0} + 2^{1}a_{1} + \cdots + 2^{n - 1}a_{n - 1}.
|
141
|
+
|
142
|
+
"""
|
143
|
+
|
144
|
+
def __init__(self, num_state_qubits: int, label: str | None = None) -> None:
|
145
|
+
"""
|
146
|
+
Args:
|
147
|
+
num_state_qubits: The number of qubits in each of the registers.
|
148
|
+
name: The name of the circuit.
|
149
|
+
"""
|
150
|
+
if num_state_qubits < 1:
|
151
|
+
raise ValueError("Need at least 1 state qubit.")
|
152
|
+
|
153
|
+
super().__init__("ModularAdder", 2 * num_state_qubits, [], label=label)
|
154
|
+
self._num_state_qubits = num_state_qubits
|
155
|
+
|
156
|
+
@property
|
157
|
+
def num_state_qubits(self) -> int:
|
158
|
+
"""The number of state qubits, i.e. the number of bits in each input register.
|
159
|
+
|
160
|
+
Returns:
|
161
|
+
The number of state qubits.
|
162
|
+
"""
|
163
|
+
return self._num_state_qubits
|
164
|
+
|
165
|
+
|
166
|
+
class FullAdderGate(Gate):
|
167
|
+
r"""Compute the sum of two :math:`n`-sized qubit registers, including carry-in and -out bits.
|
168
|
+
|
169
|
+
For two registers :math:`|a\rangle_n` and :math:|b\rangle_n` with :math:`n` qubits each, an
|
170
|
+
adder performs the following operation
|
171
|
+
|
172
|
+
.. math::
|
173
|
+
|
174
|
+
|c_{\text{in}\rangle_1 |a\rangle_n |b\rangle_n
|
175
|
+
\mapsto |a\rangle_n |c_{\text{in}} + a + b \rangle_{n + 1}.
|
176
|
+
|
177
|
+
The quantum register :math:`|a\rangle_n` (and analogously :math:`|b\rangle_n`)
|
178
|
+
|
179
|
+
.. math::
|
180
|
+
|
181
|
+
|a\rangle_n = |a_0\rangle \otimes \cdots \otimes |a_{n - 1}\rangle,
|
182
|
+
|
183
|
+
for :math:`a_i \in \{0, 1\}`, is associated with the integer value
|
184
|
+
|
185
|
+
.. math::
|
186
|
+
|
187
|
+
a = 2^{0}a_{0} + 2^{1}a_{1} + \cdots + 2^{n - 1}a_{n - 1}.
|
188
|
+
|
189
|
+
"""
|
190
|
+
|
191
|
+
def __init__(self, num_state_qubits: int, label: str | None = None) -> None:
|
192
|
+
"""
|
193
|
+
Args:
|
194
|
+
num_state_qubits: The number of qubits in each of the registers.
|
195
|
+
name: The name of the circuit.
|
196
|
+
"""
|
197
|
+
if num_state_qubits < 1:
|
198
|
+
raise ValueError("Need at least 1 state qubit.")
|
199
|
+
|
200
|
+
super().__init__("FullAdder", 2 * num_state_qubits + 2, [], label=label)
|
201
|
+
self._num_state_qubits = num_state_qubits
|
202
|
+
|
203
|
+
@property
|
204
|
+
def num_state_qubits(self) -> int:
|
205
|
+
"""The number of state qubits, i.e. the number of bits in each input register.
|
206
|
+
|
207
|
+
Returns:
|
208
|
+
The number of state qubits.
|
209
|
+
"""
|
210
|
+
return self._num_state_qubits
|
@@ -12,8 +12,7 @@
|
|
12
12
|
|
13
13
|
"""Compute the sum of two qubit registers using ripple-carry approach."""
|
14
14
|
|
15
|
-
from qiskit.
|
16
|
-
|
15
|
+
from qiskit.synthesis.arithmetic import adder_ripple_c04
|
17
16
|
from .adder import Adder
|
18
17
|
|
19
18
|
|
@@ -23,7 +22,7 @@ class CDKMRippleCarryAdder(Adder):
|
|
23
22
|
As an example, a ripple-carry adder circuit that performs addition on two 3-qubit sized
|
24
23
|
registers with a carry-in bit (``kind="full"``) is as follows:
|
25
24
|
|
26
|
-
..
|
25
|
+
.. code-block:: text
|
27
26
|
|
28
27
|
┌──────┐ ┌──────┐
|
29
28
|
cin_0: ┤2 ├─────────────────────────────────────┤2 ├
|
@@ -54,7 +53,7 @@ class CDKMRippleCarryAdder(Adder):
|
|
54
53
|
|
55
54
|
The circuit diagram for the fixed-point adder (``kind="fixed"``) on 3-qubit sized inputs is
|
56
55
|
|
57
|
-
..
|
56
|
+
.. code-block:: text
|
58
57
|
|
59
58
|
┌──────┐┌──────┐ ┌──────┐┌──────┐
|
60
59
|
a_0: ┤0 ├┤2 ├────────────────┤2 ├┤0 ├
|
@@ -75,6 +74,21 @@ class CDKMRippleCarryAdder(Adder):
|
|
75
74
|
It has one less qubit than the full-adder since it doesn't have the carry-out, but uses
|
76
75
|
a helper qubit instead of the carry-in, so it only has one less qubit, not two.
|
77
76
|
|
77
|
+
.. seealso::
|
78
|
+
|
79
|
+
The following generic gate objects perform additions, like this circuit class,
|
80
|
+
but allow the compiler to select the optimal decomposition based on the context.
|
81
|
+
Specific implementations can be set via the :class:`.HLSConfig`, e.g. this circuit
|
82
|
+
can be chosen via ``Adder=["ripple_c04"]``.
|
83
|
+
|
84
|
+
:class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
|
85
|
+
is functionally equivalent to ``kind="fixed"``.
|
86
|
+
|
87
|
+
:class:`.AdderGate`: A generic inplace adder. This
|
88
|
+
is functionally equivalent to ``kind="half"``.
|
89
|
+
|
90
|
+
:class:`.FullAdderGate`: A generic inplace adder, with a carry-in bit. This
|
91
|
+
is functionally equivalent to ``kind="full"``.
|
78
92
|
|
79
93
|
**References:**
|
80
94
|
|
@@ -102,58 +116,8 @@ class CDKMRippleCarryAdder(Adder):
|
|
102
116
|
Raises:
|
103
117
|
ValueError: If ``num_state_qubits`` is lower than 1.
|
104
118
|
"""
|
105
|
-
if num_state_qubits < 1:
|
106
|
-
raise ValueError("The number of qubits must be at least 1.")
|
107
|
-
|
108
119
|
super().__init__(num_state_qubits, name=name)
|
120
|
+
circuit = adder_ripple_c04(num_state_qubits, kind)
|
109
121
|
|
110
|
-
|
111
|
-
qr_c = QuantumRegister(1, name="cin")
|
112
|
-
self.add_register(qr_c)
|
113
|
-
else:
|
114
|
-
qr_c = AncillaRegister(1, name="help")
|
115
|
-
|
116
|
-
qr_a = QuantumRegister(num_state_qubits, name="a")
|
117
|
-
qr_b = QuantumRegister(num_state_qubits, name="b")
|
118
|
-
self.add_register(qr_a, qr_b)
|
119
|
-
|
120
|
-
if kind in ["full", "half"]:
|
121
|
-
qr_z = QuantumRegister(1, name="cout")
|
122
|
-
self.add_register(qr_z)
|
123
|
-
|
124
|
-
if kind != "full":
|
125
|
-
self.add_register(qr_c)
|
126
|
-
|
127
|
-
# build carry circuit for majority of 3 bits in-place
|
128
|
-
# corresponds to MAJ gate in [1]
|
129
|
-
qc_maj = QuantumCircuit(3, name="MAJ")
|
130
|
-
qc_maj.cx(0, 1)
|
131
|
-
qc_maj.cx(0, 2)
|
132
|
-
qc_maj.ccx(2, 1, 0)
|
133
|
-
maj_gate = qc_maj.to_gate()
|
134
|
-
|
135
|
-
# build circuit for reversing carry operation
|
136
|
-
# corresponds to UMA gate in [1]
|
137
|
-
qc_uma = QuantumCircuit(3, name="UMA")
|
138
|
-
qc_uma.ccx(2, 1, 0)
|
139
|
-
qc_uma.cx(0, 2)
|
140
|
-
qc_uma.cx(2, 1)
|
141
|
-
uma_gate = qc_uma.to_gate()
|
142
|
-
|
143
|
-
circuit = QuantumCircuit(*self.qregs, name=name)
|
144
|
-
|
145
|
-
# build ripple-carry adder circuit
|
146
|
-
circuit.append(maj_gate, [qr_a[0], qr_b[0], qr_c[0]])
|
147
|
-
|
148
|
-
for i in range(num_state_qubits - 1):
|
149
|
-
circuit.append(maj_gate, [qr_a[i + 1], qr_b[i + 1], qr_a[i]])
|
150
|
-
|
151
|
-
if kind in ["full", "half"]:
|
152
|
-
circuit.cx(qr_a[-1], qr_z[0])
|
153
|
-
|
154
|
-
for i in reversed(range(num_state_qubits - 1)):
|
155
|
-
circuit.append(uma_gate, [qr_a[i + 1], qr_b[i + 1], qr_a[i]])
|
156
|
-
|
157
|
-
circuit.append(uma_gate, [qr_a[0], qr_b[0], qr_c[0]])
|
158
|
-
|
122
|
+
self.add_register(*circuit.qregs)
|
159
123
|
self.append(circuit.to_gate(), self.qubits)
|
@@ -31,7 +31,7 @@ class DraperQFTAdder(Adder):
|
|
31
31
|
As an example, a non-fixed_point QFT adder circuit that performs addition on two 2-qubit sized
|
32
32
|
registers is as follows:
|
33
33
|
|
34
|
-
..
|
34
|
+
.. code-block:: text
|
35
35
|
|
36
36
|
a_0: ─────────■──────■────────────────────────■────────────────
|
37
37
|
│ │ │
|
@@ -44,6 +44,19 @@ class DraperQFTAdder(Adder):
|
|
44
44
|
cout_0: ┤2 ├────────────────────────■────────■───────┤2 ├
|
45
45
|
└──────┘ └───────┘
|
46
46
|
|
47
|
+
.. seealso::
|
48
|
+
|
49
|
+
The following generic gate objects perform additions, like this circuit class,
|
50
|
+
but allow the compiler to select the optimal decomposition based on the context.
|
51
|
+
Specific implementations can be set via the :class:`.HLSConfig`, e.g. this
|
52
|
+
circuit can be chosen via ``Adder=["qft_d00"]``.
|
53
|
+
|
54
|
+
:class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
|
55
|
+
is functionally equivalent to ``kind="fixed"``.
|
56
|
+
|
57
|
+
:class:`.AdderGate`: A generic inplace adder. This
|
58
|
+
is functionally equivalent to ``kind="half"``.
|
59
|
+
|
47
60
|
**References:**
|
48
61
|
|
49
62
|
[1] T. G. Draper, Addition on a Quantum Computer, 2000.
|
@@ -11,11 +11,9 @@
|
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
13
|
"""Compute the sum of two qubit registers using Classical Addition."""
|
14
|
-
from __future__ import annotations
|
15
|
-
from qiskit.circuit.bit import Bit
|
16
|
-
|
17
|
-
from qiskit.circuit import QuantumCircuit, QuantumRegister, AncillaRegister
|
18
14
|
|
15
|
+
from __future__ import annotations
|
16
|
+
from qiskit.synthesis.arithmetic import adder_ripple_v95
|
19
17
|
from .adder import Adder
|
20
18
|
|
21
19
|
|
@@ -26,7 +24,7 @@ class VBERippleCarryAdder(Adder):
|
|
26
24
|
As an example, a classical adder circuit that performs full addition (i.e. including
|
27
25
|
a carry-in bit) on two 2-qubit sized registers is as follows:
|
28
26
|
|
29
|
-
..
|
27
|
+
.. code-block:: text
|
30
28
|
|
31
29
|
┌────────┐ ┌───────────┐┌──────┐
|
32
30
|
cin_0: ┤0 ├───────────────────────┤0 ├┤0 ├
|
@@ -52,6 +50,22 @@ class VBERippleCarryAdder(Adder):
|
|
52
50
|
This is different ordering as compared to Figure 2 in [1], which leads to a different
|
53
51
|
drawing of the circuit.
|
54
52
|
|
53
|
+
.. seealso::
|
54
|
+
|
55
|
+
The following generic gate objects perform additions, like this circuit class,
|
56
|
+
but allow the compiler to select the optimal decomposition based on the context.
|
57
|
+
Specific implementations can be set via the :class:`.HLSConfig`, e.g. this circuit
|
58
|
+
can be chosen via ``Adder=["ripple_v95"]``.
|
59
|
+
|
60
|
+
:class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
|
61
|
+
is functionally equivalent to ``kind="fixed"``.
|
62
|
+
|
63
|
+
:class:`.AdderGate`: A generic inplace adder. This
|
64
|
+
is functionally equivalent to ``kind="half"``.
|
65
|
+
|
66
|
+
:class:`.FullAdderGate`: A generic inplace adder, with a carry-in bit. This
|
67
|
+
is functionally equivalent to ``kind="full"``.
|
68
|
+
|
55
69
|
**References:**
|
56
70
|
|
57
71
|
[1] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995.
|
@@ -74,92 +88,8 @@ class VBERippleCarryAdder(Adder):
|
|
74
88
|
Raises:
|
75
89
|
ValueError: If ``num_state_qubits`` is lower than 1.
|
76
90
|
"""
|
77
|
-
if num_state_qubits < 1:
|
78
|
-
raise ValueError("The number of qubits must be at least 1.")
|
79
|
-
|
80
91
|
super().__init__(num_state_qubits, name=name)
|
92
|
+
circuit = adder_ripple_v95(num_state_qubits, kind)
|
81
93
|
|
82
|
-
|
83
|
-
registers: list[QuantumRegister | list[Bit]] = []
|
84
|
-
if kind == "full":
|
85
|
-
qr_cin = QuantumRegister(1, name="cin")
|
86
|
-
registers.append(qr_cin)
|
87
|
-
else:
|
88
|
-
qr_cin = QuantumRegister(0)
|
89
|
-
|
90
|
-
qr_a = QuantumRegister(num_state_qubits, name="a")
|
91
|
-
qr_b = QuantumRegister(num_state_qubits, name="b")
|
92
|
-
|
93
|
-
registers += [qr_a, qr_b]
|
94
|
-
|
95
|
-
if kind in ["half", "full"]:
|
96
|
-
qr_cout = QuantumRegister(1, name="cout")
|
97
|
-
registers.append(qr_cout)
|
98
|
-
else:
|
99
|
-
qr_cout = QuantumRegister(0)
|
100
|
-
|
101
|
-
self.add_register(*registers)
|
102
|
-
|
103
|
-
if num_state_qubits > 1:
|
104
|
-
qr_help = AncillaRegister(num_state_qubits - 1, name="helper")
|
105
|
-
self.add_register(qr_help)
|
106
|
-
else:
|
107
|
-
qr_help = AncillaRegister(0)
|
108
|
-
|
109
|
-
# the code is simplified a lot if we create a list of all carries and helpers
|
110
|
-
carries = qr_cin[:] + qr_help[:] + qr_cout[:]
|
111
|
-
|
112
|
-
# corresponds to Carry gate in [1]
|
113
|
-
qc_carry = QuantumCircuit(4, name="Carry")
|
114
|
-
qc_carry.ccx(1, 2, 3)
|
115
|
-
qc_carry.cx(1, 2)
|
116
|
-
qc_carry.ccx(0, 2, 3)
|
117
|
-
carry_gate = qc_carry.to_gate()
|
118
|
-
carry_gate_dg = carry_gate.inverse()
|
119
|
-
|
120
|
-
# corresponds to Sum gate in [1]
|
121
|
-
qc_sum = QuantumCircuit(3, name="Sum")
|
122
|
-
qc_sum.cx(1, 2)
|
123
|
-
qc_sum.cx(0, 2)
|
124
|
-
sum_gate = qc_sum.to_gate()
|
125
|
-
|
126
|
-
circuit = QuantumCircuit(*self.qregs, name=name)
|
127
|
-
|
128
|
-
# handle all cases for the first qubits, depending on whether cin is available
|
129
|
-
i = 0
|
130
|
-
if kind == "half":
|
131
|
-
i += 1
|
132
|
-
circuit.ccx(qr_a[0], qr_b[0], carries[0])
|
133
|
-
elif kind == "fixed":
|
134
|
-
i += 1
|
135
|
-
if num_state_qubits == 1:
|
136
|
-
circuit.cx(qr_a[0], qr_b[0])
|
137
|
-
else:
|
138
|
-
circuit.ccx(qr_a[0], qr_b[0], carries[0])
|
139
|
-
|
140
|
-
for inp, out in zip(carries[:-1], carries[1:]):
|
141
|
-
circuit.append(carry_gate, [inp, qr_a[i], qr_b[i], out])
|
142
|
-
i += 1
|
143
|
-
|
144
|
-
if kind in ["full", "half"]: # final CX (cancels for the 'fixed' case)
|
145
|
-
circuit.cx(qr_a[-1], qr_b[-1])
|
146
|
-
|
147
|
-
if len(carries) > 1:
|
148
|
-
circuit.append(sum_gate, [carries[-2], qr_a[-1], qr_b[-1]])
|
149
|
-
|
150
|
-
i -= 2
|
151
|
-
for j, (inp, out) in enumerate(zip(reversed(carries[:-1]), reversed(carries[1:]))):
|
152
|
-
if j == 0:
|
153
|
-
if kind == "fixed":
|
154
|
-
i += 1
|
155
|
-
else:
|
156
|
-
continue
|
157
|
-
circuit.append(carry_gate_dg, [inp, qr_a[i], qr_b[i], out])
|
158
|
-
circuit.append(sum_gate, [inp, qr_a[i], qr_b[i]])
|
159
|
-
i -= 1
|
160
|
-
|
161
|
-
if kind in ["half", "fixed"] and num_state_qubits > 1:
|
162
|
-
circuit.ccx(qr_a[0], qr_b[0], carries[0])
|
163
|
-
circuit.cx(qr_a[0], qr_b[0])
|
164
|
-
|
94
|
+
self.add_register(*circuit.qregs)
|
165
95
|
self.append(circuit.to_gate(), self.qubits)
|
@@ -27,7 +27,7 @@ class LinearPauliRotations(FunctionalPauliRotations):
|
|
27
27
|
For a register of state qubits :math:`|x\rangle`, a target qubit :math:`|0\rangle` and the
|
28
28
|
basis ``'Y'`` this circuit acts as:
|
29
29
|
|
30
|
-
..
|
30
|
+
.. code-block:: text
|
31
31
|
|
32
32
|
q_0: ─────────────────────────■───────── ... ──────────────────────
|
33
33
|
│
|