qiskit 1.3.0b1__cp39-abi3-macosx_11_0_arm64.whl → 1.3.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 +20 -1
- qiskit/_accelerate.abi3.so +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 +83 -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 +153 -1
- 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/providers/__init__.py +1 -1
- 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 +5 -5
- 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 +40 -130
- 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 +257 -93
- 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 +124 -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.0rc1.dist-info}/METADATA +3 -2
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/RECORD +356 -345
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/WHEEL +1 -1
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.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.0rc1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/top_level.txt +0 -0
@@ -11,17 +11,316 @@
|
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
13
|
"""The Pauli expansion circuit module."""
|
14
|
-
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from collections.abc import Sequence, Mapping
|
18
|
+
from typing import Optional, Callable, List, Union, Dict, Tuple
|
15
19
|
from functools import reduce
|
16
20
|
import numpy as np
|
17
21
|
|
18
22
|
from qiskit.circuit import QuantumCircuit
|
19
|
-
from qiskit.circuit import Parameter, ParameterVector
|
23
|
+
from qiskit.circuit import Parameter, ParameterVector, ParameterExpression
|
20
24
|
from qiskit.circuit.library.standard_gates import HGate
|
25
|
+
from qiskit.utils.deprecation import deprecate_func
|
26
|
+
from qiskit._accelerate.circuit_library import pauli_feature_map as _fast_map
|
21
27
|
|
22
28
|
from ..n_local.n_local import NLocal
|
23
29
|
|
24
30
|
|
31
|
+
def _normalize_entanglement(
|
32
|
+
entanglement: str | Mapping[int, Sequence[Sequence[int]]]
|
33
|
+
) -> str | dict[int, list[tuple[int]]]:
|
34
|
+
if isinstance(entanglement, str):
|
35
|
+
return entanglement
|
36
|
+
|
37
|
+
return {
|
38
|
+
num_paulis: [tuple(connections) for connections in ent]
|
39
|
+
for num_paulis, ent in entanglement.items()
|
40
|
+
}
|
41
|
+
|
42
|
+
|
43
|
+
def pauli_feature_map(
|
44
|
+
feature_dimension: int,
|
45
|
+
reps: int = 2,
|
46
|
+
entanglement: (
|
47
|
+
str
|
48
|
+
| Mapping[int, Sequence[Sequence[int]]]
|
49
|
+
| Callable[[int], str | Mapping[int, Sequence[Sequence[int]]]]
|
50
|
+
) = "full",
|
51
|
+
alpha: float = 2.0,
|
52
|
+
paulis: list[str] | None = None,
|
53
|
+
data_map_func: Callable[[Parameter], ParameterExpression] | None = None,
|
54
|
+
parameter_prefix: str = "x",
|
55
|
+
insert_barriers: bool = False,
|
56
|
+
name: str = "PauliFeatureMap",
|
57
|
+
) -> QuantumCircuit:
|
58
|
+
r"""The Pauli expansion circuit.
|
59
|
+
|
60
|
+
The Pauli expansion circuit is a data encoding circuit that transforms input data
|
61
|
+
:math:`\vec{x} \in \mathbb{R}^n`, where :math:`n` is the ``feature_dimension``, as
|
62
|
+
|
63
|
+
.. math::
|
64
|
+
|
65
|
+
U_{\Phi(\vec{x})}=\exp\left(i\sum_{S \in \mathcal{I}}
|
66
|
+
\phi_S(\vec{x})\prod_{i\in S} P_i\right).
|
67
|
+
|
68
|
+
Here, :math:`S` is a set of qubit indices that describes the connections in the feature map,
|
69
|
+
:math:`\mathcal{I}` is a set containing all these index sets, and
|
70
|
+
:math:`P_i \in \{I, X, Y, Z\}`. Per default the data-mapping
|
71
|
+
:math:`\phi_S` is
|
72
|
+
|
73
|
+
.. math::
|
74
|
+
|
75
|
+
\phi_S(\vec{x}) = \begin{cases}
|
76
|
+
x_i \text{ if } S = \{i\} \\
|
77
|
+
\prod_{j \in S} (\pi - x_j) \text{ if } |S| > 1
|
78
|
+
\end{cases}.
|
79
|
+
|
80
|
+
The possible connections can be set using the ``entanglement`` and ``paulis`` arguments.
|
81
|
+
For example, for single-qubit :math:`Z` rotations and two-qubit :math:`YY` interactions
|
82
|
+
between all qubit pairs, we can set::
|
83
|
+
|
84
|
+
|
85
|
+
circuit = pauli_feature_map(..., paulis=["Z", "YY"], entanglement="full")
|
86
|
+
|
87
|
+
which will produce blocks of the form
|
88
|
+
|
89
|
+
.. code-block:: text
|
90
|
+
|
91
|
+
┌───┐┌─────────────┐┌──────────┐ ┌───────────┐
|
92
|
+
┤ H ├┤ P(2.0*x[0]) ├┤ RX(pi/2) ├──■──────────────────────────────────────■──┤ RX(-pi/2) ├
|
93
|
+
├───┤├─────────────┤├──────────┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐├───────────┤
|
94
|
+
┤ H ├┤ P(2.0*x[1]) ├┤ RX(pi/2) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ RX(-pi/2) ├
|
95
|
+
└───┘└─────────────┘└──────────┘└───┘└────────────────────────────────┘└───┘└───────────┘
|
96
|
+
|
97
|
+
The circuit contains ``reps`` repetitions of this transformation.
|
98
|
+
|
99
|
+
Please refer to :func:`.z_feature_map` for the case of single-qubit Pauli-:math:`Z` rotations
|
100
|
+
and to :func:`.zz_feature_map` for the single- and two-qubit Pauli-:math:`Z` rotations.
|
101
|
+
|
102
|
+
Examples:
|
103
|
+
|
104
|
+
>>> prep = pauli_feature_map(2, reps=1, paulis=["ZZ"])
|
105
|
+
>>> print(prep)
|
106
|
+
┌───┐
|
107
|
+
q_0: ┤ H ├──■──────────────────────────────────────■──
|
108
|
+
├───┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐
|
109
|
+
q_1: ┤ H ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
|
110
|
+
└───┘└───┘└────────────────────────────────┘└───┘
|
111
|
+
|
112
|
+
>>> prep = pauli_feature_map(2, reps=1, paulis=["Z", "XX"])
|
113
|
+
>>> print(prep)
|
114
|
+
┌───┐┌─────────────┐┌───┐ ┌───┐
|
115
|
+
q_0: ┤ H ├┤ P(2.0*x[0]) ├┤ H ├──■──────────────────────────────────────■──┤ H ├
|
116
|
+
├───┤├─────────────┤├───┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐├───┤
|
117
|
+
q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ H ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ H ├
|
118
|
+
└───┘└─────────────┘└───┘└───┘└────────────────────────────────┘└───┘└───┘
|
119
|
+
|
120
|
+
>>> prep = pauli_feature_map(2, reps=1, paulis=["ZY"])
|
121
|
+
>>> print(prep)
|
122
|
+
┌───┐┌──────────┐ ┌───────────┐
|
123
|
+
q_0: ┤ H ├┤ RX(pi/2) ├──■──────────────────────────────────────■──┤ RX(-pi/2) ├
|
124
|
+
├───┤└──────────┘┌─┴─┐┌────────────────────────────────┐┌─┴─┐└───────────┘
|
125
|
+
q_1: ┤ H ├────────────┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├─────────────
|
126
|
+
└───┘ └───┘└────────────────────────────────┘└───┘
|
127
|
+
|
128
|
+
>>> from qiskit.circuit.library import EfficientSU2
|
129
|
+
>>> prep = pauli_feature_map(3, reps=3, paulis=["Z", "YY", "ZXZ"])
|
130
|
+
>>> wavefunction = EfficientSU2(3)
|
131
|
+
>>> classifier = prep.compose(wavefunction)
|
132
|
+
>>> classifier.num_parameters
|
133
|
+
27
|
134
|
+
>>> classifier.count_ops()
|
135
|
+
OrderedDict([('cx', 39), ('rx', 36), ('u1', 21), ('h', 15), ('ry', 12), ('rz', 12)])
|
136
|
+
|
137
|
+
References:
|
138
|
+
|
139
|
+
[1] Havlicek et al. Supervised learning with quantum enhanced feature spaces,
|
140
|
+
`Nature 567, 209-212 (2019) <https://www.nature.com/articles/s41586-019-0980-2>`__.
|
141
|
+
"""
|
142
|
+
# create parameter vector used in the Pauli feature map
|
143
|
+
parameters = ParameterVector(parameter_prefix, feature_dimension)
|
144
|
+
|
145
|
+
# the Rust implementation expects the entanglement to be a str or list[tuple[int]] (or the
|
146
|
+
# callable to return these types), therefore we normalize the entanglement here
|
147
|
+
if callable(entanglement):
|
148
|
+
normalized = lambda offset: _normalize_entanglement(entanglement(offset))
|
149
|
+
else:
|
150
|
+
normalized = _normalize_entanglement(entanglement)
|
151
|
+
|
152
|
+
# construct from Rust
|
153
|
+
circuit = QuantumCircuit._from_circuit_data(
|
154
|
+
_fast_map(
|
155
|
+
feature_dimension,
|
156
|
+
paulis=paulis,
|
157
|
+
entanglement=normalized,
|
158
|
+
reps=reps,
|
159
|
+
parameters=parameters,
|
160
|
+
data_map_func=data_map_func,
|
161
|
+
alpha=alpha,
|
162
|
+
insert_barriers=insert_barriers,
|
163
|
+
),
|
164
|
+
name=name,
|
165
|
+
)
|
166
|
+
|
167
|
+
return circuit
|
168
|
+
|
169
|
+
|
170
|
+
def z_feature_map(
|
171
|
+
feature_dimension: int,
|
172
|
+
reps: int = 2,
|
173
|
+
entanglement: (
|
174
|
+
str | Sequence[Sequence[int]] | Callable[[int], str | Sequence[Sequence[int]]]
|
175
|
+
) = "full",
|
176
|
+
alpha: float = 2.0,
|
177
|
+
data_map_func: Callable[[Parameter], ParameterExpression] | None = None,
|
178
|
+
parameter_prefix: str = "x",
|
179
|
+
insert_barriers: bool = False,
|
180
|
+
name: str = "ZFeatureMap",
|
181
|
+
) -> QuantumCircuit:
|
182
|
+
"""The first order Pauli Z-evolution circuit.
|
183
|
+
|
184
|
+
On 3 qubits and with 2 repetitions the circuit is represented by:
|
185
|
+
|
186
|
+
.. code-block:: text
|
187
|
+
|
188
|
+
┌───┐┌─────────────┐┌───┐┌─────────────┐
|
189
|
+
┤ H ├┤ P(2.0*x[0]) ├┤ H ├┤ P(2.0*x[0]) ├
|
190
|
+
├───┤├─────────────┤├───┤├─────────────┤
|
191
|
+
┤ H ├┤ U(2.0*x[1]) ├┤ H ├┤ P(2.0*x[1]) ├
|
192
|
+
├───┤├─────────────┤├───┤├─────────────┤
|
193
|
+
┤ H ├┤ P(2.0*x[2]) ├┤ H ├┤ P(2.0*x[2]) ├
|
194
|
+
└───┘└─────────────┘└───┘└─────────────┘
|
195
|
+
|
196
|
+
This is a sub-class of :class:`~qiskit.circuit.library.PauliFeatureMap` where the Pauli
|
197
|
+
strings are fixed as `['Z']`. As a result the first order expansion will be a circuit without
|
198
|
+
entangling gates.
|
199
|
+
|
200
|
+
Examples:
|
201
|
+
|
202
|
+
>>> prep = z_feature_map(3, reps=3, insert_barriers=True)
|
203
|
+
>>> print(prep)
|
204
|
+
┌───┐ ░ ┌─────────────┐ ░ ┌───┐ ░ ┌─────────────┐ ░ ┌───┐ ░ ┌─────────────┐
|
205
|
+
q_0: ┤ H ├─░─┤ P(2.0*x[0]) ├─░─┤ H ├─░─┤ P(2.0*x[0]) ├─░─┤ H ├─░─┤ P(2.0*x[0]) ├
|
206
|
+
├───┤ ░ ├─────────────┤ ░ ├───┤ ░ ├─────────────┤ ░ ├───┤ ░ ├─────────────┤
|
207
|
+
q_1: ┤ H ├─░─┤ P(2.0*x[1]) ├─░─┤ H ├─░─┤ P(2.0*x[1]) ├─░─┤ H ├─░─┤ P(2.0*x[1]) ├
|
208
|
+
├───┤ ░ ├─────────────┤ ░ ├───┤ ░ ├─────────────┤ ░ ├───┤ ░ ├─────────────┤
|
209
|
+
q_2: ┤ H ├─░─┤ P(2.0*x[2]) ├─░─┤ H ├─░─┤ P(2.0*x[2]) ├─░─┤ H ├─░─┤ P(2.0*x[2]) ├
|
210
|
+
└───┘ ░ └─────────────┘ ░ └───┘ ░ └─────────────┘ ░ └───┘ ░ └─────────────┘
|
211
|
+
|
212
|
+
>>> data_map = lambda x: x[0]*x[0] + 1 # note: input is an array
|
213
|
+
>>> prep = z_feature_map(3, reps=1, data_map_func=data_map)
|
214
|
+
>>> print(prep)
|
215
|
+
┌───┐┌──────────────────────┐
|
216
|
+
q_0: ┤ H ├┤ P(2.0*x[0]**2 + 2.0) ├
|
217
|
+
├───┤├──────────────────────┤
|
218
|
+
q_1: ┤ H ├┤ P(2.0*x[1]**2 + 2.0) ├
|
219
|
+
├───┤├──────────────────────┤
|
220
|
+
q_2: ┤ H ├┤ P(2.0*x[2]**2 + 2.0) ├
|
221
|
+
└───┘└──────────────────────┘
|
222
|
+
|
223
|
+
>>> from qiskit.circuit.library import TwoLocal
|
224
|
+
>>> ry = TwoLocal(3, "ry", "cz", reps=1).decompose()
|
225
|
+
>>> classifier = z_feature_map(3, reps=1) + ry
|
226
|
+
>>> print(classifier)
|
227
|
+
┌───┐┌─────────────┐┌──────────┐ ┌──────────┐
|
228
|
+
q_0: ┤ H ├┤ P(2.0*x[0]) ├┤ RY(θ[0]) ├─■──■─┤ RY(θ[3]) ├────────────
|
229
|
+
├───┤├─────────────┤├──────────┤ │ │ └──────────┘┌──────────┐
|
230
|
+
q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ RY(θ[1]) ├─■──┼──────■──────┤ RY(θ[4]) ├
|
231
|
+
├───┤├─────────────┤├──────────┤ │ │ ├──────────┤
|
232
|
+
q_2: ┤ H ├┤ P(2.0*x[2]) ├┤ RY(θ[2]) ├────■──────■──────┤ RY(θ[5]) ├
|
233
|
+
└───┘└─────────────┘└──────────┘ └──────────┘
|
234
|
+
|
235
|
+
"""
|
236
|
+
return pauli_feature_map(
|
237
|
+
feature_dimension=feature_dimension,
|
238
|
+
reps=reps,
|
239
|
+
entanglement=entanglement,
|
240
|
+
alpha=alpha,
|
241
|
+
paulis=["z"],
|
242
|
+
data_map_func=data_map_func,
|
243
|
+
parameter_prefix=parameter_prefix,
|
244
|
+
insert_barriers=insert_barriers,
|
245
|
+
name=name,
|
246
|
+
)
|
247
|
+
|
248
|
+
|
249
|
+
def zz_feature_map(
|
250
|
+
feature_dimension: int,
|
251
|
+
reps: int = 2,
|
252
|
+
entanglement: (
|
253
|
+
str | Sequence[Sequence[int]] | Callable[[int], str | Sequence[Sequence[int]]]
|
254
|
+
) = "full",
|
255
|
+
alpha: float = 2.0,
|
256
|
+
data_map_func: Callable[[Parameter], ParameterExpression] | None = None,
|
257
|
+
parameter_prefix: str = "x",
|
258
|
+
insert_barriers: bool = False,
|
259
|
+
name: str = "ZZFeatureMap",
|
260
|
+
) -> QuantumCircuit:
|
261
|
+
r"""Second-order Pauli-Z evolution circuit.
|
262
|
+
|
263
|
+
For 3 qubits and 1 repetition and linear entanglement the circuit is represented by:
|
264
|
+
|
265
|
+
.. code-block:: text
|
266
|
+
|
267
|
+
┌───┐┌────────────────┐
|
268
|
+
┤ H ├┤ P(2.0*φ(x[0])) ├──■───────────────────────────■───────────────────────────────────
|
269
|
+
├───┤├────────────────┤┌─┴─┐┌─────────────────────┐┌─┴─┐
|
270
|
+
┤ H ├┤ P(2.0*φ(x[1])) ├┤ X ├┤ P(2.0*φ(x[0],x[1])) ├┤ X ├──■───────────────────────────■──
|
271
|
+
├───┤├────────────────┤└───┘└─────────────────────┘└───┘┌─┴─┐┌─────────────────────┐┌─┴─┐
|
272
|
+
┤ H ├┤ P(2.0*φ(x[2])) ├─────────────────────────────────┤ X ├┤ P(2.0*φ(x[1],x[2])) ├┤ X ├
|
273
|
+
└───┘└────────────────┘ └───┘└─────────────────────┘└───┘
|
274
|
+
|
275
|
+
where :math:`\varphi` is a classical non-linear function, which defaults to :math:`\varphi(x) = x`
|
276
|
+
if and :math:`\varphi(x,y) = (\pi - x)(\pi - y)`.
|
277
|
+
|
278
|
+
Examples:
|
279
|
+
|
280
|
+
>>> from qiskit.circuit.library import ZZFeatureMap
|
281
|
+
>>> prep = zz_feature_map(2, reps=1)
|
282
|
+
>>> print(prep)
|
283
|
+
┌───┐┌─────────────┐
|
284
|
+
q_0: ┤ H ├┤ P(2.0*x[0]) ├──■──────────────────────────────────────■──
|
285
|
+
├───┤├─────────────┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐
|
286
|
+
q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
|
287
|
+
└───┘└─────────────┘└───┘└────────────────────────────────┘└───┘
|
288
|
+
|
289
|
+
>>> from qiskit.circuit.library import EfficientSU2
|
290
|
+
>>> classifier = zz_feature_map(3) + EfficientSU2(3)
|
291
|
+
>>> classifier.num_parameters
|
292
|
+
15
|
293
|
+
>>> classifier.parameters # 'x' for the data preparation, 'θ' for the SU2 parameters
|
294
|
+
ParameterView([
|
295
|
+
ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
|
296
|
+
ParameterVectorElement(x[2]), ParameterVectorElement(θ[0]),
|
297
|
+
ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]),
|
298
|
+
ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]),
|
299
|
+
ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]),
|
300
|
+
ParameterVectorElement(θ[7]), ParameterVectorElement(θ[8]),
|
301
|
+
ParameterVectorElement(θ[9]), ParameterVectorElement(θ[10]),
|
302
|
+
ParameterVectorElement(θ[11]), ParameterVectorElement(θ[12]),
|
303
|
+
ParameterVectorElement(θ[13]), ParameterVectorElement(θ[14]),
|
304
|
+
ParameterVectorElement(θ[15]), ParameterVectorElement(θ[16]),
|
305
|
+
ParameterVectorElement(θ[17]), ParameterVectorElement(θ[18]),
|
306
|
+
ParameterVectorElement(θ[19]), ParameterVectorElement(θ[20]),
|
307
|
+
ParameterVectorElement(θ[21]), ParameterVectorElement(θ[22]),
|
308
|
+
ParameterVectorElement(θ[23])
|
309
|
+
])
|
310
|
+
"""
|
311
|
+
return pauli_feature_map(
|
312
|
+
feature_dimension=feature_dimension,
|
313
|
+
reps=reps,
|
314
|
+
entanglement=entanglement,
|
315
|
+
alpha=alpha,
|
316
|
+
paulis=["z", "zz"],
|
317
|
+
data_map_func=data_map_func,
|
318
|
+
parameter_prefix=parameter_prefix,
|
319
|
+
insert_barriers=insert_barriers,
|
320
|
+
name=name,
|
321
|
+
)
|
322
|
+
|
323
|
+
|
25
324
|
class PauliFeatureMap(NLocal):
|
26
325
|
r"""The Pauli Expansion circuit.
|
27
326
|
|
@@ -54,13 +353,13 @@ class PauliFeatureMap(NLocal):
|
|
54
353
|
|
55
354
|
which will produce blocks of the form
|
56
355
|
|
57
|
-
..
|
356
|
+
.. code-block:: text
|
58
357
|
|
59
|
-
|
60
|
-
┤ H ├┤
|
61
|
-
|
62
|
-
┤ H ├┤
|
63
|
-
|
358
|
+
┌───┐┌─────────────┐┌──────────┐ ┌───────────┐
|
359
|
+
┤ H ├┤ P(2.0*x[0]) ├┤ RX(pi/2) ├──■──────────────────────────────────────■──┤ RX(-pi/2) ├
|
360
|
+
├───┤├─────────────┤├──────────┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐├───────────┤
|
361
|
+
┤ H ├┤ P(2.0*x[1]) ├┤ RX(pi/2) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ RX(-pi/2) ├
|
362
|
+
└───┘└─────────────┘└──────────┘└───┘└────────────────────────────────┘└───┘└───────────┘
|
64
363
|
|
65
364
|
The circuit contains ``reps`` repetitions of this transformation.
|
66
365
|
|
@@ -70,28 +369,28 @@ class PauliFeatureMap(NLocal):
|
|
70
369
|
Examples:
|
71
370
|
|
72
371
|
>>> prep = PauliFeatureMap(2, reps=1, paulis=['ZZ'])
|
73
|
-
>>> print(prep)
|
372
|
+
>>> print(prep.decompose())
|
74
373
|
┌───┐
|
75
|
-
q_0: ┤ H
|
76
|
-
|
77
|
-
q_1: ┤ H ├┤ X ├┤
|
78
|
-
|
374
|
+
q_0: ┤ H ├──■──────────────────────────────────────■──
|
375
|
+
├───┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐
|
376
|
+
q_1: ┤ H ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
|
377
|
+
└───┘└───┘└────────────────────────────────┘└───┘
|
79
378
|
|
80
379
|
>>> prep = PauliFeatureMap(2, reps=1, paulis=['Z', 'XX'])
|
81
|
-
>>> print(prep)
|
82
|
-
|
83
|
-
q_0: ┤ H ├┤
|
84
|
-
|
85
|
-
q_1: ┤ H ├┤
|
86
|
-
|
380
|
+
>>> print(prep.decompose())
|
381
|
+
┌───┐┌─────────────┐┌───┐ ┌───┐
|
382
|
+
q_0: ┤ H ├┤ P(2.0*x[0]) ├┤ H ├──■──────────────────────────────────────■──┤ H ├
|
383
|
+
├───┤├─────────────┤├───┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐├───┤
|
384
|
+
q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ H ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ H ├
|
385
|
+
└───┘└─────────────┘└───┘└───┘└────────────────────────────────┘└───┘└───┘
|
87
386
|
|
88
387
|
>>> prep = PauliFeatureMap(2, reps=1, paulis=['ZY'])
|
89
|
-
>>> print(prep)
|
90
|
-
┌───┐┌──────────┐
|
91
|
-
q_0: ┤ H ├┤ RX(pi/2)
|
92
|
-
|
93
|
-
q_1: ┤ H ├────────────┤ X ├┤
|
94
|
-
└───┘
|
388
|
+
>>> print(prep.decompose())
|
389
|
+
┌───┐┌──────────┐ ┌───────────┐
|
390
|
+
q_0: ┤ H ├┤ RX(pi/2) ├──■──────────────────────────────────────■──┤ RX(-pi/2) ├
|
391
|
+
├───┤└──────────┘┌─┴─┐┌────────────────────────────────┐┌─┴─┐└───────────┘
|
392
|
+
q_1: ┤ H ├────────────┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├─────────────
|
393
|
+
└───┘ └───┘└────────────────────────────────┘└───┘
|
95
394
|
|
96
395
|
>>> from qiskit.circuit.library import EfficientSU2
|
97
396
|
>>> prep = PauliFeatureMap(3, reps=3, paulis=['Z', 'YY', 'ZXZ'])
|
@@ -104,13 +403,18 @@ class PauliFeatureMap(NLocal):
|
|
104
403
|
|
105
404
|
References:
|
106
405
|
|
107
|
-
|
108
|
-
|
109
406
|
[1] Havlicek et al. Supervised learning with quantum enhanced feature spaces,
|
110
407
|
`Nature 567, 209-212 (2019) <https://www.nature.com/articles/s41586-019-0980-2>`__.
|
111
|
-
|
112
408
|
"""
|
113
409
|
|
410
|
+
@deprecate_func(
|
411
|
+
since="1.3",
|
412
|
+
additional_msg=(
|
413
|
+
"Use the pauli_feature_map function as a replacement. Note that this will no longer "
|
414
|
+
"return a BlueprintCircuit, but just a plain QuantumCircuit."
|
415
|
+
),
|
416
|
+
pending=True,
|
417
|
+
)
|
114
418
|
def __init__(
|
115
419
|
self,
|
116
420
|
feature_dimension: Optional[int] = None,
|
@@ -161,6 +465,7 @@ class PauliFeatureMap(NLocal):
|
|
161
465
|
name=name,
|
162
466
|
)
|
163
467
|
|
468
|
+
self._prefix = parameter_prefix
|
164
469
|
self._data_map_func = data_map_func or self_product
|
165
470
|
self._paulis = paulis or ["Z", "ZZ"]
|
166
471
|
self._alpha = alpha
|
@@ -217,6 +522,11 @@ class PauliFeatureMap(NLocal):
|
|
217
522
|
|
218
523
|
@property
|
219
524
|
def entanglement_blocks(self):
|
525
|
+
"""The blocks in the entanglement layers.
|
526
|
+
|
527
|
+
Returns:
|
528
|
+
The blocks in the entanglement layers.
|
529
|
+
"""
|
220
530
|
return [self.pauli_block(pauli) for pauli in self._paulis]
|
221
531
|
|
222
532
|
@entanglement_blocks.setter
|
@@ -275,7 +585,10 @@ class PauliFeatureMap(NLocal):
|
|
275
585
|
if pauli == "X":
|
276
586
|
circuit.h(i)
|
277
587
|
elif pauli == "Y":
|
278
|
-
|
588
|
+
if inverse:
|
589
|
+
circuit.sxdg(i)
|
590
|
+
else:
|
591
|
+
circuit.sx(i)
|
279
592
|
|
280
593
|
def cx_chain(circuit, inverse=False):
|
281
594
|
num_cx = len(indices) - 1
|
@@ -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
|