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
@@ -11,9 +11,11 @@
|
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
13
|
"""Compute the sum of two qubit registers using Classical Addition."""
|
14
|
-
|
15
14
|
from __future__ import annotations
|
16
|
-
from qiskit.
|
15
|
+
from qiskit.circuit.bit import Bit
|
16
|
+
|
17
|
+
from qiskit.circuit import QuantumCircuit, QuantumRegister, AncillaRegister
|
18
|
+
|
17
19
|
from .adder import Adder
|
18
20
|
|
19
21
|
|
@@ -24,7 +26,7 @@ class VBERippleCarryAdder(Adder):
|
|
24
26
|
As an example, a classical adder circuit that performs full addition (i.e. including
|
25
27
|
a carry-in bit) on two 2-qubit sized registers is as follows:
|
26
28
|
|
27
|
-
..
|
29
|
+
.. parsed-literal::
|
28
30
|
|
29
31
|
┌────────┐ ┌───────────┐┌──────┐
|
30
32
|
cin_0: ┤0 ├───────────────────────┤0 ├┤0 ├
|
@@ -50,22 +52,6 @@ class VBERippleCarryAdder(Adder):
|
|
50
52
|
This is different ordering as compared to Figure 2 in [1], which leads to a different
|
51
53
|
drawing of the circuit.
|
52
54
|
|
53
|
-
.. seealso::
|
54
|
-
|
55
|
-
The following generic gate objects perform additions, like this circuit class,
|
56
|
-
but allow the compiler to select the optimal decomposition based on the context.
|
57
|
-
Specific implementations can be set via the :class:`.HLSConfig`, e.g. this circuit
|
58
|
-
can be chosen via ``Adder=["ripple_v95"]``.
|
59
|
-
|
60
|
-
:class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
|
61
|
-
is functionally equivalent to ``kind="fixed"``.
|
62
|
-
|
63
|
-
:class:`.HalfAdderGate`: A generic inplace adder. This
|
64
|
-
is functionally equivalent to ``kind="half"``.
|
65
|
-
|
66
|
-
:class:`.FullAdderGate`: A generic inplace adder, with a carry-in bit. This
|
67
|
-
is functionally equivalent to ``kind="full"``.
|
68
|
-
|
69
55
|
**References:**
|
70
56
|
|
71
57
|
[1] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995.
|
@@ -88,8 +74,92 @@ class VBERippleCarryAdder(Adder):
|
|
88
74
|
Raises:
|
89
75
|
ValueError: If ``num_state_qubits`` is lower than 1.
|
90
76
|
"""
|
77
|
+
if num_state_qubits < 1:
|
78
|
+
raise ValueError("The number of qubits must be at least 1.")
|
79
|
+
|
91
80
|
super().__init__(num_state_qubits, name=name)
|
92
|
-
circuit = adder_ripple_v95(num_state_qubits, kind)
|
93
81
|
|
94
|
-
|
82
|
+
# define the input registers
|
83
|
+
registers: list[QuantumRegister | list[Bit]] = []
|
84
|
+
if kind == "full":
|
85
|
+
qr_cin = QuantumRegister(1, name="cin")
|
86
|
+
registers.append(qr_cin)
|
87
|
+
else:
|
88
|
+
qr_cin = QuantumRegister(0)
|
89
|
+
|
90
|
+
qr_a = QuantumRegister(num_state_qubits, name="a")
|
91
|
+
qr_b = QuantumRegister(num_state_qubits, name="b")
|
92
|
+
|
93
|
+
registers += [qr_a, qr_b]
|
94
|
+
|
95
|
+
if kind in ["half", "full"]:
|
96
|
+
qr_cout = QuantumRegister(1, name="cout")
|
97
|
+
registers.append(qr_cout)
|
98
|
+
else:
|
99
|
+
qr_cout = QuantumRegister(0)
|
100
|
+
|
101
|
+
self.add_register(*registers)
|
102
|
+
|
103
|
+
if num_state_qubits > 1:
|
104
|
+
qr_help = AncillaRegister(num_state_qubits - 1, name="helper")
|
105
|
+
self.add_register(qr_help)
|
106
|
+
else:
|
107
|
+
qr_help = AncillaRegister(0)
|
108
|
+
|
109
|
+
# the code is simplified a lot if we create a list of all carries and helpers
|
110
|
+
carries = qr_cin[:] + qr_help[:] + qr_cout[:]
|
111
|
+
|
112
|
+
# corresponds to Carry gate in [1]
|
113
|
+
qc_carry = QuantumCircuit(4, name="Carry")
|
114
|
+
qc_carry.ccx(1, 2, 3)
|
115
|
+
qc_carry.cx(1, 2)
|
116
|
+
qc_carry.ccx(0, 2, 3)
|
117
|
+
carry_gate = qc_carry.to_gate()
|
118
|
+
carry_gate_dg = carry_gate.inverse()
|
119
|
+
|
120
|
+
# corresponds to Sum gate in [1]
|
121
|
+
qc_sum = QuantumCircuit(3, name="Sum")
|
122
|
+
qc_sum.cx(1, 2)
|
123
|
+
qc_sum.cx(0, 2)
|
124
|
+
sum_gate = qc_sum.to_gate()
|
125
|
+
|
126
|
+
circuit = QuantumCircuit(*self.qregs, name=name)
|
127
|
+
|
128
|
+
# handle all cases for the first qubits, depending on whether cin is available
|
129
|
+
i = 0
|
130
|
+
if kind == "half":
|
131
|
+
i += 1
|
132
|
+
circuit.ccx(qr_a[0], qr_b[0], carries[0])
|
133
|
+
elif kind == "fixed":
|
134
|
+
i += 1
|
135
|
+
if num_state_qubits == 1:
|
136
|
+
circuit.cx(qr_a[0], qr_b[0])
|
137
|
+
else:
|
138
|
+
circuit.ccx(qr_a[0], qr_b[0], carries[0])
|
139
|
+
|
140
|
+
for inp, out in zip(carries[:-1], carries[1:]):
|
141
|
+
circuit.append(carry_gate, [inp, qr_a[i], qr_b[i], out])
|
142
|
+
i += 1
|
143
|
+
|
144
|
+
if kind in ["full", "half"]: # final CX (cancels for the 'fixed' case)
|
145
|
+
circuit.cx(qr_a[-1], qr_b[-1])
|
146
|
+
|
147
|
+
if len(carries) > 1:
|
148
|
+
circuit.append(sum_gate, [carries[-2], qr_a[-1], qr_b[-1]])
|
149
|
+
|
150
|
+
i -= 2
|
151
|
+
for j, (inp, out) in enumerate(zip(reversed(carries[:-1]), reversed(carries[1:]))):
|
152
|
+
if j == 0:
|
153
|
+
if kind == "fixed":
|
154
|
+
i += 1
|
155
|
+
else:
|
156
|
+
continue
|
157
|
+
circuit.append(carry_gate_dg, [inp, qr_a[i], qr_b[i], out])
|
158
|
+
circuit.append(sum_gate, [inp, qr_a[i], qr_b[i]])
|
159
|
+
i -= 1
|
160
|
+
|
161
|
+
if kind in ["half", "fixed"] and num_state_qubits > 1:
|
162
|
+
circuit.ccx(qr_a[0], qr_b[0], carries[0])
|
163
|
+
circuit.cx(qr_a[0], qr_b[0])
|
164
|
+
|
95
165
|
self.append(circuit.to_gate(), self.qubits)
|
@@ -27,7 +27,7 @@ class LinearPauliRotations(FunctionalPauliRotations):
|
|
27
27
|
For a register of state qubits :math:`|x\rangle`, a target qubit :math:`|0\rangle` and the
|
28
28
|
basis ``'Y'`` this circuit acts as:
|
29
29
|
|
30
|
-
..
|
30
|
+
.. parsed-literal::
|
31
31
|
|
32
32
|
q_0: ─────────────────────────■───────── ... ──────────────────────
|
33
33
|
│
|
@@ -26,7 +26,7 @@ class HRSCumulativeMultiplier(Multiplier):
|
|
26
26
|
the default adder is as follows (where ``Adder`` denotes the
|
27
27
|
``CDKMRippleCarryAdder``):
|
28
28
|
|
29
|
-
..
|
29
|
+
.. parsed-literal::
|
30
30
|
|
31
31
|
a_0: ────■─────────────────────────
|
32
32
|
│
|
@@ -59,13 +59,6 @@ class HRSCumulativeMultiplier(Multiplier):
|
|
59
59
|
a series of shifted additions using one of the input registers while the qubits
|
60
60
|
from the other input register act as control qubits for the adders.
|
61
61
|
|
62
|
-
.. seealso::
|
63
|
-
|
64
|
-
The :class:`.MultiplierGate` objects represents a multiplication, like this circuit class,
|
65
|
-
but allows the compiler to select the optimal decomposition based on the context.
|
66
|
-
Specific implementations can be set via the :class:`.HLSConfig`, e.g. this circuit
|
67
|
-
can be chosen via ``Multiplier=["cumulative_h18"]``.
|
68
|
-
|
69
62
|
**References:**
|
70
63
|
|
71
64
|
[1] Häner et al., Optimizing Quantum Circuits for Arithmetic, 2018.
|
@@ -12,10 +12,9 @@
|
|
12
12
|
|
13
13
|
"""Compute the product of two equally sized qubit registers."""
|
14
14
|
|
15
|
-
from
|
15
|
+
from typing import Optional
|
16
16
|
|
17
|
-
from qiskit.circuit import QuantumCircuit
|
18
|
-
from qiskit.utils.deprecation import deprecate_func
|
17
|
+
from qiskit.circuit import QuantumCircuit
|
19
18
|
|
20
19
|
|
21
20
|
class Multiplier(QuantumCircuit):
|
@@ -46,19 +45,10 @@ class Multiplier(QuantumCircuit):
|
|
46
45
|
|
47
46
|
"""
|
48
47
|
|
49
|
-
@deprecate_func(
|
50
|
-
since="1.3",
|
51
|
-
additional_msg=(
|
52
|
-
"Use the MultiplierGate provided in qiskit.circuit.library.arithmetic instead. "
|
53
|
-
"For different multiplier implementations, see "
|
54
|
-
"https://docs.quantum.ibm.com/api/qiskit/synthesis.",
|
55
|
-
),
|
56
|
-
pending=True,
|
57
|
-
)
|
58
48
|
def __init__(
|
59
49
|
self,
|
60
50
|
num_state_qubits: int,
|
61
|
-
num_result_qubits: int
|
51
|
+
num_result_qubits: Optional[int] = None,
|
62
52
|
name: str = "Multiplier",
|
63
53
|
) -> None:
|
64
54
|
"""
|
@@ -109,84 +99,3 @@ class Multiplier(QuantumCircuit):
|
|
109
99
|
The number of result qubits.
|
110
100
|
"""
|
111
101
|
return self._num_result_qubits
|
112
|
-
|
113
|
-
|
114
|
-
class MultiplierGate(Gate):
|
115
|
-
r"""Compute the product of two equally sized qubit registers into a new register.
|
116
|
-
|
117
|
-
For two input registers :math:`|a\rangle_n`, :math:`|b\rangle_n` with :math:`n` qubits each
|
118
|
-
and an output register with :math:`2n` qubits, a multiplier performs the following operation
|
119
|
-
|
120
|
-
.. math::
|
121
|
-
|
122
|
-
|a\rangle_n |b\rangle_n |0\rangle_{t} \mapsto |a\rangle_n |b\rangle_n |a \cdot b\rangle_t
|
123
|
-
|
124
|
-
where :math:`t` is the number of bits used to represent the result. To completely store the result
|
125
|
-
of the multiplication without overflow we need :math:`t = 2n` bits.
|
126
|
-
|
127
|
-
The quantum register :math:`|a\rangle_n` (analogously :math:`|b\rangle_n` and
|
128
|
-
output register)
|
129
|
-
|
130
|
-
.. math::
|
131
|
-
|
132
|
-
|a\rangle_n = |a_0\rangle \otimes \cdots \otimes |a_{n - 1}\rangle,
|
133
|
-
|
134
|
-
for :math:`a_i \in \{0, 1\}`, is associated with the integer value
|
135
|
-
|
136
|
-
.. math::
|
137
|
-
|
138
|
-
a = 2^{0}a_{0} + 2^{1}a_{1} + \cdots + 2^{n - 1}a_{n - 1}.
|
139
|
-
|
140
|
-
"""
|
141
|
-
|
142
|
-
def __init__(
|
143
|
-
self,
|
144
|
-
num_state_qubits: int,
|
145
|
-
num_result_qubits: int | None = None,
|
146
|
-
label: str | None = None,
|
147
|
-
) -> None:
|
148
|
-
"""
|
149
|
-
Args:
|
150
|
-
num_state_qubits: The number of qubits in each of the input registers.
|
151
|
-
num_result_qubits: The number of result qubits to limit the output to.
|
152
|
-
Default value is ``2 * num_state_qubits`` to represent any possible
|
153
|
-
result from the multiplication of the two inputs.
|
154
|
-
name: The name of the circuit.
|
155
|
-
Raises:
|
156
|
-
ValueError: If ``num_state_qubits`` is smaller than 1.
|
157
|
-
ValueError: If ``num_result_qubits`` is smaller than ``num_state_qubits``.
|
158
|
-
ValueError: If ``num_result_qubits`` is larger than ``2 * num_state_qubits``.
|
159
|
-
"""
|
160
|
-
if num_state_qubits < 1:
|
161
|
-
raise ValueError("The number of state qubits must be at least 1.")
|
162
|
-
|
163
|
-
if num_result_qubits is None:
|
164
|
-
num_result_qubits = 2 * num_state_qubits
|
165
|
-
elif num_result_qubits < num_state_qubits or num_result_qubits > 2 * num_state_qubits:
|
166
|
-
raise ValueError(
|
167
|
-
f"num_result_qubits ({num_result_qubits}) must be in between num_state_qubits "
|
168
|
-
f"({num_state_qubits}) and 2 * num_state_qubits ({2 * num_state_qubits})"
|
169
|
-
)
|
170
|
-
|
171
|
-
super().__init__("Multiplier", 2 * num_state_qubits + num_result_qubits, [], label=label)
|
172
|
-
|
173
|
-
self._num_state_qubits = num_state_qubits
|
174
|
-
self._num_result_qubits = num_result_qubits
|
175
|
-
|
176
|
-
@property
|
177
|
-
def num_state_qubits(self) -> int:
|
178
|
-
"""The number of state qubits, i.e. the number of bits in each input register.
|
179
|
-
|
180
|
-
Returns:
|
181
|
-
The number of state qubits.
|
182
|
-
"""
|
183
|
-
return self._num_state_qubits
|
184
|
-
|
185
|
-
@property
|
186
|
-
def num_result_qubits(self) -> int:
|
187
|
-
"""The number of result qubits to limit the output to.
|
188
|
-
|
189
|
-
Returns:
|
190
|
-
The number of result qubits.
|
191
|
-
"""
|
192
|
-
return self._num_result_qubits
|
@@ -33,7 +33,7 @@ class RGQFTMultiplier(Multiplier):
|
|
33
33
|
As an example, a circuit that performs a modular QFT multiplication on two 2-qubit
|
34
34
|
sized input registers with an output register of 2 qubits, is as follows:
|
35
35
|
|
36
|
-
..
|
36
|
+
.. parsed-literal::
|
37
37
|
|
38
38
|
a_0: ────────────────────────────────────────■───────■──────■──────■────────────────
|
39
39
|
│ │ │ │
|
@@ -48,13 +48,6 @@ class RGQFTMultiplier(Multiplier):
|
|
48
48
|
out_1: ┤1 ├─────────■───────────────■──────────────■─────────────■───────┤1 ├
|
49
49
|
└──────┘ └───────┘
|
50
50
|
|
51
|
-
.. seealso::
|
52
|
-
|
53
|
-
The :class:`.MultiplierGate` objects represents a multiplication, like this circuit class,
|
54
|
-
but allows the compiler to select the optimal decomposition based on the context.
|
55
|
-
Specific implementations can be set via the :class:`.HLSConfig`, e.g. this circuit
|
56
|
-
can be chosen via ``Multiplier=["qft_r17"]``.
|
57
|
-
|
58
51
|
**References:**
|
59
52
|
|
60
53
|
[1] Ruiz-Perez et al., Quantum arithmetic with the Quantum Fourier Transform, 2017.
|
@@ -45,7 +45,7 @@ class WeightedAdder(BlueprintCircuit):
|
|
45
45
|
For an example where the state of 4 qubits is added into a sum register, the circuit can
|
46
46
|
be schematically drawn as
|
47
47
|
|
48
|
-
..
|
48
|
+
.. parsed-literal::
|
49
49
|
|
50
50
|
┌────────┐
|
51
51
|
state_0: ┤0 ├ | state_0 * weights[0]
|
@@ -13,10 +13,10 @@
|
|
13
13
|
"""Define a Quantum Fourier Transform circuit (QFT) and a native gate (QFTGate)."""
|
14
14
|
|
15
15
|
from __future__ import annotations
|
16
|
+
import warnings
|
16
17
|
import numpy as np
|
17
18
|
|
18
|
-
from qiskit.circuit.quantumcircuit import QuantumRegister, CircuitInstruction, Gate
|
19
|
-
from qiskit.utils.deprecation import deprecate_func
|
19
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit, QuantumRegister, CircuitInstruction, Gate
|
20
20
|
from ..blueprintcircuit import BlueprintCircuit
|
21
21
|
|
22
22
|
|
@@ -72,14 +72,6 @@ class QFT(BlueprintCircuit):
|
|
72
72
|
|
73
73
|
"""
|
74
74
|
|
75
|
-
@deprecate_func(
|
76
|
-
since="1.3",
|
77
|
-
additional_msg=(
|
78
|
-
"Use qiskit.circuit.library.QFTGate or qiskit.synthesis.qft.synth_qft_full instead, "
|
79
|
-
"for access to all previous arguments.",
|
80
|
-
),
|
81
|
-
pending=True,
|
82
|
-
)
|
83
75
|
def __init__(
|
84
76
|
self,
|
85
77
|
num_qubits: int | None = None,
|
@@ -240,6 +232,22 @@ class QFT(BlueprintCircuit):
|
|
240
232
|
inverted._inverse = not self._inverse
|
241
233
|
return inverted
|
242
234
|
|
235
|
+
def _warn_if_precision_loss(self):
|
236
|
+
"""Issue a warning if constructing the circuit will lose precision.
|
237
|
+
|
238
|
+
If we need an angle smaller than ``pi * 2**-1022``, we start to lose precision by going into
|
239
|
+
the subnormal numbers. We won't lose _all_ precision until an exponent of about 1075, but
|
240
|
+
beyond 1022 we're using fractional bits to represent leading zeros."""
|
241
|
+
max_num_entanglements = self.num_qubits - self.approximation_degree - 1
|
242
|
+
if max_num_entanglements > -np.finfo(float).minexp: # > 1022 for doubles.
|
243
|
+
warnings.warn(
|
244
|
+
"precision loss in QFT."
|
245
|
+
f" The rotation needed to represent {max_num_entanglements} entanglements"
|
246
|
+
" is smaller than the smallest normal floating-point number.",
|
247
|
+
category=RuntimeWarning,
|
248
|
+
stacklevel=3,
|
249
|
+
)
|
250
|
+
|
243
251
|
def _check_configuration(self, raise_on_failure: bool = True) -> bool:
|
244
252
|
"""Check if the current configuration is valid."""
|
245
253
|
valid = True
|
@@ -247,6 +255,7 @@ class QFT(BlueprintCircuit):
|
|
247
255
|
valid = False
|
248
256
|
if raise_on_failure:
|
249
257
|
raise AttributeError("The number of qubits has not been set.")
|
258
|
+
self._warn_if_precision_loss()
|
250
259
|
return valid
|
251
260
|
|
252
261
|
def _build(self) -> None:
|
@@ -261,16 +270,25 @@ class QFT(BlueprintCircuit):
|
|
261
270
|
if num_qubits == 0:
|
262
271
|
return
|
263
272
|
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
num_qubits
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
273
|
+
circuit = QuantumCircuit(*self.qregs, name=self.name)
|
274
|
+
for j in reversed(range(num_qubits)):
|
275
|
+
circuit.h(j)
|
276
|
+
num_entanglements = max(0, j - max(0, self.approximation_degree - (num_qubits - j - 1)))
|
277
|
+
for k in reversed(range(j - num_entanglements, j)):
|
278
|
+
# Use negative exponents so that the angle safely underflows to zero, rather than
|
279
|
+
# using a temporary variable that overflows to infinity in the worst case.
|
280
|
+
lam = np.pi * (2.0 ** (k - j))
|
281
|
+
circuit.cp(lam, j, k)
|
282
|
+
|
283
|
+
if self.insert_barriers:
|
284
|
+
circuit.barrier()
|
285
|
+
|
286
|
+
if self._do_swaps:
|
287
|
+
for i in range(num_qubits // 2):
|
288
|
+
circuit.swap(i, num_qubits - i - 1)
|
289
|
+
|
290
|
+
if self._inverse:
|
291
|
+
circuit = circuit.inverse()
|
274
292
|
|
275
293
|
wrapped = circuit.to_instruction() if self.insert_barriers else circuit.to_gate()
|
276
294
|
self.compose(wrapped, qubits=self.qubits, inplace=True)
|
@@ -94,12 +94,6 @@ class BlueprintCircuit(QuantumCircuit, ABC):
|
|
94
94
|
|
95
95
|
@property
|
96
96
|
def data(self):
|
97
|
-
"""The circuit data (instructions and context).
|
98
|
-
|
99
|
-
Returns:
|
100
|
-
QuantumCircuitData: a list-like object containing the :class:`.CircuitInstruction`\\ s
|
101
|
-
for each instruction.
|
102
|
-
"""
|
103
97
|
if not self._is_built:
|
104
98
|
self._build()
|
105
99
|
return super().data
|
@@ -116,70 +110,12 @@ class BlueprintCircuit(QuantumCircuit, ABC):
|
|
116
110
|
|
117
111
|
@property
|
118
112
|
def num_parameters(self) -> int:
|
119
|
-
"""The number of parameter objects in the circuit."""
|
120
113
|
if not self._is_built:
|
121
114
|
self._build()
|
122
115
|
return super().num_parameters
|
123
116
|
|
124
117
|
@property
|
125
118
|
def parameters(self) -> ParameterView:
|
126
|
-
"""The parameters defined in the circuit.
|
127
|
-
|
128
|
-
This attribute returns the :class:`.Parameter` objects in the circuit sorted
|
129
|
-
alphabetically. Note that parameters instantiated with a :class:`.ParameterVector`
|
130
|
-
are still sorted numerically.
|
131
|
-
|
132
|
-
Examples:
|
133
|
-
|
134
|
-
The snippet below shows that insertion order of parameters does not matter.
|
135
|
-
|
136
|
-
.. code-block:: python
|
137
|
-
|
138
|
-
>>> from qiskit.circuit import QuantumCircuit, Parameter
|
139
|
-
>>> a, b, elephant = Parameter("a"), Parameter("b"), Parameter("elephant")
|
140
|
-
>>> circuit = QuantumCircuit(1)
|
141
|
-
>>> circuit.rx(b, 0)
|
142
|
-
>>> circuit.rz(elephant, 0)
|
143
|
-
>>> circuit.ry(a, 0)
|
144
|
-
>>> circuit.parameters # sorted alphabetically!
|
145
|
-
ParameterView([Parameter(a), Parameter(b), Parameter(elephant)])
|
146
|
-
|
147
|
-
Bear in mind that alphabetical sorting might be unintuitive when it comes to numbers.
|
148
|
-
The literal "10" comes before "2" in strict alphabetical sorting.
|
149
|
-
|
150
|
-
.. code-block:: python
|
151
|
-
|
152
|
-
>>> from qiskit.circuit import QuantumCircuit, Parameter
|
153
|
-
>>> angles = [Parameter("angle_1"), Parameter("angle_2"), Parameter("angle_10")]
|
154
|
-
>>> circuit = QuantumCircuit(1)
|
155
|
-
>>> circuit.u(*angles, 0)
|
156
|
-
>>> circuit.draw()
|
157
|
-
┌─────────────────────────────┐
|
158
|
-
q: ┤ U(angle_1,angle_2,angle_10) ├
|
159
|
-
└─────────────────────────────┘
|
160
|
-
>>> circuit.parameters
|
161
|
-
ParameterView([Parameter(angle_1), Parameter(angle_10), Parameter(angle_2)])
|
162
|
-
|
163
|
-
To respect numerical sorting, a :class:`.ParameterVector` can be used.
|
164
|
-
|
165
|
-
.. code-block:: python
|
166
|
-
|
167
|
-
>>> from qiskit.circuit import QuantumCircuit, Parameter, ParameterVector
|
168
|
-
>>> x = ParameterVector("x", 12)
|
169
|
-
>>> circuit = QuantumCircuit(1)
|
170
|
-
>>> for x_i in x:
|
171
|
-
... circuit.rx(x_i, 0)
|
172
|
-
>>> circuit.parameters
|
173
|
-
ParameterView([
|
174
|
-
ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
|
175
|
-
ParameterVectorElement(x[2]), ParameterVectorElement(x[3]),
|
176
|
-
..., ParameterVectorElement(x[11])
|
177
|
-
])
|
178
|
-
|
179
|
-
|
180
|
-
Returns:
|
181
|
-
The sorted :class:`.Parameter` objects in the circuit.
|
182
|
-
"""
|
183
119
|
if not self._is_built:
|
184
120
|
self._build()
|
185
121
|
return super().parameters
|
@@ -12,7 +12,7 @@
|
|
12
12
|
|
13
13
|
"""The Boolean logic circuit library."""
|
14
14
|
|
15
|
-
from .quantum_and import AND
|
16
|
-
from .quantum_or import OR
|
17
|
-
from .quantum_xor import XOR
|
18
|
-
from .inner_product import InnerProduct
|
15
|
+
from .quantum_and import AND
|
16
|
+
from .quantum_or import OR
|
17
|
+
from .quantum_xor import XOR
|
18
|
+
from .inner_product import InnerProduct
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# This code is part of Qiskit.
|
2
2
|
#
|
3
|
-
# (C) Copyright IBM 2020
|
3
|
+
# (C) Copyright IBM 2020.
|
4
4
|
#
|
5
5
|
# This code is licensed under the Apache License, Version 2.0. You may
|
6
6
|
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
@@ -11,11 +11,10 @@
|
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
13
|
|
14
|
-
"""InnerProduct circuit
|
14
|
+
"""InnerProduct circuit."""
|
15
15
|
|
16
16
|
|
17
|
-
from qiskit.circuit import QuantumRegister, QuantumCircuit
|
18
|
-
from qiskit.utils.deprecation import deprecate_func
|
17
|
+
from qiskit.circuit import QuantumRegister, QuantumCircuit
|
19
18
|
|
20
19
|
|
21
20
|
class InnerProduct(QuantumCircuit):
|
@@ -33,7 +32,7 @@ class InnerProduct(QuantumCircuit):
|
|
33
32
|
where the inner product of the top and bottom registers is 1. Otherwise it keeps
|
34
33
|
the input intact.
|
35
34
|
|
36
|
-
..
|
35
|
+
.. parsed-literal::
|
37
36
|
|
38
37
|
|
39
38
|
q0_0: ─■──────────
|
@@ -62,11 +61,6 @@ class InnerProduct(QuantumCircuit):
|
|
62
61
|
_generate_circuit_library_visualization(circuit)
|
63
62
|
"""
|
64
63
|
|
65
|
-
@deprecate_func(
|
66
|
-
since="1.3",
|
67
|
-
additional_msg="Use qiskit.circuit.library.InnerProductGate instead.",
|
68
|
-
pending=True,
|
69
|
-
)
|
70
64
|
def __init__(self, num_qubits: int) -> None:
|
71
65
|
"""Return a circuit to compute the inner product of 2 n-qubit registers.
|
72
66
|
|
@@ -82,74 +76,3 @@ class InnerProduct(QuantumCircuit):
|
|
82
76
|
|
83
77
|
super().__init__(*inner.qregs, name="inner_product")
|
84
78
|
self.compose(inner.to_gate(), qubits=self.qubits, inplace=True)
|
85
|
-
|
86
|
-
|
87
|
-
class InnerProductGate(Gate):
|
88
|
-
r"""A 2n-qubit Boolean function that computes the inner product of
|
89
|
-
two n-qubit vectors over :math:`F_2`.
|
90
|
-
|
91
|
-
This implementation is a phase oracle which computes the following transform.
|
92
|
-
|
93
|
-
.. math::
|
94
|
-
|
95
|
-
\mathcal{IP}_{2n} : F_2^{2n} \rightarrow {-1, 1}
|
96
|
-
\mathcal{IP}_{2n}(x_1, \cdots, x_n, y_1, \cdots, y_n) = (-1)^{x.y}
|
97
|
-
|
98
|
-
The corresponding unitary is a diagonal, which induces a -1 phase on any inputs
|
99
|
-
where the inner product of the top and bottom registers is 1. Otherwise, it keeps
|
100
|
-
the input intact.
|
101
|
-
|
102
|
-
.. parsed-literal::
|
103
|
-
|
104
|
-
|
105
|
-
q0_0: ─■──────────
|
106
|
-
│
|
107
|
-
q0_1: ─┼──■───────
|
108
|
-
│ │
|
109
|
-
q0_2: ─┼──┼──■────
|
110
|
-
│ │ │
|
111
|
-
q0_3: ─┼──┼──┼──■─
|
112
|
-
│ │ │ │
|
113
|
-
q1_0: ─■──┼──┼──┼─
|
114
|
-
│ │ │
|
115
|
-
q1_1: ────■──┼──┼─
|
116
|
-
│ │
|
117
|
-
q1_2: ───────■──┼─
|
118
|
-
│
|
119
|
-
q1_3: ──────────■─
|
120
|
-
|
121
|
-
|
122
|
-
Reference Circuit:
|
123
|
-
.. plot::
|
124
|
-
|
125
|
-
from qiskit.circuit import QuantumCircuit
|
126
|
-
from qiskit.circuit.library import InnerProductGate
|
127
|
-
from qiskit.visualization.library import _generate_circuit_library_visualization
|
128
|
-
circuit = QuantumCircuit(8)
|
129
|
-
circuit.append(InnerProductGate(4), [0, 1, 2, 3, 4, 5, 6, 7])
|
130
|
-
_generate_circuit_library_visualization(circuit)
|
131
|
-
"""
|
132
|
-
|
133
|
-
def __init__(
|
134
|
-
self,
|
135
|
-
num_qubits: int,
|
136
|
-
) -> None:
|
137
|
-
"""
|
138
|
-
Args:
|
139
|
-
num_qubits: width of top and bottom registers (half total number of qubits).
|
140
|
-
"""
|
141
|
-
super().__init__("inner_product", 2 * num_qubits, [])
|
142
|
-
|
143
|
-
def _define(self):
|
144
|
-
num_qubits = self.num_qubits // 2
|
145
|
-
qr_a = QuantumRegister(num_qubits, name="x")
|
146
|
-
qr_b = QuantumRegister(num_qubits, name="y")
|
147
|
-
|
148
|
-
circuit = QuantumCircuit(qr_a, qr_b, name="inner_product")
|
149
|
-
for i in range(num_qubits):
|
150
|
-
circuit.cz(qr_a[i], qr_b[i])
|
151
|
-
|
152
|
-
self.definition = circuit
|
153
|
-
|
154
|
-
def __eq__(self, other):
|
155
|
-
return isinstance(other, InnerProductGate) and self.num_qubits == other.num_qubits
|