qiskit 1.3.0b1__cp39-abi3-win32.whl → 1.3.0rc2__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 +20 -1
- qiskit/_accelerate.pyd +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 +110 -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 +154 -2
- 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/primitives/utils.py +1 -1
- qiskit/providers/__init__.py +3 -3
- 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 +6 -6
- 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 +48 -131
- 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 +262 -99
- 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 +125 -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.0rc2.dist-info}/METADATA +9 -8
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/RECORD +357 -346
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/WHEEL +1 -1
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.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.0rc2.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.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
|
224
|
+
random_bitwise_xor
|
215
225
|
InnerProduct
|
226
|
+
InnerProductGate
|
227
|
+
|
216
228
|
|
217
229
|
Basis Change Circuits
|
218
230
|
=====================
|
@@ -268,6 +280,9 @@ Adders
|
|
268
280
|
CDKMRippleCarryAdder
|
269
281
|
VBERippleCarryAdder
|
270
282
|
WeightedAdder
|
283
|
+
ModularAdderGate
|
284
|
+
HalfAdderGate
|
285
|
+
FullAdderGate
|
271
286
|
|
272
287
|
Multipliers
|
273
288
|
-----------
|
@@ -278,6 +293,7 @@ Multipliers
|
|
278
293
|
|
279
294
|
HRSCumulativeMultiplier
|
280
295
|
RGQFTMultiplier
|
296
|
+
MultiplierGate
|
281
297
|
|
282
298
|
Comparators
|
283
299
|
-----------
|
@@ -309,12 +325,16 @@ Other arithmetic functions
|
|
309
325
|
Particular Quantum Circuits
|
310
326
|
===========================
|
311
327
|
|
328
|
+
The following gates and quantum circuits define specific
|
329
|
+
quantum circuits of interest:
|
330
|
+
|
312
331
|
.. autosummary::
|
313
332
|
:toctree: ../stubs/
|
314
333
|
:template: autosummary/class_no_inherited_members.rst
|
315
334
|
|
316
335
|
FourierChecking
|
317
336
|
GraphState
|
337
|
+
GraphStateGate
|
318
338
|
HiddenLinearFunction
|
319
339
|
IQP
|
320
340
|
QuantumVolume
|
@@ -325,10 +345,42 @@ Particular Quantum Circuits
|
|
325
345
|
HamiltonianGate
|
326
346
|
UnitaryOverlap
|
327
347
|
|
348
|
+
For circuits that have a well-defined structure it is preferrable
|
349
|
+
to use the following functions to construct them:
|
350
|
+
|
351
|
+
.. autosummary::
|
352
|
+
:toctree: ../stubs/
|
353
|
+
:template: autosummary/class_no_inherited_members.rst
|
354
|
+
|
355
|
+
fourier_checking
|
356
|
+
hidden_linear_function
|
357
|
+
iqp
|
358
|
+
random_iqp
|
359
|
+
quantum_volume
|
360
|
+
phase_estimation
|
361
|
+
grover_operator
|
362
|
+
unitary_overlap
|
363
|
+
|
328
364
|
|
329
365
|
N-local circuits
|
330
366
|
================
|
331
367
|
|
368
|
+
The following functions return a parameterized :class:`.QuantumCircuit` to use as ansatz in
|
369
|
+
a broad set of variational quantum algorithms:
|
370
|
+
|
371
|
+
.. autosummary::
|
372
|
+
:toctree: ../stubs/
|
373
|
+
:template: autosummary/class_no_inherited_members.rst
|
374
|
+
|
375
|
+
n_local
|
376
|
+
efficient_su2
|
377
|
+
real_amplitudes
|
378
|
+
pauli_two_design
|
379
|
+
excitation_preserving
|
380
|
+
qaoa_ansatz
|
381
|
+
hamiltonian_variational_ansatz
|
382
|
+
evolved_operator_ansatz
|
383
|
+
|
332
384
|
These :class:`~qiskit.circuit.library.BlueprintCircuit` subclasses are used
|
333
385
|
as parameterized models (a.k.a. ansatzes or variational forms) in variational algorithms.
|
334
386
|
They are heavily used in near-term algorithms in e.g. Chemistry, Physics or Optimization.
|
@@ -350,6 +402,17 @@ They are heavily used in near-term algorithms in e.g. Chemistry, Physics or Opti
|
|
350
402
|
Data encoding circuits
|
351
403
|
======================
|
352
404
|
|
405
|
+
The following functions return a parameterized :class:`.QuantumCircuit` to use as data
|
406
|
+
encoding circuits in a series of variational quantum algorithms:
|
407
|
+
|
408
|
+
.. autosummary::
|
409
|
+
:toctree: ../stubs/
|
410
|
+
:template: autosummary/class_no_inherited_members.rst
|
411
|
+
|
412
|
+
pauli_feature_map
|
413
|
+
z_feature_map
|
414
|
+
zz_feature_map
|
415
|
+
|
353
416
|
These :class:`~qiskit.circuit.library.BlueprintCircuit` encode classical
|
354
417
|
data in quantum states and are used as feature maps for classification.
|
355
418
|
|
@@ -360,6 +423,17 @@ data in quantum states and are used as feature maps for classification.
|
|
360
423
|
PauliFeatureMap
|
361
424
|
ZFeatureMap
|
362
425
|
ZZFeatureMap
|
426
|
+
|
427
|
+
|
428
|
+
Data preparation circuits
|
429
|
+
=========================
|
430
|
+
|
431
|
+
The following operations are used for state preparation:
|
432
|
+
|
433
|
+
.. autosummary::
|
434
|
+
:toctree: ../stubs/
|
435
|
+
:template: autosummary/class_no_inherited_members.rst
|
436
|
+
|
363
437
|
StatePreparation
|
364
438
|
Initialize
|
365
439
|
|
@@ -500,6 +574,7 @@ from .generalized_gates import (
|
|
500
574
|
Permutation,
|
501
575
|
PermutationGate,
|
502
576
|
GMS,
|
577
|
+
MCMTGate,
|
503
578
|
MSGate,
|
504
579
|
GR,
|
505
580
|
GRX,
|
@@ -520,12 +595,21 @@ from .pauli_evolution import PauliEvolutionGate
|
|
520
595
|
from .hamiltonian_gate import HamiltonianGate
|
521
596
|
from .boolean_logic import (
|
522
597
|
AND,
|
598
|
+
AndGate,
|
523
599
|
OR,
|
600
|
+
OrGate,
|
524
601
|
XOR,
|
602
|
+
BitwiseXorGate,
|
603
|
+
random_bitwise_xor,
|
525
604
|
InnerProduct,
|
605
|
+
InnerProductGate,
|
526
606
|
)
|
527
607
|
from .basis_change import QFT, QFTGate
|
528
608
|
from .arithmetic import (
|
609
|
+
ModularAdderGate,
|
610
|
+
HalfAdderGate,
|
611
|
+
FullAdderGate,
|
612
|
+
MultiplierGate,
|
529
613
|
FunctionalPauliRotations,
|
530
614
|
LinearPauliRotations,
|
531
615
|
PiecewiseLinearPauliRotations,
|
@@ -545,28 +629,40 @@ from .arithmetic import (
|
|
545
629
|
)
|
546
630
|
|
547
631
|
from .n_local import (
|
632
|
+
n_local,
|
548
633
|
NLocal,
|
549
634
|
TwoLocal,
|
635
|
+
pauli_two_design,
|
550
636
|
PauliTwoDesign,
|
637
|
+
real_amplitudes,
|
551
638
|
RealAmplitudes,
|
639
|
+
efficient_su2,
|
552
640
|
EfficientSU2,
|
641
|
+
hamiltonian_variational_ansatz,
|
642
|
+
evolved_operator_ansatz,
|
553
643
|
EvolvedOperatorAnsatz,
|
644
|
+
excitation_preserving,
|
554
645
|
ExcitationPreserving,
|
646
|
+
qaoa_ansatz,
|
555
647
|
QAOAAnsatz,
|
556
648
|
)
|
557
649
|
from .data_preparation import (
|
650
|
+
z_feature_map,
|
651
|
+
zz_feature_map,
|
652
|
+
pauli_feature_map,
|
558
653
|
PauliFeatureMap,
|
559
654
|
ZFeatureMap,
|
560
655
|
ZZFeatureMap,
|
561
656
|
StatePreparation,
|
562
657
|
Initialize,
|
563
658
|
)
|
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
|
659
|
+
from .quantum_volume import QuantumVolume, quantum_volume
|
660
|
+
from .fourier_checking import FourierChecking, fourier_checking
|
661
|
+
from .graph_state import GraphState, GraphStateGate
|
662
|
+
from .hidden_linear_function import HiddenLinearFunction, hidden_linear_function
|
663
|
+
from .iqp import IQP, iqp, random_iqp
|
664
|
+
from .phase_estimation import PhaseEstimation, phase_estimation
|
665
|
+
from .grover_operator import GroverOperator, grover_operator
|
571
666
|
from .phase_oracle import PhaseOracle
|
572
|
-
from .overlap import UnitaryOverlap
|
667
|
+
from .overlap import UnitaryOverlap, unitary_overlap
|
668
|
+
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,13 +12,16 @@
|
|
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):
|
19
22
|
r"""Compute the sum of two equally sized qubit registers.
|
20
23
|
|
21
|
-
For two registers :math:`|a\rangle_n` and :math
|
24
|
+
For two registers :math:`|a\rangle_n` and :math:`|b\rangle_n` with :math:`n` qubits each, an
|
22
25
|
adder performs the following operation
|
23
26
|
|
24
27
|
.. math::
|
@@ -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.
|