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
@@ -1,20 +1,4 @@
|
|
1
1
|
[qiskit.synthesis]
|
2
|
-
FullAdder.default = qiskit.transpiler.passes.synthesis.hls_plugins:FullAdderSynthesisC04
|
3
|
-
FullAdder.ripple_c04 = qiskit.transpiler.passes.synthesis.hls_plugins:FullAdderSynthesisC04
|
4
|
-
FullAdder.ripple_v95 = qiskit.transpiler.passes.synthesis.hls_plugins:FullAdderSynthesisV95
|
5
|
-
HalfAdder.default = qiskit.transpiler.passes.synthesis.hls_plugins:HalfAdderSynthesisDefault
|
6
|
-
HalfAdder.qft_d00 = qiskit.transpiler.passes.synthesis.hls_plugins:HalfAdderSynthesisD00
|
7
|
-
HalfAdder.ripple_c04 = qiskit.transpiler.passes.synthesis.hls_plugins:HalfAdderSynthesisC04
|
8
|
-
HalfAdder.ripple_v95 = qiskit.transpiler.passes.synthesis.hls_plugins:HalfAdderSynthesisV95
|
9
|
-
ModularAdder.default = qiskit.transpiler.passes.synthesis.hls_plugins:ModularAdderSynthesisDefault
|
10
|
-
ModularAdder.qft_d00 = qiskit.transpiler.passes.synthesis.hls_plugins:ModularAdderSynthesisD00
|
11
|
-
ModularAdder.ripple_c04 = qiskit.transpiler.passes.synthesis.hls_plugins:ModularAdderSynthesisC04
|
12
|
-
ModularAdder.ripple_v95 = qiskit.transpiler.passes.synthesis.hls_plugins:ModularAdderSynthesisV95
|
13
|
-
Multiplier.cumulative_h18 = qiskit.transpiler.passes.synthesis.hls_plugins:MultiplierSynthesisH18
|
14
|
-
Multiplier.default = qiskit.transpiler.passes.synthesis.hls_plugins:MultiplierSynthesisR17
|
15
|
-
Multiplier.qft_r17 = qiskit.transpiler.passes.synthesis.hls_plugins:MultiplierSynthesisR17
|
16
|
-
PauliEvolution.default = qiskit.transpiler.passes.synthesis.hls_plugins:PauliEvolutionSynthesisDefault
|
17
|
-
PauliEvolution.rustiq = qiskit.transpiler.passes.synthesis.hls_plugins:PauliEvolutionSynthesisRustiq
|
18
2
|
clifford.ag = qiskit.transpiler.passes.synthesis.hls_plugins:AGSynthesisClifford
|
19
3
|
clifford.bm = qiskit.transpiler.passes.synthesis.hls_plugins:BMSynthesisClifford
|
20
4
|
clifford.default = qiskit.transpiler.passes.synthesis.hls_plugins:DefaultSynthesisClifford
|
@@ -24,9 +8,6 @@ clifford.lnn = qiskit.transpiler.passes.synthesis.hls_plugins:LayerLnnSynthesisC
|
|
24
8
|
linear_function.default = qiskit.transpiler.passes.synthesis.hls_plugins:DefaultSynthesisLinearFunction
|
25
9
|
linear_function.kms = qiskit.transpiler.passes.synthesis.hls_plugins:KMSSynthesisLinearFunction
|
26
10
|
linear_function.pmh = qiskit.transpiler.passes.synthesis.hls_plugins:PMHSynthesisLinearFunction
|
27
|
-
mcmt.default = qiskit.transpiler.passes.synthesis.hls_plugins:MCMTSynthesisDefault
|
28
|
-
mcmt.noaux = qiskit.transpiler.passes.synthesis.hls_plugins:MCMTSynthesisNoAux
|
29
|
-
mcmt.vchain = qiskit.transpiler.passes.synthesis.hls_plugins:MCMTSynthesisVChain
|
30
11
|
mcx.1_clean_b95 = qiskit.transpiler.passes.synthesis.hls_plugins:MCXSynthesis1CleanB95
|
31
12
|
mcx.default = qiskit.transpiler.passes.synthesis.hls_plugins:MCXSynthesisDefault
|
32
13
|
mcx.gray_code = qiskit.transpiler.passes.synthesis.hls_plugins:MCXSynthesisGrayCode
|
@@ -1,150 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2017, 2020.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""Second-order Pauli-Z expansion circuit."""
|
14
|
-
|
15
|
-
from typing import Callable, List, Union, Optional, Dict, Tuple
|
16
|
-
import numpy as np
|
17
|
-
from qiskit.utils.deprecation import deprecate_func
|
18
|
-
from .pauli_feature_map import PauliFeatureMap
|
19
|
-
|
20
|
-
|
21
|
-
class ZZFeatureMap(PauliFeatureMap):
|
22
|
-
r"""Second-order Pauli-Z evolution circuit.
|
23
|
-
|
24
|
-
For 3 qubits and 1 repetition and linear entanglement the circuit is represented by:
|
25
|
-
|
26
|
-
.. code-block:: text
|
27
|
-
|
28
|
-
┌───┐┌────────────────┐
|
29
|
-
┤ H ├┤ P(2.0*φ(x[0])) ├──■───────────────────────────■───────────────────────────────────
|
30
|
-
├───┤├────────────────┤┌─┴─┐┌─────────────────────┐┌─┴─┐
|
31
|
-
┤ H ├┤ P(2.0*φ(x[1])) ├┤ X ├┤ P(2.0*φ(x[0],x[1])) ├┤ X ├──■───────────────────────────■──
|
32
|
-
├───┤├────────────────┤└───┘└─────────────────────┘└───┘┌─┴─┐┌─────────────────────┐┌─┴─┐
|
33
|
-
┤ H ├┤ P(2.0*φ(x[2])) ├─────────────────────────────────┤ X ├┤ P(2.0*φ(x[1],x[2])) ├┤ X ├
|
34
|
-
└───┘└────────────────┘ └───┘└─────────────────────┘└───┘
|
35
|
-
|
36
|
-
where :math:`\varphi` is a classical non-linear function, which defaults to :math:`\varphi(x) = x`
|
37
|
-
if and :math:`\varphi(x,y) = (\pi - x)(\pi - y)`.
|
38
|
-
|
39
|
-
Examples:
|
40
|
-
|
41
|
-
.. code-block::
|
42
|
-
|
43
|
-
from qiskit.circuit.library import ZZFeatureMap
|
44
|
-
prep = ZZFeatureMap(2, reps=1)
|
45
|
-
print(prep.decompose())
|
46
|
-
|
47
|
-
.. code-block:: text
|
48
|
-
|
49
|
-
┌───┐┌─────────────┐
|
50
|
-
q_0: ┤ H ├┤ P(2.0*x[0]) ├──■──────────────────────────────────────■──
|
51
|
-
├───┤├─────────────┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐
|
52
|
-
q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
|
53
|
-
└───┘└─────────────┘└───┘└────────────────────────────────┘└───┘
|
54
|
-
|
55
|
-
.. code-block::
|
56
|
-
|
57
|
-
from qiskit.circuit.library import EfficientSU2
|
58
|
-
classifier = ZZFeatureMap(3).compose(EfficientSU2(3))
|
59
|
-
classifier.num_parameters
|
60
|
-
|
61
|
-
.. code-block:: text
|
62
|
-
|
63
|
-
27
|
64
|
-
|
65
|
-
.. code-block::
|
66
|
-
|
67
|
-
classifier.parameters # 'x' for the data preparation, 'θ' for the SU2 parameters
|
68
|
-
|
69
|
-
.. code-block:: text
|
70
|
-
|
71
|
-
ParameterView([
|
72
|
-
ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
|
73
|
-
ParameterVectorElement(x[2]), ParameterVectorElement(θ[0]),
|
74
|
-
ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]),
|
75
|
-
ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]),
|
76
|
-
ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]),
|
77
|
-
ParameterVectorElement(θ[7]), ParameterVectorElement(θ[8]),
|
78
|
-
ParameterVectorElement(θ[9]), ParameterVectorElement(θ[10]),
|
79
|
-
ParameterVectorElement(θ[11]), ParameterVectorElement(θ[12]),
|
80
|
-
ParameterVectorElement(θ[13]), ParameterVectorElement(θ[14]),
|
81
|
-
ParameterVectorElement(θ[15]), ParameterVectorElement(θ[16]),
|
82
|
-
ParameterVectorElement(θ[17]), ParameterVectorElement(θ[18]),
|
83
|
-
ParameterVectorElement(θ[19]), ParameterVectorElement(θ[20]),
|
84
|
-
ParameterVectorElement(θ[21]), ParameterVectorElement(θ[22]),
|
85
|
-
ParameterVectorElement(θ[23])
|
86
|
-
])
|
87
|
-
|
88
|
-
.. code-block::
|
89
|
-
|
90
|
-
classifier.count_ops()
|
91
|
-
|
92
|
-
.. code-block:: text
|
93
|
-
|
94
|
-
OrderedDict([('ZZFeatureMap', 1), ('EfficientSU2', 1)])
|
95
|
-
|
96
|
-
"""
|
97
|
-
|
98
|
-
@deprecate_func(
|
99
|
-
since="1.3",
|
100
|
-
additional_msg=(
|
101
|
-
"Use the z_feature_map function as a replacement. Note that this will no longer "
|
102
|
-
"return a BlueprintCircuit, but just a plain QuantumCircuit."
|
103
|
-
),
|
104
|
-
pending=True,
|
105
|
-
)
|
106
|
-
def __init__(
|
107
|
-
self,
|
108
|
-
feature_dimension: int,
|
109
|
-
reps: int = 2,
|
110
|
-
entanglement: Union[
|
111
|
-
str,
|
112
|
-
Dict[int, List[Tuple[int]]],
|
113
|
-
Callable[[int], Union[str, Dict[int, List[Tuple[int]]]]],
|
114
|
-
] = "full",
|
115
|
-
data_map_func: Optional[Callable[[np.ndarray], float]] = None,
|
116
|
-
parameter_prefix: str = "x",
|
117
|
-
insert_barriers: bool = False,
|
118
|
-
name: str = "ZZFeatureMap",
|
119
|
-
) -> None:
|
120
|
-
"""Create a new second-order Pauli-Z expansion.
|
121
|
-
|
122
|
-
Args:
|
123
|
-
feature_dimension: Number of features.
|
124
|
-
reps: The number of repeated circuits, has a min. value of 1.
|
125
|
-
entanglement: Specifies the entanglement structure. Refer to
|
126
|
-
:class:`~qiskit.circuit.library.PauliFeatureMap` for detail.
|
127
|
-
data_map_func: A mapping function for data x.
|
128
|
-
parameter_prefix: The prefix used if default parameters are generated.
|
129
|
-
insert_barriers: If True, barriers are inserted in between the evolution instructions
|
130
|
-
and hadamard layers.
|
131
|
-
|
132
|
-
Raises:
|
133
|
-
ValueError: If the feature dimension is smaller than 2.
|
134
|
-
"""
|
135
|
-
if feature_dimension < 2:
|
136
|
-
raise ValueError(
|
137
|
-
"The ZZFeatureMap contains 2-local interactions and cannot be "
|
138
|
-
f"defined for less than 2 qubits. You provided {feature_dimension}."
|
139
|
-
)
|
140
|
-
|
141
|
-
super().__init__(
|
142
|
-
feature_dimension=feature_dimension,
|
143
|
-
reps=reps,
|
144
|
-
entanglement=entanglement,
|
145
|
-
paulis=["Z", "ZZ"],
|
146
|
-
data_map_func=data_map_func,
|
147
|
-
parameter_prefix=parameter_prefix,
|
148
|
-
insert_barriers=insert_barriers,
|
149
|
-
name=name,
|
150
|
-
)
|
qiskit/circuit/twirling.py
DELETED
@@ -1,145 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2024
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""The twirling module."""
|
14
|
-
|
15
|
-
from __future__ import annotations
|
16
|
-
import typing
|
17
|
-
|
18
|
-
from qiskit._accelerate.twirling import twirl_circuit as twirl_rs
|
19
|
-
from qiskit.circuit.quantumcircuit import QuantumCircuit, _copy_metadata
|
20
|
-
from qiskit.circuit.gate import Gate
|
21
|
-
from qiskit.circuit.library.standard_gates import CXGate, ECRGate, CZGate, iSwapGate
|
22
|
-
from qiskit.exceptions import QiskitError
|
23
|
-
|
24
|
-
if typing.TYPE_CHECKING:
|
25
|
-
from qiskit.transpiler.target import Target
|
26
|
-
|
27
|
-
|
28
|
-
NAME_TO_CLASS = {
|
29
|
-
"cx": CXGate._standard_gate,
|
30
|
-
"ecr": ECRGate._standard_gate,
|
31
|
-
"cz": CZGate._standard_gate,
|
32
|
-
"iswap": iSwapGate._standard_gate,
|
33
|
-
}
|
34
|
-
|
35
|
-
|
36
|
-
def pauli_twirl_2q_gates(
|
37
|
-
circuit: QuantumCircuit,
|
38
|
-
twirling_gate: None | str | Gate | list[str] | list[Gate] = None,
|
39
|
-
seed: int | None = None,
|
40
|
-
num_twirls: int | None = None,
|
41
|
-
target: Target | None = None,
|
42
|
-
) -> QuantumCircuit | list[QuantumCircuit]:
|
43
|
-
"""Create copies of a given circuit with Pauli twirling applied around specified two qubit
|
44
|
-
gates.
|
45
|
-
|
46
|
-
If you're running this function with the intent to twirl a circuit to run on hardware this
|
47
|
-
may not be the most efficient way to perform twirling. Especially if the hardware vendor
|
48
|
-
has implemented the :mod:`.primitives` execution interface with :class:`.SamplerV2` and
|
49
|
-
:class:`.EstimatorV2` this most likely is not the best way to apply twirling to your
|
50
|
-
circuit and you'll want to refer to the implementation of :class:`.SamplerV2` and/or
|
51
|
-
:class:`.EstimatorV2` for the specified hardware vendor.
|
52
|
-
|
53
|
-
If the intent of this function is to be run after :func:`.transpile` or
|
54
|
-
:meth:`.PassManager.run` the optional ``target`` argument can be used
|
55
|
-
so that the inserted 1 qubit Pauli gates are synthesized to be
|
56
|
-
compatible with the given :class:`.Target` so the output circuit(s) are
|
57
|
-
still compatible.
|
58
|
-
|
59
|
-
Args:
|
60
|
-
circuit: The circuit to twirl
|
61
|
-
twirling_gate: The gate to twirl, defaults to `None` which means twirl all default gates:
|
62
|
-
:class:`.CXGate`, :class:`.CZGate`, :class:`.ECRGate`, and :class:`.iSwapGate`.
|
63
|
-
If supplied it can either be a single gate or a list of gates either as either a gate
|
64
|
-
object or its string name. Currently only the names `"cx"`, `"cz"`, `"ecr"`, and
|
65
|
-
`"iswap"` are supported. If a gate object is provided outside the default gates it must
|
66
|
-
have a matrix defined from its :class:`~.Gate.to_matrix` method for the gate to potentially
|
67
|
-
be twirled. If a valid twirling configuration can't be computed that particular gate will
|
68
|
-
be silently ignored and not twirled.
|
69
|
-
seed: An integer seed for the random number generator used internally by this function.
|
70
|
-
If specified this must be between 0 and 18,446,744,073,709,551,615.
|
71
|
-
num_twirls: The number of twirling circuits to build. This defaults to ``None`` and will return
|
72
|
-
a single circuit. If it is an integer a list of circuits with `num_twirls` circuits
|
73
|
-
will be returned.
|
74
|
-
target: If specified an :class:`.Target` instance to use for running single qubit decomposition
|
75
|
-
as part of the Pauli twirling to optimize and map the pauli gates added to the circuit
|
76
|
-
to the specified target.
|
77
|
-
|
78
|
-
Returns:
|
79
|
-
A copy of the given circuit with Pauli twirling applied to each
|
80
|
-
instance of the specified twirling gate.
|
81
|
-
"""
|
82
|
-
custom_gates = None
|
83
|
-
if isinstance(twirling_gate, str):
|
84
|
-
gate = NAME_TO_CLASS.get(twirling_gate, None)
|
85
|
-
if gate is None:
|
86
|
-
raise QiskitError(f"The specified gate name {twirling_gate} is not supported")
|
87
|
-
twirling_std_gate = [gate]
|
88
|
-
elif isinstance(twirling_gate, list):
|
89
|
-
custom_gates = []
|
90
|
-
twirling_std_gate = []
|
91
|
-
for gate in twirling_gate:
|
92
|
-
if isinstance(gate, str):
|
93
|
-
gate = NAME_TO_CLASS.get(gate, None)
|
94
|
-
if gate is None:
|
95
|
-
raise QiskitError(f"The specified gate name {twirling_gate} is not supported")
|
96
|
-
twirling_std_gate.append(gate)
|
97
|
-
else:
|
98
|
-
twirling_gate = getattr(gate, "_standard_gate", None)
|
99
|
-
|
100
|
-
if twirling_gate is None:
|
101
|
-
custom_gates.append(gate)
|
102
|
-
else:
|
103
|
-
if twirling_gate in NAME_TO_CLASS.values():
|
104
|
-
twirling_std_gate.append(twirling_gate)
|
105
|
-
else:
|
106
|
-
custom_gates.append(gate)
|
107
|
-
if not custom_gates:
|
108
|
-
custom_gates = None
|
109
|
-
if not twirling_std_gate:
|
110
|
-
twirling_std_gate = None
|
111
|
-
elif twirling_gate is not None:
|
112
|
-
std_gate = getattr(twirling_gate, "_standard_gate", None)
|
113
|
-
if std_gate is None:
|
114
|
-
twirling_std_gate = None
|
115
|
-
custom_gates = [twirling_gate]
|
116
|
-
else:
|
117
|
-
if std_gate in NAME_TO_CLASS.values():
|
118
|
-
twirling_std_gate = [std_gate]
|
119
|
-
else:
|
120
|
-
twirling_std_gate = None
|
121
|
-
custom_gates = [twirling_gate]
|
122
|
-
else:
|
123
|
-
twirling_std_gate = twirling_gate
|
124
|
-
out_twirls = num_twirls
|
125
|
-
if out_twirls is None:
|
126
|
-
out_twirls = 1
|
127
|
-
new_data = twirl_rs(
|
128
|
-
circuit._data,
|
129
|
-
twirling_std_gate,
|
130
|
-
custom_gates,
|
131
|
-
seed,
|
132
|
-
out_twirls,
|
133
|
-
target,
|
134
|
-
)
|
135
|
-
if num_twirls is not None:
|
136
|
-
out_list = []
|
137
|
-
for circ in new_data:
|
138
|
-
new_circ = QuantumCircuit._from_circuit_data(circ)
|
139
|
-
_copy_metadata(circuit, new_circ, "alike")
|
140
|
-
out_list.append(new_circ)
|
141
|
-
return out_list
|
142
|
-
else:
|
143
|
-
out_circ = QuantumCircuit._from_circuit_data(new_data[0])
|
144
|
-
_copy_metadata(circuit, out_circ, "alike")
|
145
|
-
return out_circ
|
@@ -1,16 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2024.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""Module containing multi-controlled circuits synthesis"""
|
14
|
-
|
15
|
-
from .adders import adder_qft_d00, adder_ripple_c04, adder_ripple_v95
|
16
|
-
from .multipliers import multiplier_cumulative_h18, multiplier_qft_r17
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2024.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""Module containing multi-controlled circuits synthesis"""
|
14
|
-
|
15
|
-
from .cdkm_ripple_carry_adder import adder_ripple_c04
|
16
|
-
from .vbe_ripple_carry_adder import adder_ripple_v95
|
17
|
-
from .draper_qft_adder import adder_qft_d00
|
@@ -1,154 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2017, 2021.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""Compute the sum of two qubit registers using ripple-carry approach."""
|
14
|
-
|
15
|
-
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
16
|
-
from qiskit.circuit.quantumregister import QuantumRegister, AncillaRegister
|
17
|
-
|
18
|
-
|
19
|
-
def adder_ripple_c04(num_state_qubits: int, kind: str = "half") -> QuantumCircuit:
|
20
|
-
r"""A ripple-carry circuit to perform in-place addition on two qubit registers.
|
21
|
-
|
22
|
-
This circuit uses :math:`2n + O(1)` CCX gates and :math:`5n + O(1)` CX gates,
|
23
|
-
at a depth of :math:`2n + O(1)` [1]. The constant depends on the kind
|
24
|
-
of adder implemented.
|
25
|
-
|
26
|
-
As an example, a ripple-carry adder circuit that performs addition on two 3-qubit sized
|
27
|
-
registers with a carry-in bit (``kind="full"``) is as follows:
|
28
|
-
|
29
|
-
.. parsed-literal::
|
30
|
-
|
31
|
-
┌──────┐ ┌──────┐
|
32
|
-
cin_0: ┤2 ├─────────────────────────────────────┤2 ├
|
33
|
-
│ │┌──────┐ ┌──────┐│ │
|
34
|
-
a_0: ┤0 ├┤2 ├─────────────────────┤2 ├┤0 ├
|
35
|
-
│ ││ │┌──────┐ ┌──────┐│ ││ │
|
36
|
-
a_1: ┤ MAJ ├┤0 ├┤2 ├─────┤2 ├┤0 ├┤ UMA ├
|
37
|
-
│ ││ ││ │ │ ││ ││ │
|
38
|
-
a_2: ┤ ├┤ MAJ ├┤0 ├──■──┤0 ├┤ UMA ├┤ ├
|
39
|
-
│ ││ ││ │ │ │ ││ ││ │
|
40
|
-
b_0: ┤1 ├┤ ├┤ MAJ ├──┼──┤ UMA ├┤ ├┤1 ├
|
41
|
-
└──────┘│ ││ │ │ │ ││ │└──────┘
|
42
|
-
b_1: ────────┤1 ├┤ ├──┼──┤ ├┤1 ├────────
|
43
|
-
└──────┘│ │ │ │ │└──────┘
|
44
|
-
b_2: ────────────────┤1 ├──┼──┤1 ├────────────────
|
45
|
-
└──────┘┌─┴─┐└──────┘
|
46
|
-
cout_0: ────────────────────────┤ X ├────────────────────────
|
47
|
-
└───┘
|
48
|
-
|
49
|
-
Here *MAJ* and *UMA* gates correspond to the gates introduced in [1]. Note that
|
50
|
-
in this implementation the input register qubits are ordered as all qubits from
|
51
|
-
the first input register, followed by all qubits from the second input register.
|
52
|
-
|
53
|
-
Two different kinds of adders are supported. By setting the ``kind`` argument, you can also
|
54
|
-
choose a half-adder, which doesn't have a carry-in, and a fixed-sized-adder, which has neither
|
55
|
-
carry-in nor carry-out, and thus acts on fixed register sizes. Unlike the full-adder,
|
56
|
-
these circuits need one additional helper qubit.
|
57
|
-
|
58
|
-
The circuit diagram for the fixed-point adder (``kind="fixed"``) on 3-qubit sized inputs is
|
59
|
-
|
60
|
-
.. parsed-literal::
|
61
|
-
|
62
|
-
┌──────┐┌──────┐ ┌──────┐┌──────┐
|
63
|
-
a_0: ┤0 ├┤2 ├────────────────┤2 ├┤0 ├
|
64
|
-
│ ││ │┌──────┐┌──────┐│ ││ │
|
65
|
-
a_1: ┤ ├┤0 ├┤2 ├┤2 ├┤0 ├┤ ├
|
66
|
-
│ ││ ││ ││ ││ ││ │
|
67
|
-
a_2: ┤ ├┤ MAJ ├┤0 ├┤0 ├┤ UMA ├┤ ├
|
68
|
-
│ ││ ││ ││ ││ ││ │
|
69
|
-
b_0: ┤1 MAJ ├┤ ├┤ MAJ ├┤ UMA ├┤ ├┤1 UMA ├
|
70
|
-
│ ││ ││ ││ ││ ││ │
|
71
|
-
b_1: ┤ ├┤1 ├┤ ├┤ ├┤1 ├┤ ├
|
72
|
-
│ │└──────┘│ ││ │└──────┘│ │
|
73
|
-
b_2: ┤ ├────────┤1 ├┤1 ├────────┤ ├
|
74
|
-
│ │ └──────┘└──────┘ │ │
|
75
|
-
help_0: ┤2 ├────────────────────────────────┤2 ├
|
76
|
-
└──────┘ └──────┘
|
77
|
-
|
78
|
-
It has one less qubit than the full-adder since it doesn't have the carry-out, but uses
|
79
|
-
a helper qubit instead of the carry-in, so it only has one less qubit, not two.
|
80
|
-
|
81
|
-
Args:
|
82
|
-
num_state_qubits: The number of qubits in either input register for
|
83
|
-
state :math:`|a\rangle` or :math:`|b\rangle`. The two input
|
84
|
-
registers must have the same number of qubits.
|
85
|
-
kind: The kind of adder, can be ``"full"`` for a full adder, ``"half"`` for a half
|
86
|
-
adder, or ``"fixed"`` for a fixed-sized adder. A full adder includes both carry-in
|
87
|
-
and carry-out, a half only carry-out, and a fixed-sized adder neither carry-in
|
88
|
-
nor carry-out.
|
89
|
-
|
90
|
-
Raises:
|
91
|
-
ValueError: If ``num_state_qubits`` is lower than 1.
|
92
|
-
|
93
|
-
**References:**
|
94
|
-
|
95
|
-
[1] Cuccaro et al., A new quantum ripple-carry addition circuit, 2004.
|
96
|
-
`arXiv:quant-ph/0410184 <https://arxiv.org/pdf/quant-ph/0410184.pdf>`_
|
97
|
-
|
98
|
-
[2] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995.
|
99
|
-
`arXiv:quant-ph/9511018 <https://arxiv.org/pdf/quant-ph/9511018.pdf>`_
|
100
|
-
|
101
|
-
"""
|
102
|
-
if num_state_qubits < 1:
|
103
|
-
raise ValueError("The number of qubits must be at least 1.")
|
104
|
-
|
105
|
-
circuit = QuantumCircuit()
|
106
|
-
|
107
|
-
if kind == "full":
|
108
|
-
qr_c = QuantumRegister(1, name="cin")
|
109
|
-
circuit.add_register(qr_c)
|
110
|
-
else:
|
111
|
-
qr_c = AncillaRegister(1, name="help")
|
112
|
-
|
113
|
-
qr_a = QuantumRegister(num_state_qubits, name="a")
|
114
|
-
qr_b = QuantumRegister(num_state_qubits, name="b")
|
115
|
-
circuit.add_register(qr_a, qr_b)
|
116
|
-
|
117
|
-
if kind in ["full", "half"]:
|
118
|
-
qr_z = QuantumRegister(1, name="cout")
|
119
|
-
circuit.add_register(qr_z)
|
120
|
-
|
121
|
-
if kind != "full":
|
122
|
-
circuit.add_register(qr_c)
|
123
|
-
|
124
|
-
# build carry circuit for majority of 3 bits in-place
|
125
|
-
# corresponds to MAJ gate in [1]
|
126
|
-
qc_maj = QuantumCircuit(3, name="MAJ")
|
127
|
-
qc_maj.cx(0, 1)
|
128
|
-
qc_maj.cx(0, 2)
|
129
|
-
qc_maj.ccx(2, 1, 0)
|
130
|
-
maj_gate = qc_maj.to_gate()
|
131
|
-
|
132
|
-
# build circuit for reversing carry operation
|
133
|
-
# corresponds to UMA gate in [1]
|
134
|
-
qc_uma = QuantumCircuit(3, name="UMA")
|
135
|
-
qc_uma.ccx(2, 1, 0)
|
136
|
-
qc_uma.cx(0, 2)
|
137
|
-
qc_uma.cx(2, 1)
|
138
|
-
uma_gate = qc_uma.to_gate()
|
139
|
-
|
140
|
-
# build ripple-carry adder circuit
|
141
|
-
circuit.append(maj_gate, [qr_a[0], qr_b[0], qr_c[0]])
|
142
|
-
|
143
|
-
for i in range(num_state_qubits - 1):
|
144
|
-
circuit.append(maj_gate, [qr_a[i + 1], qr_b[i + 1], qr_a[i]])
|
145
|
-
|
146
|
-
if kind in ["full", "half"]:
|
147
|
-
circuit.cx(qr_a[-1], qr_z[0])
|
148
|
-
|
149
|
-
for i in reversed(range(num_state_qubits - 1)):
|
150
|
-
circuit.append(uma_gate, [qr_a[i + 1], qr_b[i + 1], qr_a[i]])
|
151
|
-
|
152
|
-
circuit.append(uma_gate, [qr_a[0], qr_b[0], qr_c[0]])
|
153
|
-
|
154
|
-
return circuit
|
@@ -1,103 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2017, 2021.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""Compute the sum of two qubit registers using QFT."""
|
14
|
-
|
15
|
-
import numpy as np
|
16
|
-
|
17
|
-
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
18
|
-
from qiskit.circuit.quantumregister import QuantumRegister
|
19
|
-
from qiskit.circuit.library.basis_change import QFTGate
|
20
|
-
|
21
|
-
|
22
|
-
def adder_qft_d00(num_state_qubits: int, kind: str = "half") -> QuantumCircuit:
|
23
|
-
r"""A circuit that uses QFT to perform in-place addition on two qubit registers.
|
24
|
-
|
25
|
-
For registers with :math:`n` qubits, the QFT adder can perform addition modulo
|
26
|
-
:math:`2^n` (with ``kind="fixed"``) or ordinary addition by adding a carry qubits (with
|
27
|
-
``kind="half"``). The fixed adder uses :math:`(3n^2 - n)/2` :class:`.CPhaseGate` operators,
|
28
|
-
with an additional :math:`n` for the half adder.
|
29
|
-
|
30
|
-
As an example, a non-fixed_point QFT adder circuit that performs addition on two 2-qubit sized
|
31
|
-
registers is as follows:
|
32
|
-
|
33
|
-
.. parsed-literal::
|
34
|
-
|
35
|
-
a_0: ─────────■──────■────────■──────────────────────────────────
|
36
|
-
│ │ │
|
37
|
-
a_1: ─────────┼──────┼────────┼────────■──────■──────────────────
|
38
|
-
┌──────┐ │ │ │P(π/4) │ │P(π/2) ┌─────────┐
|
39
|
-
b_0: ┤0 ├─┼──────┼────────■────────┼──────■───────┤0 ├
|
40
|
-
│ │ │ │P(π/2) │P(π) │ │
|
41
|
-
b_1: ┤1 Qft ├─┼──────■─────────────────■──────────────┤1 qft_dg ├
|
42
|
-
│ │ │P(π) │ │
|
43
|
-
cout: ┤2 ├─■───────────────────────────────────────┤2 ├
|
44
|
-
└──────┘ └─────────┘
|
45
|
-
|
46
|
-
Args:
|
47
|
-
num_state_qubits: The number of qubits in either input register for
|
48
|
-
state :math:`|a\rangle` or :math:`|b\rangle`. The two input
|
49
|
-
registers must have the same number of qubits.
|
50
|
-
kind: The kind of adder, can be ``"half"`` for a half adder or
|
51
|
-
``"fixed"`` for a fixed-sized adder. A half adder contains a carry-out to represent
|
52
|
-
the most-significant bit, but the fixed-sized adder doesn't and hence performs
|
53
|
-
addition modulo ``2 ** num_state_qubits``.
|
54
|
-
|
55
|
-
**References:**
|
56
|
-
|
57
|
-
[1] T. G. Draper, Addition on a Quantum Computer, 2000.
|
58
|
-
`arXiv:quant-ph/0008033 <https://arxiv.org/pdf/quant-ph/0008033.pdf>`_
|
59
|
-
|
60
|
-
[2] Ruiz-Perez et al., Quantum arithmetic with the Quantum Fourier Transform, 2017.
|
61
|
-
`arXiv:1411.5949 <https://arxiv.org/pdf/1411.5949.pdf>`_
|
62
|
-
|
63
|
-
[3] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995.
|
64
|
-
`arXiv:quant-ph/9511018 <https://arxiv.org/pdf/quant-ph/9511018.pdf>`_
|
65
|
-
|
66
|
-
"""
|
67
|
-
|
68
|
-
if kind == "full":
|
69
|
-
raise ValueError("The DraperQFTAdder only supports 'half' and 'fixed' as ``kind``.")
|
70
|
-
|
71
|
-
if num_state_qubits < 1:
|
72
|
-
raise ValueError("The number of qubits must be at least 1.")
|
73
|
-
|
74
|
-
qr_a = QuantumRegister(num_state_qubits, name="a")
|
75
|
-
qr_b = QuantumRegister(num_state_qubits, name="b")
|
76
|
-
qr_list = [qr_a, qr_b]
|
77
|
-
|
78
|
-
if kind == "half":
|
79
|
-
qr_z = QuantumRegister(1, name="cout")
|
80
|
-
qr_list.append(qr_z)
|
81
|
-
|
82
|
-
# add registers
|
83
|
-
circuit = QuantumCircuit(*qr_list)
|
84
|
-
|
85
|
-
# define register containing the sum and number of qubits for QFT circuit
|
86
|
-
qr_sum = qr_b[:] if kind == "fixed" else qr_b[:] + qr_z[:]
|
87
|
-
num_sum = num_state_qubits if kind == "fixed" else num_state_qubits + 1
|
88
|
-
|
89
|
-
# build QFT adder circuit
|
90
|
-
qft = QFTGate(num_sum)
|
91
|
-
circuit.append(qft, qr_sum[:])
|
92
|
-
|
93
|
-
for j in range(num_state_qubits):
|
94
|
-
for k in range(num_sum - j):
|
95
|
-
lam = np.pi / (2**k)
|
96
|
-
# note: if we were able to remove the final swaps from the QFTGate, we could
|
97
|
-
# simply use qr_sum[(j + k)] here and avoid synthesizing two swap networks, which
|
98
|
-
# can be elided and cancelled by the compiler
|
99
|
-
circuit.cp(lam, qr_a[j], qr_sum[~(j + k)])
|
100
|
-
|
101
|
-
circuit.append(qft.inverse(), qr_sum[:])
|
102
|
-
|
103
|
-
return circuit
|