qiskit 1.3.0b1__cp39-abi3-win32.whl → 1.3.0rc2__cp39-abi3-win32.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +20 -1
- qiskit/_accelerate.pyd +0 -0
- qiskit/assembler/assemble_schedules.py +2 -0
- qiskit/circuit/__init__.py +44 -1
- qiskit/circuit/_standard_gates_commutations.py +585 -0
- qiskit/circuit/barrier.py +2 -0
- qiskit/circuit/controlflow/builder.py +3 -3
- qiskit/circuit/controlflow/if_else.py +13 -5
- qiskit/circuit/controlflow/while_loop.py +10 -2
- qiskit/circuit/delay.py +20 -3
- qiskit/circuit/equivalence.py +13 -214
- qiskit/circuit/gate.py +3 -1
- qiskit/circuit/instruction.py +32 -11
- qiskit/circuit/instructionset.py +2 -0
- qiskit/circuit/library/__init__.py +110 -14
- qiskit/circuit/library/arithmetic/__init__.py +9 -2
- qiskit/circuit/library/arithmetic/adders/__init__.py +1 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +154 -2
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +20 -56
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +14 -1
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +21 -91
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +1 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +8 -1
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +94 -3
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +8 -1
- qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
- qiskit/circuit/library/basis_change/qft.py +20 -38
- qiskit/circuit/library/blueprintcircuit.py +64 -0
- qiskit/circuit/library/boolean_logic/__init__.py +4 -4
- qiskit/circuit/library/boolean_logic/inner_product.py +81 -4
- qiskit/circuit/library/boolean_logic/quantum_and.py +107 -4
- qiskit/circuit/library/boolean_logic/quantum_or.py +107 -3
- qiskit/circuit/library/boolean_logic/quantum_xor.py +97 -3
- qiskit/circuit/library/data_preparation/__init__.py +6 -3
- qiskit/circuit/library/data_preparation/{z_feature_map.py → _z_feature_map.py} +45 -34
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +342 -29
- qiskit/circuit/library/fourier_checking.py +72 -11
- qiskit/circuit/library/generalized_gates/__init__.py +1 -1
- qiskit/circuit/library/generalized_gates/diagonal.py +45 -51
- qiskit/circuit/library/generalized_gates/gms.py +67 -14
- qiskit/circuit/library/generalized_gates/gr.py +4 -4
- qiskit/circuit/library/generalized_gates/isometry.py +2 -2
- qiskit/circuit/library/generalized_gates/linear_function.py +12 -6
- qiskit/circuit/library/generalized_gates/mcmt.py +167 -107
- qiskit/circuit/library/generalized_gates/permutation.py +8 -6
- qiskit/circuit/library/generalized_gates/rv.py +8 -9
- qiskit/circuit/library/graph_state.py +93 -10
- qiskit/circuit/library/grover_operator.py +270 -2
- qiskit/circuit/library/hidden_linear_function.py +83 -20
- qiskit/circuit/library/iqp.py +99 -20
- qiskit/circuit/library/n_local/__init__.py +19 -7
- qiskit/circuit/library/n_local/efficient_su2.py +118 -5
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +259 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +130 -6
- qiskit/circuit/library/n_local/n_local.py +406 -5
- qiskit/circuit/library/n_local/pauli_two_design.py +106 -4
- qiskit/circuit/library/n_local/qaoa_ansatz.py +80 -1
- qiskit/circuit/library/n_local/real_amplitudes.py +127 -7
- qiskit/circuit/library/n_local/two_local.py +14 -7
- qiskit/circuit/library/overlap.py +91 -26
- qiskit/circuit/library/pauli_evolution.py +17 -15
- qiskit/circuit/library/phase_estimation.py +80 -4
- qiskit/circuit/library/quantum_volume.py +72 -20
- qiskit/circuit/library/standard_gates/__init__.py +20 -1
- qiskit/circuit/library/standard_gates/dcx.py +2 -1
- qiskit/circuit/library/standard_gates/ecr.py +2 -2
- qiskit/circuit/library/standard_gates/h.py +4 -3
- qiskit/circuit/library/standard_gates/i.py +2 -1
- qiskit/circuit/library/standard_gates/iswap.py +2 -2
- qiskit/circuit/library/standard_gates/p.py +20 -12
- qiskit/circuit/library/standard_gates/r.py +1 -1
- qiskit/circuit/library/standard_gates/rx.py +4 -3
- qiskit/circuit/library/standard_gates/rxx.py +2 -2
- qiskit/circuit/library/standard_gates/ry.py +4 -3
- qiskit/circuit/library/standard_gates/ryy.py +2 -2
- qiskit/circuit/library/standard_gates/rz.py +13 -12
- qiskit/circuit/library/standard_gates/rzx.py +6 -6
- qiskit/circuit/library/standard_gates/rzz.py +1 -1
- qiskit/circuit/library/standard_gates/s.py +4 -4
- qiskit/circuit/library/standard_gates/swap.py +3 -3
- qiskit/circuit/library/standard_gates/sx.py +4 -3
- qiskit/circuit/library/standard_gates/t.py +2 -2
- qiskit/circuit/library/standard_gates/u.py +11 -3
- qiskit/circuit/library/standard_gates/u1.py +65 -15
- qiskit/circuit/library/standard_gates/u2.py +4 -1
- qiskit/circuit/library/standard_gates/u3.py +31 -3
- qiskit/circuit/library/standard_gates/x.py +7 -5
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -2
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -2
- qiskit/circuit/library/standard_gates/y.py +4 -3
- qiskit/circuit/library/standard_gates/z.py +3 -3
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +9 -7
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +10 -9
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +9 -7
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +10 -8
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +16 -14
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +14 -12
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +14 -12
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +12 -10
- qiskit/circuit/library/templates/rzx/rzx_cy.py +11 -10
- qiskit/circuit/library/templates/rzx/rzx_xz.py +16 -15
- qiskit/circuit/library/templates/rzx/rzx_yz.py +12 -10
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +22 -20
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +16 -15
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +17 -15
- qiskit/circuit/parameter.py +4 -0
- qiskit/circuit/parameterexpression.py +167 -34
- qiskit/circuit/quantumcircuit.py +162 -126
- qiskit/circuit/singleton.py +2 -0
- qiskit/circuit/store.py +2 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/assembler.py +17 -4
- qiskit/compiler/scheduler.py +2 -0
- qiskit/compiler/sequencer.py +2 -0
- qiskit/compiler/transpiler.py +81 -26
- qiskit/converters/circuit_to_dag.py +2 -2
- qiskit/converters/circuit_to_dagdependency.py +1 -1
- qiskit/converters/circuit_to_dagdependency_v2.py +1 -1
- qiskit/converters/circuit_to_instruction.py +1 -1
- qiskit/converters/dag_to_circuit.py +7 -5
- qiskit/converters/dag_to_dagdependency.py +1 -1
- qiskit/converters/dag_to_dagdependency_v2.py +1 -1
- qiskit/converters/dagdependency_to_circuit.py +5 -1
- qiskit/converters/dagdependency_to_dag.py +6 -1
- qiskit/dagcircuit/collect_blocks.py +3 -3
- qiskit/dagcircuit/dagdependency.py +18 -5
- qiskit/dagcircuit/dagdependency_v2.py +1 -1
- qiskit/dagcircuit/dagnode.py +2 -2
- qiskit/passmanager/__init__.py +2 -2
- qiskit/primitives/backend_estimator.py +5 -2
- qiskit/primitives/backend_sampler_v2.py +61 -18
- qiskit/primitives/base/base_estimator.py +2 -2
- qiskit/primitives/containers/data_bin.py +9 -1
- qiskit/primitives/statevector_sampler.py +1 -1
- qiskit/primitives/utils.py +1 -1
- qiskit/providers/__init__.py +3 -3
- qiskit/providers/backend.py +12 -1
- qiskit/providers/backend_compat.py +23 -3
- qiskit/providers/basic_provider/basic_simulator.py +12 -2
- qiskit/providers/fake_provider/fake_pulse_backend.py +6 -1
- qiskit/providers/fake_provider/generic_backend_v2.py +46 -30
- qiskit/providers/models/pulsedefaults.py +2 -0
- qiskit/pulse/builder.py +59 -18
- qiskit/pulse/calibration_entries.py +4 -1
- qiskit/pulse/channels.py +2 -0
- qiskit/pulse/exceptions.py +2 -0
- qiskit/pulse/instruction_schedule_map.py +21 -6
- qiskit/pulse/instructions/acquire.py +2 -0
- qiskit/pulse/instructions/delay.py +2 -0
- qiskit/pulse/instructions/directives.py +8 -0
- qiskit/pulse/instructions/frequency.py +3 -0
- qiskit/pulse/instructions/instruction.py +2 -0
- qiskit/pulse/instructions/phase.py +3 -0
- qiskit/pulse/instructions/play.py +2 -0
- qiskit/pulse/instructions/reference.py +2 -0
- qiskit/pulse/instructions/snapshot.py +2 -0
- qiskit/pulse/library/pulse.py +2 -0
- qiskit/pulse/library/symbolic_pulses.py +28 -0
- qiskit/pulse/library/waveform.py +2 -0
- qiskit/pulse/macros.py +1 -1
- qiskit/pulse/schedule.py +12 -13
- qiskit/pulse/transforms/alignments.py +5 -3
- qiskit/pulse/transforms/dag.py +7 -0
- qiskit/qasm2/export.py +5 -3
- qiskit/qasm2/parse.py +46 -2
- qiskit/qasm3/__init__.py +1 -0
- qiskit/qasm3/ast.py +123 -15
- qiskit/qasm3/exporter.py +103 -77
- qiskit/qobj/converters/pulse_instruction.py +6 -4
- qiskit/qpy/__init__.py +181 -0
- qiskit/qpy/binary_io/circuits.py +20 -5
- qiskit/qpy/binary_io/schedules.py +3 -4
- qiskit/qpy/binary_io/value.py +310 -13
- qiskit/qpy/common.py +46 -2
- qiskit/qpy/formats.py +7 -0
- qiskit/qpy/interface.py +40 -4
- qiskit/quantum_info/__init__.py +4 -0
- qiskit/quantum_info/operators/channel/transformations.py +28 -21
- qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
- qiskit/quantum_info/operators/operator.py +54 -8
- qiskit/quantum_info/operators/symplectic/base_pauli.py +11 -19
- qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +1 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +2 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +23 -2
- qiskit/quantum_info/states/densitymatrix.py +5 -5
- qiskit/quantum_info/states/stabilizerstate.py +1 -1
- qiskit/quantum_info/states/statevector.py +6 -6
- qiskit/result/mitigation/base_readout_mitigator.py +1 -1
- qiskit/result/mitigation/correlated_readout_mitigator.py +9 -1
- qiskit/result/mitigation/local_readout_mitigator.py +9 -1
- qiskit/result/mitigation/utils.py +57 -0
- qiskit/scheduler/config.py +2 -0
- qiskit/scheduler/methods/basic.py +3 -0
- qiskit/scheduler/schedule_circuit.py +2 -0
- qiskit/scheduler/sequence.py +2 -0
- qiskit/synthesis/__init__.py +25 -0
- qiskit/synthesis/arithmetic/__init__.py +16 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +1 -2
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +3 -2
- qiskit/synthesis/clifford/clifford_decompose_layers.py +2 -1
- qiskit/synthesis/evolution/__init__.py +1 -0
- qiskit/synthesis/evolution/lie_trotter.py +16 -42
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +165 -238
- qiskit/synthesis/evolution/qdrift.py +36 -29
- qiskit/synthesis/evolution/suzuki_trotter.py +87 -27
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/qft/qft_decompose_full.py +19 -1
- qiskit/synthesis/qft/qft_decompose_lnn.py +2 -1
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -1
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +4 -63
- qiskit/synthesis/unitary/qsd.py +5 -5
- qiskit/transpiler/__init__.py +21 -14
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/passes/__init__.py +2 -0
- qiskit/transpiler/passes/basis/basis_translator.py +9 -565
- qiskit/transpiler/passes/basis/decompose.py +45 -12
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
- qiskit/transpiler/passes/calibration/pulse_gate.py +4 -2
- qiskit/transpiler/passes/calibration/rx_builder.py +11 -7
- qiskit/transpiler/passes/calibration/rzx_builder.py +46 -30
- qiskit/transpiler/passes/layout/disjoint_utils.py +15 -13
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -2
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +5 -0
- qiskit/transpiler/passes/optimization/__init__.py +1 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +19 -3
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +48 -131
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +4 -2
- qiskit/transpiler/passes/optimization/elide_permutations.py +9 -32
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +5 -11
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +7 -3
- qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
- qiskit/transpiler/passes/scheduling/alap.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
- qiskit/transpiler/passes/scheduling/asap.py +1 -1
- qiskit/transpiler/passes/scheduling/base_scheduler.py +14 -12
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +9 -4
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +16 -5
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +4 -1
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +6 -2
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +9 -4
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +262 -99
- qiskit/transpiler/passes/synthesis/hls_plugins.py +637 -7
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +55 -34
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +2 -56
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +5 -0
- qiskit/transpiler/passes/utils/gate_direction.py +12 -275
- qiskit/transpiler/passes/utils/gates_basis.py +7 -30
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +2 -1
- qiskit/transpiler/passmanager_config.py +22 -4
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +40 -14
- qiskit/transpiler/preset_passmanagers/common.py +5 -3
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +125 -42
- qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
- qiskit/transpiler/target.py +74 -16
- qiskit/utils/deprecate_pulse.py +119 -0
- qiskit/visualization/circuit/_utils.py +2 -2
- qiskit/visualization/circuit/circuit_visualization.py +3 -2
- qiskit/visualization/circuit/matplotlib.py +1 -1
- qiskit/visualization/dag_visualization.py +1 -1
- qiskit/visualization/pass_manager_visualization.py +3 -14
- qiskit/visualization/pulse_v2/interface.py +3 -1
- qiskit/visualization/timeline/core.py +25 -2
- qiskit/visualization/timeline/interface.py +12 -0
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/METADATA +9 -8
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/RECORD +357 -346
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/WHEEL +1 -1
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/entry_points.txt +19 -0
- qiskit/circuit/library/data_preparation/zz_feature_map.py +0 -118
- qiskit/synthesis/two_qubit/weyl.py +0 -97
- qiskit/transpiler/passes/synthesis/qubit_tracker.py +0 -132
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/top_level.txt +0 -0
@@ -12,13 +12,14 @@
|
|
12
12
|
|
13
13
|
"""Fourier checking circuit."""
|
14
14
|
|
15
|
-
from
|
16
|
-
|
15
|
+
from collections.abc import Sequence
|
17
16
|
import math
|
17
|
+
|
18
18
|
from qiskit.circuit import QuantumCircuit
|
19
19
|
from qiskit.circuit.exceptions import CircuitError
|
20
|
+
from qiskit.utils.deprecation import deprecate_func
|
20
21
|
|
21
|
-
from .generalized_gates.diagonal import Diagonal
|
22
|
+
from .generalized_gates.diagonal import Diagonal, DiagonalGate
|
22
23
|
|
23
24
|
|
24
25
|
class FourierChecking(QuantumCircuit):
|
@@ -52,7 +53,12 @@ class FourierChecking(QuantumCircuit):
|
|
52
53
|
`arXiv:1411.5729 <https://arxiv.org/abs/1411.5729>`_
|
53
54
|
"""
|
54
55
|
|
55
|
-
|
56
|
+
@deprecate_func(
|
57
|
+
since="1.3",
|
58
|
+
additional_msg="Use qiskit.circuit.library.fourier_checking instead.",
|
59
|
+
pending=True,
|
60
|
+
)
|
61
|
+
def __init__(self, f: Sequence[int], g: Sequence[int]) -> None:
|
56
62
|
"""Create Fourier checking circuit.
|
57
63
|
|
58
64
|
Args:
|
@@ -81,17 +87,72 @@ class FourierChecking(QuantumCircuit):
|
|
81
87
|
"{1, -1}."
|
82
88
|
)
|
83
89
|
|
84
|
-
circuit
|
85
|
-
|
90
|
+
# This definition circuit is not replaced by the circuit produced by fourier_checking,
|
91
|
+
# as the latter produces a slightly different circuit, with DiagonalGates instead
|
92
|
+
# of Diagonal circuits.
|
93
|
+
circuit = QuantumCircuit(int(num_qubits), name=f"fc: {f}, {g}")
|
86
94
|
circuit.h(circuit.qubits)
|
87
|
-
|
88
95
|
circuit.compose(Diagonal(f), inplace=True)
|
89
|
-
|
90
96
|
circuit.h(circuit.qubits)
|
91
|
-
|
92
97
|
circuit.compose(Diagonal(g), inplace=True)
|
93
|
-
|
94
98
|
circuit.h(circuit.qubits)
|
95
|
-
|
96
99
|
super().__init__(*circuit.qregs, name=circuit.name)
|
97
100
|
self.compose(circuit.to_gate(), qubits=self.qubits, inplace=True)
|
101
|
+
|
102
|
+
|
103
|
+
def fourier_checking(f: Sequence[int], g: Sequence[int]) -> QuantumCircuit:
|
104
|
+
"""Fourier checking circuit.
|
105
|
+
|
106
|
+
The circuit for the Fourier checking algorithm, introduced in [1],
|
107
|
+
involves a layer of Hadamards, the function :math:`f`, another layer of
|
108
|
+
Hadamards, the function :math:`g`, followed by a final layer of Hadamards.
|
109
|
+
The functions :math:`f` and :math:`g` are classical functions realized
|
110
|
+
as phase oracles (diagonal operators with {-1, 1} on the diagonal).
|
111
|
+
|
112
|
+
The probability of observing the all-zeros string is :math:`p(f,g)`.
|
113
|
+
The algorithm solves the promise Fourier checking problem,
|
114
|
+
which decides if f is correlated with the Fourier transform
|
115
|
+
of g, by testing if :math:`p(f,g) <= 0.01` or :math:`p(f,g) >= 0.05`,
|
116
|
+
promised that one or the other of these is true.
|
117
|
+
|
118
|
+
The functions :math:`f` and :math:`g` are currently implemented
|
119
|
+
from their truth tables but could be represented concisely and
|
120
|
+
implemented efficiently for special classes of functions.
|
121
|
+
|
122
|
+
Fourier checking is a special case of :math:`k`-fold forrelation [2].
|
123
|
+
|
124
|
+
**Reference Circuit:**
|
125
|
+
|
126
|
+
.. plot::
|
127
|
+
:include-source:
|
128
|
+
|
129
|
+
from qiskit.circuit.library import fourier_checking
|
130
|
+
circuit = fourier_checking([1, -1, -1, -1], [1, 1, -1, -1])
|
131
|
+
circuit.draw('mpl')
|
132
|
+
|
133
|
+
**Reference:**
|
134
|
+
|
135
|
+
[1] S. Aaronson, BQP and the Polynomial Hierarchy, 2009 (Section 3.2).
|
136
|
+
`arXiv:0910.4698 <https://arxiv.org/abs/0910.4698>`_
|
137
|
+
|
138
|
+
[2] S. Aaronson, A. Ambainis, Forrelation: a problem that
|
139
|
+
optimally separates quantum from classical computing, 2014.
|
140
|
+
`arXiv:1411.5729 <https://arxiv.org/abs/1411.5729>`_
|
141
|
+
"""
|
142
|
+
num_qubits = math.log2(len(f))
|
143
|
+
|
144
|
+
if len(f) != len(g) or num_qubits == 0 or not num_qubits.is_integer():
|
145
|
+
raise CircuitError(
|
146
|
+
"The functions f and g must be given as truth "
|
147
|
+
"tables, each as a list of 2**n entries of "
|
148
|
+
"{1, -1}."
|
149
|
+
)
|
150
|
+
num_qubits = int(num_qubits)
|
151
|
+
|
152
|
+
circuit = QuantumCircuit(num_qubits, name=f"fc: {f}, {g}")
|
153
|
+
circuit.h(circuit.qubits)
|
154
|
+
circuit.append(DiagonalGate(f), range(num_qubits))
|
155
|
+
circuit.h(circuit.qubits)
|
156
|
+
circuit.append(DiagonalGate(g), range(num_qubits))
|
157
|
+
circuit.h(circuit.qubits)
|
158
|
+
return circuit
|
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
from .diagonal import Diagonal, DiagonalGate
|
16
16
|
from .permutation import Permutation, PermutationGate
|
17
|
-
from .mcmt import MCMT, MCMTVChain
|
17
|
+
from .mcmt import MCMT, MCMTVChain, MCMTGate
|
18
18
|
from .gms import GMS, MSGate
|
19
19
|
from .gr import GR, GRX, GRY, GRZ
|
20
20
|
from .pauli import PauliGate
|
@@ -23,6 +23,8 @@ import numpy as np
|
|
23
23
|
from qiskit.circuit.gate import Gate
|
24
24
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
25
25
|
from qiskit.circuit.exceptions import CircuitError
|
26
|
+
from qiskit.circuit.annotated_operation import AnnotatedOperation, InverseModifier
|
27
|
+
from qiskit.utils.deprecation import deprecate_func
|
26
28
|
|
27
29
|
from .ucrz import UCRZGate
|
28
30
|
|
@@ -30,19 +32,28 @@ _EPS = 1e-10
|
|
30
32
|
|
31
33
|
|
32
34
|
class Diagonal(QuantumCircuit):
|
33
|
-
|
35
|
+
"""Circuit implementing a diagonal transformation."""
|
34
36
|
|
35
|
-
|
37
|
+
@deprecate_func(since="1.3", additional_msg="Use DiagonalGate instead.", pending=True)
|
38
|
+
def __init__(self, diag: Sequence[complex]) -> None:
|
39
|
+
r"""
|
40
|
+
Args:
|
41
|
+
diag: List of the :math:`2^k` diagonal entries (for a diagonal gate on :math:`k` qubits).
|
42
|
+
|
43
|
+
Raises:
|
44
|
+
CircuitError: if the list of the diagonal entries or the qubit list is in bad format;
|
45
|
+
if the number of diagonal entries is not :math:`2^k`, where :math:`k` denotes the
|
46
|
+
number of qubits.
|
47
|
+
"""
|
48
|
+
DiagonalGate._check_input(diag)
|
49
|
+
num_qubits = int(math.log2(len(diag)))
|
50
|
+
|
51
|
+
super().__init__(num_qubits, name="Diagonal")
|
52
|
+
self.append(DiagonalGate(diag), self.qubits)
|
36
53
|
|
37
|
-
.. parsed-literal::
|
38
54
|
|
39
|
-
|
40
|
-
|
41
|
-
│ │
|
42
|
-
q_1: ┤1 Diagonal ├
|
43
|
-
│ │
|
44
|
-
q_2: ┤2 ├
|
45
|
-
└───────────┘
|
55
|
+
class DiagonalGate(Gate):
|
56
|
+
r"""A generic diagonal quantum gate.
|
46
57
|
|
47
58
|
Matrix form:
|
48
59
|
|
@@ -80,30 +91,28 @@ class Diagonal(QuantumCircuit):
|
|
80
91
|
def __init__(self, diag: Sequence[complex]) -> None:
|
81
92
|
r"""
|
82
93
|
Args:
|
83
|
-
diag:
|
84
|
-
|
85
|
-
Raises:
|
86
|
-
CircuitError: if the list of the diagonal entries or the qubit list is in bad format;
|
87
|
-
if the number of diagonal entries is not :math:`2^k`, where :math:`k` denotes the
|
88
|
-
number of qubits.
|
94
|
+
diag: list of the :math:`2^k` diagonal entries (for a diagonal gate on :math:`k` qubits).
|
89
95
|
"""
|
90
96
|
self._check_input(diag)
|
91
97
|
num_qubits = int(math.log2(len(diag)))
|
92
98
|
|
93
|
-
|
99
|
+
super().__init__("diagonal", num_qubits, diag)
|
94
100
|
|
101
|
+
def _define(self):
|
95
102
|
# Since the diagonal is a unitary, all its entries have absolute value
|
96
103
|
# one and the diagonal is fully specified by the phases of its entries.
|
97
|
-
diag_phases = [cmath.phase(z) for z in
|
98
|
-
n = len(
|
104
|
+
diag_phases = [cmath.phase(z) for z in self.params]
|
105
|
+
n = len(diag_phases)
|
106
|
+
circuit = QuantumCircuit(self.num_qubits)
|
107
|
+
|
99
108
|
while n >= 2:
|
100
109
|
angles_rz = []
|
101
110
|
for i in range(0, n, 2):
|
102
111
|
diag_phases[i // 2], rz_angle = _extract_rz(diag_phases[i], diag_phases[i + 1])
|
103
112
|
angles_rz.append(rz_angle)
|
104
113
|
num_act_qubits = int(math.log2(n))
|
105
|
-
ctrl_qubits = list(range(num_qubits - num_act_qubits + 1, num_qubits))
|
106
|
-
target_qubit = num_qubits - num_act_qubits
|
114
|
+
ctrl_qubits = list(range(self.num_qubits - num_act_qubits + 1, self.num_qubits))
|
115
|
+
target_qubit = self.num_qubits - num_act_qubits
|
107
116
|
|
108
117
|
ucrz = UCRZGate(angles_rz)
|
109
118
|
circuit.append(ucrz, [target_qubit] + ctrl_qubits)
|
@@ -111,36 +120,7 @@ class Diagonal(QuantumCircuit):
|
|
111
120
|
n //= 2
|
112
121
|
circuit.global_phase += diag_phases[0]
|
113
122
|
|
114
|
-
|
115
|
-
self.append(circuit.to_gate(), self.qubits)
|
116
|
-
|
117
|
-
@staticmethod
|
118
|
-
def _check_input(diag):
|
119
|
-
"""Check if ``diag`` is in valid format."""
|
120
|
-
if not isinstance(diag, (list, np.ndarray)):
|
121
|
-
raise CircuitError("Diagonal entries must be in a list or numpy array.")
|
122
|
-
num_qubits = math.log2(len(diag))
|
123
|
-
if num_qubits < 1 or not num_qubits.is_integer():
|
124
|
-
raise CircuitError("The number of diagonal entries is not a positive power of 2.")
|
125
|
-
if not np.allclose(np.abs(diag), 1, atol=_EPS):
|
126
|
-
raise CircuitError("A diagonal element does not have absolute value one.")
|
127
|
-
|
128
|
-
|
129
|
-
class DiagonalGate(Gate):
|
130
|
-
"""Gate implementing a diagonal transformation."""
|
131
|
-
|
132
|
-
def __init__(self, diag: Sequence[complex]) -> None:
|
133
|
-
r"""
|
134
|
-
Args:
|
135
|
-
diag: list of the :math:`2^k` diagonal entries (for a diagonal gate on :math:`k` qubits).
|
136
|
-
"""
|
137
|
-
Diagonal._check_input(diag)
|
138
|
-
num_qubits = int(math.log2(len(diag)))
|
139
|
-
|
140
|
-
super().__init__("diagonal", num_qubits, diag)
|
141
|
-
|
142
|
-
def _define(self):
|
143
|
-
self.definition = Diagonal(self.params).decompose()
|
123
|
+
self.definition = circuit
|
144
124
|
|
145
125
|
def validate_parameter(self, parameter):
|
146
126
|
"""Diagonal Gate parameter should accept complex
|
@@ -152,8 +132,22 @@ class DiagonalGate(Gate):
|
|
152
132
|
|
153
133
|
def inverse(self, annotated: bool = False):
|
154
134
|
"""Return the inverse of the diagonal gate."""
|
135
|
+
if annotated:
|
136
|
+
return AnnotatedOperation(self.copy(), InverseModifier)
|
137
|
+
|
155
138
|
return DiagonalGate([np.conj(entry) for entry in self.params])
|
156
139
|
|
140
|
+
@staticmethod
|
141
|
+
def _check_input(diag):
|
142
|
+
"""Check if ``diag`` is in valid format."""
|
143
|
+
if not isinstance(diag, (list, np.ndarray)):
|
144
|
+
raise CircuitError("Diagonal entries must be in a list or numpy array.")
|
145
|
+
num_qubits = math.log2(len(diag))
|
146
|
+
if num_qubits < 1 or not num_qubits.is_integer():
|
147
|
+
raise CircuitError("The number of diagonal entries is not a positive power of 2.")
|
148
|
+
if not np.allclose(np.abs(diag), 1, atol=_EPS):
|
149
|
+
raise CircuitError("A diagonal element does not have absolute value one.")
|
150
|
+
|
157
151
|
|
158
152
|
def _extract_rz(phi1, phi2):
|
159
153
|
"""
|
@@ -15,13 +15,16 @@
|
|
15
15
|
Global Mølmer–Sørensen gate.
|
16
16
|
"""
|
17
17
|
|
18
|
-
from
|
18
|
+
from __future__ import annotations
|
19
|
+
from collections.abc import Sequence
|
19
20
|
|
20
21
|
import numpy as np
|
21
22
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
22
23
|
from qiskit.circuit.quantumregister import QuantumRegister
|
24
|
+
from qiskit.circuit.parameterexpression import ParameterValueType
|
23
25
|
from qiskit.circuit.library.standard_gates import RXXGate
|
24
26
|
from qiskit.circuit.gate import Gate
|
27
|
+
from qiskit.utils.deprecation import deprecate_func
|
25
28
|
|
26
29
|
|
27
30
|
class GMS(QuantumCircuit):
|
@@ -29,7 +32,7 @@ class GMS(QuantumCircuit):
|
|
29
32
|
|
30
33
|
**Circuit symbol:**
|
31
34
|
|
32
|
-
..
|
35
|
+
.. code-block:: text
|
33
36
|
|
34
37
|
┌───────────┐
|
35
38
|
q_0: ┤0 ├
|
@@ -74,7 +77,8 @@ class GMS(QuantumCircuit):
|
|
74
77
|
`arXiv:1707.06356 <https://arxiv.org/abs/1707.06356>`_
|
75
78
|
"""
|
76
79
|
|
77
|
-
|
80
|
+
@deprecate_func(since="1.3", additional_msg="Use the MSGate instead.", pending=True)
|
81
|
+
def __init__(self, num_qubits: int, theta: list[list[float]] | np.ndarray) -> None:
|
78
82
|
"""Create a new Global Mølmer–Sørensen (GMS) gate.
|
79
83
|
|
80
84
|
Args:
|
@@ -94,28 +98,77 @@ class GMS(QuantumCircuit):
|
|
94
98
|
|
95
99
|
|
96
100
|
class MSGate(Gate):
|
97
|
-
"""
|
98
|
-
Please use ``GMS`` in ``qiskit.circuit.generalized_gates`` instead.
|
101
|
+
r"""The Mølmer–Sørensen gate.
|
99
102
|
|
100
|
-
|
103
|
+
The Mølmer–Sørensen gate is native to ion-trap systems. The global MS
|
104
|
+
can be applied to multiple ions to entangle multiple qubits simultaneously [1].
|
101
105
|
|
102
|
-
|
103
|
-
|
106
|
+
In the two-qubit case, this is equivalent to an XX interaction,
|
107
|
+
and is thus reduced to the :class:`.RXXGate`. The global MS gate is a sum of XX
|
108
|
+
interactions on all pairs [2].
|
104
109
|
|
105
|
-
|
106
|
-
|
110
|
+
.. math::
|
111
|
+
|
112
|
+
MS(\chi_{12}, \chi_{13}, ..., \chi_{n-1 n}) =
|
113
|
+
exp(-i \sum_{i=1}^{n} \sum_{j=i+1}^{n} X{\otimes}X \frac{\chi_{ij}}{2})
|
114
|
+
|
115
|
+
Example::
|
116
|
+
|
117
|
+
import numpy as np
|
118
|
+
from qiskit.circuit.library import MSGate
|
119
|
+
from qiskit.quantum_info import Operator
|
120
|
+
|
121
|
+
gate = MSGate(num_qubits=3, theta=[[0, np.pi/4, np.pi/8],
|
122
|
+
[0, 0, np.pi/2],
|
123
|
+
[0, 0, 0]])
|
124
|
+
print(Operator(gate))
|
125
|
+
|
126
|
+
|
127
|
+
**References:**
|
128
|
+
|
129
|
+
[1] Sørensen, A. and Mølmer, K., Multi-particle entanglement of hot trapped ions.
|
130
|
+
Physical Review Letters. 82 (9): 1835–1838.
|
131
|
+
`arXiv:9810040 <https://arxiv.org/abs/quant-ph/9810040>`_
|
132
|
+
|
133
|
+
[2] Maslov, D. and Nam, Y., Use of global interactions in efficient quantum circuit
|
134
|
+
constructions. New Journal of Physics, 20(3), p.033018.
|
135
|
+
`arXiv:1707.06356 <https://arxiv.org/abs/1707.06356>`_
|
107
136
|
"""
|
108
137
|
|
109
|
-
def __init__(
|
110
|
-
|
138
|
+
def __init__(
|
139
|
+
self,
|
140
|
+
num_qubits: int,
|
141
|
+
theta: ParameterValueType | Sequence[Sequence[ParameterValueType]],
|
142
|
+
label: str | None = None,
|
143
|
+
):
|
144
|
+
"""
|
145
|
+
Args:
|
146
|
+
num_qubits: The number of qubits the MS gate acts on.
|
147
|
+
theta: The XX rotation angles. If a single value, the same angle is used on all
|
148
|
+
interactions. Alternatively an upper-triangular, square matrix with width
|
149
|
+
``num_qubits`` can be provided with interaction angles for each qubit pair.
|
150
|
+
label: A gate label.
|
151
|
+
"""
|
111
152
|
super().__init__("ms", num_qubits, [theta], label=label)
|
112
153
|
|
113
154
|
def _define(self):
|
114
|
-
|
115
|
-
q = QuantumRegister(self.num_qubits, "q")
|
155
|
+
thetas = self.params[0]
|
156
|
+
q = QuantumRegister(self.num_qubits, name="q")
|
116
157
|
qc = QuantumCircuit(q, name=self.name)
|
117
158
|
for i in range(self.num_qubits):
|
118
159
|
for j in range(i + 1, self.num_qubits):
|
160
|
+
# if theta is just a single angle, use that, otherwise use the correct index
|
161
|
+
theta = thetas if not isinstance(thetas, Sequence) else thetas[i][j]
|
119
162
|
qc._append(RXXGate(theta), [q[i], q[j]], [])
|
120
163
|
|
121
164
|
self.definition = qc
|
165
|
+
|
166
|
+
def validate_parameter(self, parameter):
|
167
|
+
if isinstance(parameter, Sequence):
|
168
|
+
# pylint: disable=super-with-arguments
|
169
|
+
return [
|
170
|
+
[super(MSGate, self).validate_parameter(theta) for theta in row]
|
171
|
+
for row in parameter
|
172
|
+
]
|
173
|
+
|
174
|
+
return super().validate_parameter(parameter)
|
@@ -21,7 +21,7 @@ class GR(QuantumCircuit):
|
|
21
21
|
|
22
22
|
**Circuit symbol:**
|
23
23
|
|
24
|
-
..
|
24
|
+
.. code-block:: text
|
25
25
|
|
26
26
|
┌──────────┐
|
27
27
|
q_0: ┤0 ├
|
@@ -75,7 +75,7 @@ class GRX(GR):
|
|
75
75
|
|
76
76
|
**Circuit symbol:**
|
77
77
|
|
78
|
-
..
|
78
|
+
.. code-block:: text
|
79
79
|
|
80
80
|
┌──────────┐
|
81
81
|
q_0: ┤0 ├
|
@@ -123,7 +123,7 @@ class GRY(GR):
|
|
123
123
|
|
124
124
|
**Circuit symbol:**
|
125
125
|
|
126
|
-
..
|
126
|
+
.. code-block:: text
|
127
127
|
|
128
128
|
┌──────────┐
|
129
129
|
q_0: ┤0 ├
|
@@ -171,7 +171,7 @@ class GRZ(QuantumCircuit):
|
|
171
171
|
|
172
172
|
**Circuit symbol:**
|
173
173
|
|
174
|
-
..
|
174
|
+
.. code-block:: text
|
175
175
|
|
176
176
|
┌──────────┐
|
177
177
|
q_0: ┤0 ├
|
@@ -31,7 +31,7 @@ from qiskit.exceptions import QiskitError
|
|
31
31
|
from qiskit.quantum_info.operators.predicates import is_isometry
|
32
32
|
from qiskit._accelerate import isometry as isometry_rs
|
33
33
|
|
34
|
-
from .diagonal import
|
34
|
+
from .diagonal import DiagonalGate
|
35
35
|
from .uc import UCGate
|
36
36
|
from .mcg_up_to_diagonal import MCGupDiag
|
37
37
|
|
@@ -167,7 +167,7 @@ class Isometry(Instruction):
|
|
167
167
|
if len(diag) > 1 and not isometry_rs.diag_is_identity_up_to_global_phase(
|
168
168
|
diag, self._epsilon
|
169
169
|
):
|
170
|
-
diagonal =
|
170
|
+
diagonal = DiagonalGate(np.conj(diag))
|
171
171
|
circuit.append(diagonal, q_input)
|
172
172
|
return circuit
|
173
173
|
|
@@ -17,6 +17,7 @@ import numpy as np
|
|
17
17
|
from qiskit.circuit.quantumcircuit import QuantumCircuit, Gate
|
18
18
|
from qiskit.circuit.exceptions import CircuitError
|
19
19
|
from qiskit.circuit.library.generalized_gates.permutation import PermutationGate
|
20
|
+
from qiskit.utils.deprecation import deprecate_func
|
20
21
|
|
21
22
|
# pylint: disable=cyclic-import
|
22
23
|
from qiskit.quantum_info import Clifford
|
@@ -37,7 +38,7 @@ class LinearFunction(Gate):
|
|
37
38
|
|
38
39
|
**Example:** the circuit
|
39
40
|
|
40
|
-
..
|
41
|
+
.. code-block:: text
|
41
42
|
|
42
43
|
q_0: ──■──
|
43
44
|
┌─┴─┐
|
@@ -67,7 +68,7 @@ class LinearFunction(Gate):
|
|
67
68
|
def __init__(
|
68
69
|
self,
|
69
70
|
linear: (
|
70
|
-
list[list]
|
71
|
+
list[list[bool]]
|
71
72
|
| np.ndarray[bool]
|
72
73
|
| QuantumCircuit
|
73
74
|
| LinearFunction
|
@@ -221,17 +222,22 @@ class LinearFunction(Gate):
|
|
221
222
|
|
222
223
|
def _define(self):
|
223
224
|
"""Populates self.definition with a decomposition of this gate."""
|
224
|
-
|
225
|
+
from qiskit.synthesis.linear import synth_cnot_count_full_pmh
|
226
|
+
|
227
|
+
self.definition = synth_cnot_count_full_pmh(self.linear)
|
225
228
|
|
229
|
+
@deprecate_func(
|
230
|
+
since="1.3",
|
231
|
+
pending=True,
|
232
|
+
additional_msg="Call LinearFunction.definition instead, or compile the circuit.",
|
233
|
+
)
|
226
234
|
def synthesize(self):
|
227
235
|
"""Synthesizes the linear function into a quantum circuit.
|
228
236
|
|
229
237
|
Returns:
|
230
238
|
QuantumCircuit: A circuit implementing the evolution.
|
231
239
|
"""
|
232
|
-
|
233
|
-
|
234
|
-
return synth_cnot_count_full_pmh(self.linear)
|
240
|
+
return self.definition
|
235
241
|
|
236
242
|
@property
|
237
243
|
def linear(self):
|