qiskit 1.4.1__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0rc1__cp39-abi3-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +2 -5
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +24 -5
- qiskit/circuit/{add_control.py → _add_control.py} +32 -12
- qiskit/circuit/_classical_resource_map.py +5 -3
- qiskit/circuit/barrier.py +3 -7
- qiskit/circuit/classical/expr/__init__.py +31 -3
- qiskit/circuit/classical/expr/constructors.py +248 -28
- qiskit/circuit/classical/expr/expr.py +104 -3
- qiskit/circuit/classical/expr/visitors.py +75 -0
- qiskit/circuit/classical/types/__init__.py +12 -8
- qiskit/circuit/classical/types/ordering.py +14 -7
- qiskit/circuit/classical/types/types.py +36 -0
- qiskit/circuit/commutation_checker.py +34 -7
- qiskit/circuit/controlflow/__init__.py +32 -1
- qiskit/circuit/controlflow/_builder_utils.py +9 -5
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +1 -1
- qiskit/circuit/controlflow/builder.py +139 -39
- qiskit/circuit/controlflow/continue_loop.py +1 -3
- qiskit/circuit/controlflow/control_flow.py +10 -0
- qiskit/circuit/controlflow/for_loop.py +2 -1
- qiskit/circuit/controlflow/if_else.py +3 -16
- qiskit/circuit/controlflow/switch_case.py +2 -8
- qiskit/circuit/controlflow/while_loop.py +2 -7
- qiskit/circuit/controlledgate.py +2 -4
- qiskit/circuit/delay.py +40 -11
- qiskit/circuit/duration.py +0 -15
- qiskit/circuit/gate.py +2 -4
- qiskit/circuit/instruction.py +2 -141
- qiskit/circuit/instructionset.py +7 -54
- qiskit/circuit/library/__init__.py +34 -5
- qiskit/circuit/library/arithmetic/__init__.py +16 -10
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
- qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
- qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
- qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +52 -16
- qiskit/circuit/library/data_preparation/initializer.py +1 -1
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
- qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
- qiskit/circuit/library/generalized_gates/gms.py +1 -1
- qiskit/circuit/library/generalized_gates/isometry.py +1 -1
- qiskit/circuit/library/generalized_gates/pauli.py +1 -2
- qiskit/circuit/library/generalized_gates/uc.py +97 -7
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
- qiskit/circuit/library/generalized_gates/unitary.py +4 -2
- qiskit/circuit/library/hamiltonian_gate.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
- qiskit/circuit/library/n_local/n_local.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
- qiskit/circuit/library/overlap.py +2 -2
- qiskit/circuit/library/pauli_evolution.py +39 -24
- qiskit/circuit/library/phase_oracle.py +130 -51
- qiskit/circuit/library/standard_gates/__init__.py +0 -1
- qiskit/circuit/library/standard_gates/dcx.py +3 -4
- qiskit/circuit/library/standard_gates/ecr.py +3 -4
- qiskit/circuit/library/standard_gates/global_phase.py +5 -6
- qiskit/circuit/library/standard_gates/h.py +4 -9
- qiskit/circuit/library/standard_gates/i.py +2 -2
- qiskit/circuit/library/standard_gates/iswap.py +3 -4
- qiskit/circuit/library/standard_gates/p.py +15 -34
- qiskit/circuit/library/standard_gates/r.py +2 -6
- qiskit/circuit/library/standard_gates/rx.py +5 -15
- qiskit/circuit/library/standard_gates/rxx.py +3 -6
- qiskit/circuit/library/standard_gates/ry.py +5 -17
- qiskit/circuit/library/standard_gates/ryy.py +3 -6
- qiskit/circuit/library/standard_gates/rz.py +5 -17
- qiskit/circuit/library/standard_gates/rzx.py +3 -6
- qiskit/circuit/library/standard_gates/rzz.py +3 -6
- qiskit/circuit/library/standard_gates/s.py +6 -15
- qiskit/circuit/library/standard_gates/swap.py +4 -11
- qiskit/circuit/library/standard_gates/sx.py +7 -12
- qiskit/circuit/library/standard_gates/t.py +6 -7
- qiskit/circuit/library/standard_gates/u.py +2 -10
- qiskit/circuit/library/standard_gates/u1.py +5 -16
- qiskit/circuit/library/standard_gates/u2.py +2 -6
- qiskit/circuit/library/standard_gates/u3.py +3 -11
- qiskit/circuit/library/standard_gates/x.py +13 -60
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/y.py +4 -9
- qiskit/circuit/library/standard_gates/z.py +5 -15
- qiskit/circuit/measure.py +11 -2
- qiskit/circuit/parameterexpression.py +4 -0
- qiskit/circuit/quantumcircuit.py +881 -555
- qiskit/circuit/random/utils.py +12 -6
- qiskit/circuit/reset.py +5 -2
- qiskit/circuit/singleton.py +5 -11
- qiskit/circuit/store.py +0 -8
- qiskit/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +4 -2
- qiskit/converters/circuit_to_dagdependency.py +0 -2
- qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
- qiskit/converters/circuit_to_gate.py +1 -1
- qiskit/converters/circuit_to_instruction.py +16 -29
- qiskit/converters/dag_to_circuit.py +5 -5
- qiskit/converters/dag_to_dagdependency.py +0 -1
- qiskit/converters/dag_to_dagdependency_v2.py +0 -1
- qiskit/converters/dagdependency_to_circuit.py +0 -6
- qiskit/converters/dagdependency_to_dag.py +0 -6
- qiskit/dagcircuit/collect_blocks.py +32 -20
- qiskit/dagcircuit/dagdependency.py +3 -37
- qiskit/dagcircuit/dagdependency_v2.py +2 -80
- qiskit/dagcircuit/dagnode.py +14 -2
- qiskit/passmanager/__init__.py +24 -6
- qiskit/passmanager/passmanager.py +26 -24
- qiskit/primitives/__init__.py +44 -35
- qiskit/primitives/backend_estimator_v2.py +102 -23
- qiskit/primitives/backend_sampler_v2.py +5 -20
- qiskit/primitives/base/__init__.py +4 -4
- qiskit/primitives/base/base_estimator.py +77 -82
- qiskit/primitives/base/base_primitive_job.py +2 -2
- qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
- qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
- qiskit/primitives/base/base_sampler.py +52 -60
- qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
- qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
- qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
- qiskit/primitives/containers/bindings_array.py +3 -1
- qiskit/primitives/containers/bit_array.py +23 -0
- qiskit/primitives/containers/data_bin.py +3 -1
- qiskit/primitives/containers/observables_array.py +19 -2
- qiskit/primitives/statevector_sampler.py +6 -8
- qiskit/primitives/utils.py +14 -189
- qiskit/providers/__init__.py +4 -130
- qiskit/providers/backend.py +11 -314
- qiskit/providers/basic_provider/__init__.py +3 -1
- qiskit/providers/basic_provider/basic_provider.py +29 -9
- qiskit/providers/basic_provider/basic_simulator.py +158 -298
- qiskit/providers/exceptions.py +0 -33
- qiskit/providers/fake_provider/__init__.py +0 -37
- qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
- qiskit/qasm2/__init__.py +21 -6
- qiskit/qasm2/export.py +2 -10
- qiskit/qasm2/parse.py +11 -25
- qiskit/qasm3/__init__.py +5 -1
- qiskit/qasm3/ast.py +44 -0
- qiskit/qasm3/exporter.py +65 -27
- qiskit/qasm3/printer.py +35 -4
- qiskit/qpy/__init__.py +141 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +91 -116
- qiskit/qpy/binary_io/schedules.py +61 -388
- qiskit/qpy/binary_io/value.py +154 -28
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +29 -62
- qiskit/qpy/type_keys.py +58 -221
- qiskit/quantum_info/analysis/distance.py +3 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
- qiskit/quantum_info/operators/operator.py +6 -2
- qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
- qiskit/quantum_info/states/densitymatrix.py +16 -6
- qiskit/quantum_info/states/stabilizerstate.py +35 -4
- qiskit/quantum_info/states/statevector.py +16 -6
- qiskit/result/__init__.py +5 -17
- qiskit/result/models.py +18 -10
- qiskit/result/result.py +28 -126
- qiskit/result/sampled_expval.py +1 -2
- qiskit/result/utils.py +3 -4
- qiskit/synthesis/__init__.py +21 -1
- qiskit/synthesis/arithmetic/__init__.py +3 -1
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
- qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
- qiskit/synthesis/evolution/lie_trotter.py +10 -7
- qiskit/synthesis/evolution/product_formula.py +44 -35
- qiskit/synthesis/evolution/qdrift.py +17 -24
- qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
- qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
- qiskit/synthesis/two_qubit/__init__.py +1 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
- qiskit/transpiler/__init__.py +32 -232
- qiskit/transpiler/basepasses.py +20 -51
- qiskit/transpiler/layout.py +1 -1
- qiskit/transpiler/passes/__init__.py +2 -40
- qiskit/transpiler/passes/basis/basis_translator.py +4 -3
- qiskit/transpiler/passes/basis/decompose.py +1 -15
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
- qiskit/transpiler/passes/layout/apply_layout.py +4 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +4 -4
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
- qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
- qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
- qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
- qiskit/transpiler/passes/optimization/__init__.py +1 -3
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
- qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
- qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
- qiskit/transpiler/passes/routing/__init__.py +0 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
- qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
- qiskit/transpiler/passes/scheduling/__init__.py +1 -7
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +30 -2
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +127 -59
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
- qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
- qiskit/transpiler/passes/synthesis/plugin.py +4 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
- qiskit/transpiler/passes/utils/control_flow.py +2 -6
- qiskit/transpiler/passes/utils/gate_direction.py +7 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
- qiskit/transpiler/passmanager.py +13 -0
- qiskit/transpiler/passmanager_config.py +5 -81
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
- qiskit/transpiler/preset_passmanagers/common.py +140 -167
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +101 -322
- qiskit/transpiler/preset_passmanagers/level0.py +2 -11
- qiskit/transpiler/preset_passmanagers/level1.py +2 -14
- qiskit/transpiler/preset_passmanagers/level2.py +2 -12
- qiskit/transpiler/preset_passmanagers/level3.py +2 -11
- qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
- qiskit/transpiler/target.py +67 -524
- qiskit/user_config.py +8 -4
- qiskit/utils/__init__.py +13 -12
- qiskit/utils/deprecation.py +4 -112
- qiskit/utils/optionals.py +11 -4
- qiskit/utils/parallel.py +214 -87
- qiskit/utils/units.py +4 -1
- qiskit/visualization/__init__.py +3 -7
- qiskit/visualization/array.py +4 -1
- qiskit/visualization/bloch.py +1 -1
- qiskit/visualization/circuit/_utils.py +19 -19
- qiskit/visualization/circuit/circuit_visualization.py +11 -4
- qiskit/visualization/circuit/matplotlib.py +13 -23
- qiskit/visualization/circuit/text.py +7 -3
- qiskit/visualization/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +6 -0
- qiskit/visualization/timeline/core.py +18 -12
- qiskit/visualization/timeline/interface.py +19 -18
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +2 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/entry_points.txt +8 -2
- qiskit/assembler/__init__.py +0 -42
- qiskit/assembler/assemble_circuits.py +0 -451
- qiskit/assembler/assemble_schedules.py +0 -367
- qiskit/assembler/disassemble.py +0 -310
- qiskit/assembler/run_config.py +0 -77
- qiskit/circuit/bit.py +0 -106
- qiskit/circuit/classicalfunction/__init__.py +0 -152
- qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
- qiskit/circuit/classicalfunction/classical_element.py +0 -54
- qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
- qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
- qiskit/circuit/classicalfunction/exceptions.py +0 -41
- qiskit/circuit/classicalfunction/types.py +0 -18
- qiskit/circuit/classicalfunction/utils.py +0 -91
- qiskit/circuit/classicalregister.py +0 -57
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
- qiskit/circuit/quantumregister.py +0 -75
- qiskit/circuit/register.py +0 -246
- qiskit/compiler/assembler.py +0 -689
- qiskit/compiler/scheduler.py +0 -109
- qiskit/compiler/sequencer.py +0 -71
- qiskit/primitives/backend_estimator.py +0 -486
- qiskit/primitives/backend_sampler.py +0 -222
- qiskit/primitives/estimator.py +0 -172
- qiskit/primitives/sampler.py +0 -162
- qiskit/providers/backend_compat.py +0 -507
- qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
- qiskit/providers/fake_provider/fake_1q.py +0 -91
- qiskit/providers/fake_provider/fake_backend.py +0 -165
- qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
- qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
- qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
- qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
- qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
- qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
- qiskit/providers/models/__init__.py +0 -89
- qiskit/providers/models/backendconfiguration.py +0 -1040
- qiskit/providers/models/backendproperties.py +0 -535
- qiskit/providers/models/backendstatus.py +0 -104
- qiskit/providers/models/jobstatus.py +0 -77
- qiskit/providers/models/pulsedefaults.py +0 -305
- qiskit/providers/provider.py +0 -95
- qiskit/pulse/__init__.py +0 -158
- qiskit/pulse/builder.py +0 -2262
- qiskit/pulse/calibration_entries.py +0 -381
- qiskit/pulse/channels.py +0 -227
- qiskit/pulse/configuration.py +0 -245
- qiskit/pulse/exceptions.py +0 -45
- qiskit/pulse/filters.py +0 -309
- qiskit/pulse/instruction_schedule_map.py +0 -424
- qiskit/pulse/instructions/__init__.py +0 -67
- qiskit/pulse/instructions/acquire.py +0 -150
- qiskit/pulse/instructions/delay.py +0 -71
- qiskit/pulse/instructions/directives.py +0 -154
- qiskit/pulse/instructions/frequency.py +0 -135
- qiskit/pulse/instructions/instruction.py +0 -270
- qiskit/pulse/instructions/phase.py +0 -152
- qiskit/pulse/instructions/play.py +0 -99
- qiskit/pulse/instructions/reference.py +0 -100
- qiskit/pulse/instructions/snapshot.py +0 -82
- qiskit/pulse/library/__init__.py +0 -97
- qiskit/pulse/library/continuous.py +0 -430
- qiskit/pulse/library/pulse.py +0 -148
- qiskit/pulse/library/samplers/__init__.py +0 -15
- qiskit/pulse/library/samplers/decorators.py +0 -295
- qiskit/pulse/library/samplers/strategies.py +0 -71
- qiskit/pulse/library/symbolic_pulses.py +0 -1989
- qiskit/pulse/library/waveform.py +0 -136
- qiskit/pulse/macros.py +0 -262
- qiskit/pulse/parameter_manager.py +0 -445
- qiskit/pulse/parser.py +0 -314
- qiskit/pulse/reference_manager.py +0 -58
- qiskit/pulse/schedule.py +0 -1854
- qiskit/pulse/transforms/__init__.py +0 -106
- qiskit/pulse/transforms/alignments.py +0 -406
- qiskit/pulse/transforms/base_transforms.py +0 -71
- qiskit/pulse/transforms/canonicalization.py +0 -498
- qiskit/pulse/transforms/dag.py +0 -122
- qiskit/pulse/utils.py +0 -149
- qiskit/qobj/__init__.py +0 -75
- qiskit/qobj/common.py +0 -81
- qiskit/qobj/converters/__init__.py +0 -18
- qiskit/qobj/converters/lo_config.py +0 -177
- qiskit/qobj/converters/pulse_instruction.py +0 -897
- qiskit/qobj/pulse_qobj.py +0 -709
- qiskit/qobj/qasm_qobj.py +0 -708
- qiskit/qobj/utils.py +0 -46
- qiskit/result/mitigation/base_readout_mitigator.py +0 -79
- qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
- qiskit/result/mitigation/local_readout_mitigator.py +0 -328
- qiskit/result/mitigation/utils.py +0 -217
- qiskit/scheduler/__init__.py +0 -40
- qiskit/scheduler/config.py +0 -37
- qiskit/scheduler/lowering.py +0 -187
- qiskit/scheduler/methods/__init__.py +0 -15
- qiskit/scheduler/methods/basic.py +0 -140
- qiskit/scheduler/schedule_circuit.py +0 -69
- qiskit/scheduler/sequence.py +0 -104
- qiskit/transpiler/passes/calibration/__init__.py +0 -17
- qiskit/transpiler/passes/calibration/base_builder.py +0 -79
- qiskit/transpiler/passes/calibration/builders.py +0 -20
- qiskit/transpiler/passes/calibration/exceptions.py +0 -22
- qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
- qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
- qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
- qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
- qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
- qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
- qiskit/transpiler/passes/scheduling/alap.py +0 -153
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
- qiskit/transpiler/passes/scheduling/asap.py +0 -175
- qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
- qiskit/utils/deprecate_pulse.py +0 -119
- qiskit/utils/multiprocessing.py +0 -56
- qiskit/visualization/pulse_v2/__init__.py +0 -21
- qiskit/visualization/pulse_v2/core.py +0 -901
- qiskit/visualization/pulse_v2/device_info.py +0 -173
- qiskit/visualization/pulse_v2/drawings.py +0 -253
- qiskit/visualization/pulse_v2/events.py +0 -254
- qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
- qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
- qiskit/visualization/pulse_v2/generators/chart.py +0 -208
- qiskit/visualization/pulse_v2/generators/frame.py +0 -436
- qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
- qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
- qiskit/visualization/pulse_v2/interface.py +0 -459
- qiskit/visualization/pulse_v2/layouts.py +0 -387
- qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
- qiskit/visualization/pulse_v2/stylesheet.py +0 -312
- qiskit/visualization/pulse_v2/types.py +0 -242
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -1,405 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2018, 2019.
|
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
|
-
Multiple-Controlled U3 gate. Not using ancillary qubits.
|
14
|
-
"""
|
15
|
-
|
16
|
-
from math import pi
|
17
|
-
import math
|
18
|
-
from typing import Optional, Union, Tuple, List
|
19
|
-
import numpy as np
|
20
|
-
|
21
|
-
from qiskit.circuit import QuantumCircuit, QuantumRegister, Qubit, ParameterExpression
|
22
|
-
from qiskit.circuit.library.standard_gates.x import MCXGate
|
23
|
-
from qiskit.circuit.library.standard_gates.u3 import _generate_gray_code
|
24
|
-
from qiskit.circuit.parameterexpression import ParameterValueType
|
25
|
-
from qiskit.exceptions import QiskitError
|
26
|
-
|
27
|
-
|
28
|
-
def _apply_cu(circuit, theta, phi, lam, control, target, use_basis_gates=True):
|
29
|
-
if use_basis_gates:
|
30
|
-
# pylint: disable=cyclic-import
|
31
|
-
# ┌──────────────┐
|
32
|
-
# control: ┤ P(λ/2 + φ/2) ├──■──────────────────────────────────■────────────────
|
33
|
-
# ├──────────────┤┌─┴─┐┌────────────────────────────┐┌─┴─┐┌────────────┐
|
34
|
-
# target: ┤ P(λ/2 - φ/2) ├┤ X ├┤ U(-0.5*0,0,-0.5*λ - 0.5*φ) ├┤ X ├┤ U(0/2,φ,0) ├
|
35
|
-
# └──────────────┘└───┘└────────────────────────────┘└───┘└────────────┘
|
36
|
-
circuit.p((lam + phi) / 2, [control])
|
37
|
-
circuit.p((lam - phi) / 2, [target])
|
38
|
-
circuit.cx(control, target)
|
39
|
-
circuit.u(-theta / 2, 0, -(phi + lam) / 2, [target])
|
40
|
-
circuit.cx(control, target)
|
41
|
-
circuit.u(theta / 2, phi, 0, [target])
|
42
|
-
else:
|
43
|
-
circuit.cu(theta, phi, lam, 0, control, target)
|
44
|
-
|
45
|
-
|
46
|
-
def _apply_mcu_graycode(circuit, theta, phi, lam, ctls, tgt, use_basis_gates):
|
47
|
-
"""Apply multi-controlled u gate from ctls to tgt using graycode
|
48
|
-
pattern with single-step angles theta, phi, lam."""
|
49
|
-
|
50
|
-
n = len(ctls)
|
51
|
-
|
52
|
-
gray_code = _generate_gray_code(n)
|
53
|
-
last_pattern = None
|
54
|
-
|
55
|
-
for pattern in gray_code:
|
56
|
-
if "1" not in pattern:
|
57
|
-
continue
|
58
|
-
if last_pattern is None:
|
59
|
-
last_pattern = pattern
|
60
|
-
# find left most set bit
|
61
|
-
lm_pos = list(pattern).index("1")
|
62
|
-
|
63
|
-
# find changed bit
|
64
|
-
comp = [i != j for i, j in zip(pattern, last_pattern)]
|
65
|
-
if True in comp:
|
66
|
-
pos = comp.index(True)
|
67
|
-
else:
|
68
|
-
pos = None
|
69
|
-
if pos is not None:
|
70
|
-
if pos != lm_pos:
|
71
|
-
circuit.cx(ctls[pos], ctls[lm_pos])
|
72
|
-
else:
|
73
|
-
indices = [i for i, x in enumerate(pattern) if x == "1"]
|
74
|
-
for idx in indices[1:]:
|
75
|
-
circuit.cx(ctls[idx], ctls[lm_pos])
|
76
|
-
# check parity and undo rotation
|
77
|
-
if pattern.count("1") % 2 == 0:
|
78
|
-
# inverse CU: u(theta, phi, lamb)^dagger = u(-theta, -lam, -phi)
|
79
|
-
_apply_cu(
|
80
|
-
circuit, -theta, -lam, -phi, ctls[lm_pos], tgt, use_basis_gates=use_basis_gates
|
81
|
-
)
|
82
|
-
else:
|
83
|
-
_apply_cu(circuit, theta, phi, lam, ctls[lm_pos], tgt, use_basis_gates=use_basis_gates)
|
84
|
-
last_pattern = pattern
|
85
|
-
|
86
|
-
|
87
|
-
def _mcsu2_real_diagonal(
|
88
|
-
unitary: np.ndarray,
|
89
|
-
num_controls: int,
|
90
|
-
ctrl_state: Optional[str] = None,
|
91
|
-
use_basis_gates: bool = False,
|
92
|
-
) -> QuantumCircuit:
|
93
|
-
"""
|
94
|
-
Return a multi-controlled SU(2) gate [1]_ with a real main diagonal or secondary diagonal.
|
95
|
-
|
96
|
-
Args:
|
97
|
-
unitary: SU(2) unitary matrix with one real diagonal.
|
98
|
-
num_controls: The number of control qubits.
|
99
|
-
ctrl_state: The state on which the SU(2) operation is controlled. Defaults to all
|
100
|
-
control qubits being in state 1.
|
101
|
-
use_basis_gates: If ``True``, use ``[p, u, cx]`` gates to implement the decomposition.
|
102
|
-
|
103
|
-
Returns:
|
104
|
-
A :class:`.QuantumCircuit` implementing the multi-controlled SU(2) gate.
|
105
|
-
|
106
|
-
Raises:
|
107
|
-
QiskitError: If the input matrix is invalid.
|
108
|
-
|
109
|
-
References:
|
110
|
-
|
111
|
-
.. [1]: R. Vale et al. Decomposition of Multi-controlled Special Unitary Single-Qubit Gates
|
112
|
-
`arXiv:2302.06377 (2023) <https://arxiv.org/abs/2302.06377>`__
|
113
|
-
|
114
|
-
"""
|
115
|
-
# pylint: disable=cyclic-import
|
116
|
-
from .x import MCXVChain
|
117
|
-
from qiskit.circuit.library.generalized_gates import UnitaryGate
|
118
|
-
from qiskit.quantum_info.operators.predicates import is_unitary_matrix
|
119
|
-
from qiskit.compiler import transpile
|
120
|
-
|
121
|
-
if unitary.shape != (2, 2):
|
122
|
-
raise QiskitError(f"The unitary must be a 2x2 matrix, but has shape {unitary.shape}.")
|
123
|
-
|
124
|
-
if not is_unitary_matrix(unitary):
|
125
|
-
raise QiskitError(f"The unitary in must be an unitary matrix, but is {unitary}.")
|
126
|
-
|
127
|
-
if not np.isclose(1.0, np.linalg.det(unitary)):
|
128
|
-
raise QiskitError("Invalid Value _mcsu2_real_diagonal requires det(unitary) equal to one.")
|
129
|
-
|
130
|
-
is_main_diag_real = np.isclose(unitary[0, 0].imag, 0.0) and np.isclose(unitary[1, 1].imag, 0.0)
|
131
|
-
is_secondary_diag_real = np.isclose(unitary[0, 1].imag, 0.0) and np.isclose(
|
132
|
-
unitary[1, 0].imag, 0.0
|
133
|
-
)
|
134
|
-
|
135
|
-
if not is_main_diag_real and not is_secondary_diag_real:
|
136
|
-
raise QiskitError("The unitary must have one real diagonal.")
|
137
|
-
|
138
|
-
if is_secondary_diag_real:
|
139
|
-
x = unitary[0, 1]
|
140
|
-
z = unitary[1, 1]
|
141
|
-
else:
|
142
|
-
x = -unitary[0, 1].real
|
143
|
-
z = unitary[1, 1] - unitary[0, 1].imag * 1.0j
|
144
|
-
|
145
|
-
if np.isclose(z, -1):
|
146
|
-
s_op = [[1.0, 0.0], [0.0, 1.0j]]
|
147
|
-
else:
|
148
|
-
alpha_r = math.sqrt((math.sqrt((z.real + 1.0) / 2.0) + 1.0) / 2.0)
|
149
|
-
alpha_i = z.imag / (
|
150
|
-
2.0 * math.sqrt((z.real + 1.0) * (math.sqrt((z.real + 1.0) / 2.0) + 1.0))
|
151
|
-
)
|
152
|
-
alpha = alpha_r + 1.0j * alpha_i
|
153
|
-
beta = x / (2.0 * math.sqrt((z.real + 1.0) * (math.sqrt((z.real + 1.0) / 2.0) + 1.0)))
|
154
|
-
|
155
|
-
# S gate definition
|
156
|
-
s_op = np.array([[alpha, -np.conj(beta)], [beta, np.conj(alpha)]])
|
157
|
-
|
158
|
-
s_gate = UnitaryGate(s_op)
|
159
|
-
|
160
|
-
k_1 = math.ceil(num_controls / 2.0)
|
161
|
-
k_2 = math.floor(num_controls / 2.0)
|
162
|
-
|
163
|
-
ctrl_state_k_1 = None
|
164
|
-
ctrl_state_k_2 = None
|
165
|
-
|
166
|
-
if ctrl_state is not None:
|
167
|
-
str_ctrl_state = f"{ctrl_state:0{num_controls}b}"
|
168
|
-
ctrl_state_k_1 = str_ctrl_state[::-1][:k_1][::-1]
|
169
|
-
ctrl_state_k_2 = str_ctrl_state[::-1][k_1:][::-1]
|
170
|
-
|
171
|
-
circuit = QuantumCircuit(num_controls + 1, name="MCSU2")
|
172
|
-
controls = list(range(num_controls)) # control indices, defined for code legibility
|
173
|
-
target = num_controls # target index, defined for code legibility
|
174
|
-
|
175
|
-
if not is_secondary_diag_real:
|
176
|
-
circuit.h(target)
|
177
|
-
|
178
|
-
mcx_1 = MCXVChain(num_ctrl_qubits=k_1, dirty_ancillas=True, ctrl_state=ctrl_state_k_1)
|
179
|
-
circuit.append(mcx_1, controls[:k_1] + [target] + controls[k_1 : 2 * k_1 - 2])
|
180
|
-
circuit.append(s_gate, [target])
|
181
|
-
|
182
|
-
mcx_2 = MCXVChain(
|
183
|
-
num_ctrl_qubits=k_2,
|
184
|
-
dirty_ancillas=True,
|
185
|
-
ctrl_state=ctrl_state_k_2,
|
186
|
-
# action_only=general_su2_optimization # Requires PR #9687
|
187
|
-
)
|
188
|
-
circuit.append(mcx_2.inverse(), controls[k_1:] + [target] + controls[k_1 - k_2 + 2 : k_1])
|
189
|
-
circuit.append(s_gate.inverse(), [target])
|
190
|
-
|
191
|
-
mcx_3 = MCXVChain(num_ctrl_qubits=k_1, dirty_ancillas=True, ctrl_state=ctrl_state_k_1)
|
192
|
-
circuit.append(mcx_3, controls[:k_1] + [target] + controls[k_1 : 2 * k_1 - 2])
|
193
|
-
circuit.append(s_gate, [target])
|
194
|
-
|
195
|
-
mcx_4 = MCXVChain(num_ctrl_qubits=k_2, dirty_ancillas=True, ctrl_state=ctrl_state_k_2)
|
196
|
-
circuit.append(mcx_4, controls[k_1:] + [target] + controls[k_1 - k_2 + 2 : k_1])
|
197
|
-
circuit.append(s_gate.inverse(), [target])
|
198
|
-
|
199
|
-
if not is_secondary_diag_real:
|
200
|
-
circuit.h(target)
|
201
|
-
|
202
|
-
if use_basis_gates:
|
203
|
-
circuit = transpile(circuit, basis_gates=["p", "u", "cx"], qubits_initially_zero=False)
|
204
|
-
|
205
|
-
return circuit
|
206
|
-
|
207
|
-
|
208
|
-
def mcrx(
|
209
|
-
self,
|
210
|
-
theta: ParameterValueType,
|
211
|
-
q_controls: Union[QuantumRegister, List[Qubit]],
|
212
|
-
q_target: Qubit,
|
213
|
-
use_basis_gates: bool = False,
|
214
|
-
):
|
215
|
-
"""
|
216
|
-
Apply Multiple-Controlled X rotation gate
|
217
|
-
|
218
|
-
Args:
|
219
|
-
self (QuantumCircuit): The QuantumCircuit object to apply the mcrx gate on.
|
220
|
-
theta (float): angle theta
|
221
|
-
q_controls (QuantumRegister or list(Qubit)): The list of control qubits
|
222
|
-
q_target (Qubit): The target qubit
|
223
|
-
use_basis_gates (bool): use p, u, cx
|
224
|
-
|
225
|
-
Raises:
|
226
|
-
QiskitError: parameter errors
|
227
|
-
"""
|
228
|
-
from .rx import RXGate
|
229
|
-
|
230
|
-
control_qubits = self._qbit_argument_conversion(q_controls)
|
231
|
-
target_qubit = self._qbit_argument_conversion(q_target)
|
232
|
-
if len(target_qubit) != 1:
|
233
|
-
raise QiskitError("The mcrz gate needs a single qubit as target.")
|
234
|
-
all_qubits = control_qubits + target_qubit
|
235
|
-
target_qubit = target_qubit[0]
|
236
|
-
self._check_dups(all_qubits)
|
237
|
-
|
238
|
-
n_c = len(control_qubits)
|
239
|
-
if n_c == 1: # cu
|
240
|
-
_apply_cu(
|
241
|
-
self,
|
242
|
-
theta,
|
243
|
-
-pi / 2,
|
244
|
-
pi / 2,
|
245
|
-
control_qubits[0],
|
246
|
-
target_qubit,
|
247
|
-
use_basis_gates=use_basis_gates,
|
248
|
-
)
|
249
|
-
elif n_c < 4:
|
250
|
-
theta_step = theta * (1 / (2 ** (n_c - 1)))
|
251
|
-
_apply_mcu_graycode(
|
252
|
-
self,
|
253
|
-
theta_step,
|
254
|
-
-pi / 2,
|
255
|
-
pi / 2,
|
256
|
-
control_qubits,
|
257
|
-
target_qubit,
|
258
|
-
use_basis_gates=use_basis_gates,
|
259
|
-
)
|
260
|
-
else:
|
261
|
-
if isinstance(theta, ParameterExpression):
|
262
|
-
raise QiskitError(f"Cannot synthesize MCRX with unbound parameter: {theta}.")
|
263
|
-
|
264
|
-
cgate = _mcsu2_real_diagonal(
|
265
|
-
RXGate(theta).to_matrix(),
|
266
|
-
num_controls=len(control_qubits),
|
267
|
-
use_basis_gates=use_basis_gates,
|
268
|
-
)
|
269
|
-
self.compose(cgate, control_qubits + [target_qubit], inplace=True)
|
270
|
-
|
271
|
-
|
272
|
-
def mcry(
|
273
|
-
self,
|
274
|
-
theta: ParameterValueType,
|
275
|
-
q_controls: Union[QuantumRegister, List[Qubit]],
|
276
|
-
q_target: Qubit,
|
277
|
-
q_ancillae: Optional[Union[QuantumRegister, Tuple[QuantumRegister, int]]] = None,
|
278
|
-
mode: Optional[str] = None,
|
279
|
-
use_basis_gates: bool = False,
|
280
|
-
):
|
281
|
-
"""
|
282
|
-
Apply Multiple-Controlled Y rotation gate
|
283
|
-
|
284
|
-
Args:
|
285
|
-
self (QuantumCircuit): The QuantumCircuit object to apply the mcry gate on.
|
286
|
-
theta (float): angle theta
|
287
|
-
q_controls (list(Qubit)): The list of control qubits
|
288
|
-
q_target (Qubit): The target qubit
|
289
|
-
q_ancillae (QuantumRegister or tuple(QuantumRegister, int)): The list of ancillary qubits.
|
290
|
-
mode (string): The implementation mode to use
|
291
|
-
use_basis_gates (bool): use p, u, cx
|
292
|
-
|
293
|
-
Raises:
|
294
|
-
QiskitError: parameter errors
|
295
|
-
"""
|
296
|
-
from .ry import RYGate
|
297
|
-
|
298
|
-
control_qubits = self._qbit_argument_conversion(q_controls)
|
299
|
-
target_qubit = self._qbit_argument_conversion(q_target)
|
300
|
-
if len(target_qubit) != 1:
|
301
|
-
raise QiskitError("The mcrz gate needs a single qubit as target.")
|
302
|
-
ancillary_qubits = [] if q_ancillae is None else self._qbit_argument_conversion(q_ancillae)
|
303
|
-
all_qubits = control_qubits + target_qubit + ancillary_qubits
|
304
|
-
target_qubit = target_qubit[0]
|
305
|
-
self._check_dups(all_qubits)
|
306
|
-
|
307
|
-
# auto-select the best mode
|
308
|
-
if mode is None:
|
309
|
-
# if enough ancillary qubits are provided, use the 'v-chain' method
|
310
|
-
additional_vchain = MCXGate.get_num_ancilla_qubits(len(control_qubits), "v-chain")
|
311
|
-
if len(ancillary_qubits) >= additional_vchain:
|
312
|
-
mode = "basic"
|
313
|
-
else:
|
314
|
-
mode = "noancilla"
|
315
|
-
|
316
|
-
if mode == "basic":
|
317
|
-
self.ry(theta / 2, q_target)
|
318
|
-
self.mcx(q_controls, q_target, q_ancillae, mode="v-chain")
|
319
|
-
self.ry(-theta / 2, q_target)
|
320
|
-
self.mcx(q_controls, q_target, q_ancillae, mode="v-chain")
|
321
|
-
elif mode == "noancilla":
|
322
|
-
n_c = len(control_qubits)
|
323
|
-
if n_c == 1: # cu
|
324
|
-
_apply_cu(
|
325
|
-
self, theta, 0, 0, control_qubits[0], target_qubit, use_basis_gates=use_basis_gates
|
326
|
-
)
|
327
|
-
elif n_c < 4:
|
328
|
-
theta_step = theta * (1 / (2 ** (n_c - 1)))
|
329
|
-
_apply_mcu_graycode(
|
330
|
-
self,
|
331
|
-
theta_step,
|
332
|
-
0,
|
333
|
-
0,
|
334
|
-
control_qubits,
|
335
|
-
target_qubit,
|
336
|
-
use_basis_gates=use_basis_gates,
|
337
|
-
)
|
338
|
-
else:
|
339
|
-
if isinstance(theta, ParameterExpression):
|
340
|
-
raise QiskitError(f"Cannot synthesize MCRY with unbound parameter: {theta}.")
|
341
|
-
|
342
|
-
cgate = _mcsu2_real_diagonal(
|
343
|
-
RYGate(theta).to_matrix(),
|
344
|
-
num_controls=len(control_qubits),
|
345
|
-
use_basis_gates=use_basis_gates,
|
346
|
-
)
|
347
|
-
self.compose(cgate, control_qubits + [target_qubit], inplace=True)
|
348
|
-
else:
|
349
|
-
raise QiskitError(f"Unrecognized mode for building MCRY circuit: {mode}.")
|
350
|
-
|
351
|
-
|
352
|
-
def mcrz(
|
353
|
-
self,
|
354
|
-
lam: ParameterValueType,
|
355
|
-
q_controls: Union[QuantumRegister, List[Qubit]],
|
356
|
-
q_target: Qubit,
|
357
|
-
use_basis_gates: bool = False,
|
358
|
-
):
|
359
|
-
"""
|
360
|
-
Apply Multiple-Controlled Z rotation gate
|
361
|
-
|
362
|
-
Args:
|
363
|
-
self (QuantumCircuit): The QuantumCircuit object to apply the mcrz gate on.
|
364
|
-
lam (float): angle lambda
|
365
|
-
q_controls (list(Qubit)): The list of control qubits
|
366
|
-
q_target (Qubit): The target qubit
|
367
|
-
use_basis_gates (bool): use p, u, cx
|
368
|
-
|
369
|
-
Raises:
|
370
|
-
QiskitError: parameter errors
|
371
|
-
"""
|
372
|
-
from .rz import CRZGate, RZGate
|
373
|
-
|
374
|
-
control_qubits = self._qbit_argument_conversion(q_controls)
|
375
|
-
target_qubit = self._qbit_argument_conversion(q_target)
|
376
|
-
if len(target_qubit) != 1:
|
377
|
-
raise QiskitError("The mcrz gate needs a single qubit as target.")
|
378
|
-
all_qubits = control_qubits + target_qubit
|
379
|
-
target_qubit = target_qubit[0]
|
380
|
-
self._check_dups(all_qubits)
|
381
|
-
|
382
|
-
n_c = len(control_qubits)
|
383
|
-
if n_c == 1:
|
384
|
-
if use_basis_gates:
|
385
|
-
self.u(0, 0, lam / 2, target_qubit)
|
386
|
-
self.cx(control_qubits[0], target_qubit)
|
387
|
-
self.u(0, 0, -lam / 2, target_qubit)
|
388
|
-
self.cx(control_qubits[0], target_qubit)
|
389
|
-
else:
|
390
|
-
self.append(CRZGate(lam), control_qubits + [target_qubit])
|
391
|
-
else:
|
392
|
-
if isinstance(lam, ParameterExpression):
|
393
|
-
raise QiskitError(f"Cannot synthesize MCRZ with unbound parameter: {lam}.")
|
394
|
-
|
395
|
-
cgate = _mcsu2_real_diagonal(
|
396
|
-
RZGate(lam).to_matrix(),
|
397
|
-
num_controls=len(control_qubits),
|
398
|
-
use_basis_gates=use_basis_gates,
|
399
|
-
)
|
400
|
-
self.compose(cgate, control_qubits + [target_qubit], inplace=True)
|
401
|
-
|
402
|
-
|
403
|
-
QuantumCircuit.mcrx = mcrx
|
404
|
-
QuantumCircuit.mcry = mcry
|
405
|
-
QuantumCircuit.mcrz = mcrz
|
@@ -1,75 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2017.
|
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
|
-
# pylint: disable=bad-docstring-quotes
|
14
|
-
|
15
|
-
"""
|
16
|
-
Quantum register reference object.
|
17
|
-
"""
|
18
|
-
import itertools
|
19
|
-
|
20
|
-
from qiskit.circuit.exceptions import CircuitError
|
21
|
-
|
22
|
-
from .register import Register
|
23
|
-
from .bit import Bit
|
24
|
-
|
25
|
-
|
26
|
-
class Qubit(Bit):
|
27
|
-
"""Implement a quantum bit."""
|
28
|
-
|
29
|
-
__slots__ = ()
|
30
|
-
|
31
|
-
def __init__(self, register=None, index=None):
|
32
|
-
"""Creates a qubit.
|
33
|
-
|
34
|
-
Args:
|
35
|
-
register (QuantumRegister): Optional. A quantum register containing the bit.
|
36
|
-
index (int): Optional. The index of the bit in its containing register.
|
37
|
-
|
38
|
-
Raises:
|
39
|
-
CircuitError: if the provided register is not a valid :class:`QuantumRegister`
|
40
|
-
"""
|
41
|
-
|
42
|
-
if register is None or isinstance(register, QuantumRegister):
|
43
|
-
super().__init__(register, index)
|
44
|
-
else:
|
45
|
-
raise CircuitError(
|
46
|
-
f"Qubit needs a QuantumRegister and {type(register).__name__} was provided"
|
47
|
-
)
|
48
|
-
|
49
|
-
|
50
|
-
class QuantumRegister(Register):
|
51
|
-
"""Implement a quantum register."""
|
52
|
-
|
53
|
-
# Counter for the number of instances in this class.
|
54
|
-
instances_counter = itertools.count()
|
55
|
-
# Prefix to use for auto naming.
|
56
|
-
prefix = "q"
|
57
|
-
bit_type = Qubit
|
58
|
-
|
59
|
-
|
60
|
-
class AncillaQubit(Qubit):
|
61
|
-
"""A qubit used as ancillary qubit."""
|
62
|
-
|
63
|
-
__slots__ = ()
|
64
|
-
|
65
|
-
pass
|
66
|
-
|
67
|
-
|
68
|
-
class AncillaRegister(QuantumRegister):
|
69
|
-
"""Implement an ancilla register."""
|
70
|
-
|
71
|
-
# Counter for the number of instances in this class.
|
72
|
-
instances_counter = itertools.count()
|
73
|
-
# Prefix to use for auto naming.
|
74
|
-
prefix = "a"
|
75
|
-
bit_type = AncillaQubit
|