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
@@ -0,0 +1,150 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Second-order Pauli-Z expansion circuit."""
|
14
|
+
|
15
|
+
from typing import Callable, List, Union, Optional, Dict, Tuple
|
16
|
+
import numpy as np
|
17
|
+
from qiskit.utils.deprecation import deprecate_func
|
18
|
+
from .pauli_feature_map import PauliFeatureMap
|
19
|
+
|
20
|
+
|
21
|
+
class ZZFeatureMap(PauliFeatureMap):
|
22
|
+
r"""Second-order Pauli-Z evolution circuit.
|
23
|
+
|
24
|
+
For 3 qubits and 1 repetition and linear entanglement the circuit is represented by:
|
25
|
+
|
26
|
+
.. code-block:: text
|
27
|
+
|
28
|
+
┌───┐┌────────────────┐
|
29
|
+
┤ H ├┤ P(2.0*φ(x[0])) ├──■───────────────────────────■───────────────────────────────────
|
30
|
+
├───┤├────────────────┤┌─┴─┐┌─────────────────────┐┌─┴─┐
|
31
|
+
┤ H ├┤ P(2.0*φ(x[1])) ├┤ X ├┤ P(2.0*φ(x[0],x[1])) ├┤ X ├──■───────────────────────────■──
|
32
|
+
├───┤├────────────────┤└───┘└─────────────────────┘└───┘┌─┴─┐┌─────────────────────┐┌─┴─┐
|
33
|
+
┤ H ├┤ P(2.0*φ(x[2])) ├─────────────────────────────────┤ X ├┤ P(2.0*φ(x[1],x[2])) ├┤ X ├
|
34
|
+
└───┘└────────────────┘ └───┘└─────────────────────┘└───┘
|
35
|
+
|
36
|
+
where :math:`\varphi` is a classical non-linear function, which defaults to :math:`\varphi(x) = x`
|
37
|
+
if and :math:`\varphi(x,y) = (\pi - x)(\pi - y)`.
|
38
|
+
|
39
|
+
Examples:
|
40
|
+
|
41
|
+
.. code-block::
|
42
|
+
|
43
|
+
from qiskit.circuit.library import ZZFeatureMap
|
44
|
+
prep = ZZFeatureMap(2, reps=1)
|
45
|
+
print(prep.decompose())
|
46
|
+
|
47
|
+
.. code-block:: text
|
48
|
+
|
49
|
+
┌───┐┌─────────────┐
|
50
|
+
q_0: ┤ H ├┤ P(2.0*x[0]) ├──■──────────────────────────────────────■──
|
51
|
+
├───┤├─────────────┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐
|
52
|
+
q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
|
53
|
+
└───┘└─────────────┘└───┘└────────────────────────────────┘└───┘
|
54
|
+
|
55
|
+
.. code-block::
|
56
|
+
|
57
|
+
from qiskit.circuit.library import EfficientSU2
|
58
|
+
classifier = ZZFeatureMap(3).compose(EfficientSU2(3))
|
59
|
+
classifier.num_parameters
|
60
|
+
|
61
|
+
.. code-block:: text
|
62
|
+
|
63
|
+
27
|
64
|
+
|
65
|
+
.. code-block::
|
66
|
+
|
67
|
+
classifier.parameters # 'x' for the data preparation, 'θ' for the SU2 parameters
|
68
|
+
|
69
|
+
.. code-block:: text
|
70
|
+
|
71
|
+
ParameterView([
|
72
|
+
ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
|
73
|
+
ParameterVectorElement(x[2]), ParameterVectorElement(θ[0]),
|
74
|
+
ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]),
|
75
|
+
ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]),
|
76
|
+
ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]),
|
77
|
+
ParameterVectorElement(θ[7]), ParameterVectorElement(θ[8]),
|
78
|
+
ParameterVectorElement(θ[9]), ParameterVectorElement(θ[10]),
|
79
|
+
ParameterVectorElement(θ[11]), ParameterVectorElement(θ[12]),
|
80
|
+
ParameterVectorElement(θ[13]), ParameterVectorElement(θ[14]),
|
81
|
+
ParameterVectorElement(θ[15]), ParameterVectorElement(θ[16]),
|
82
|
+
ParameterVectorElement(θ[17]), ParameterVectorElement(θ[18]),
|
83
|
+
ParameterVectorElement(θ[19]), ParameterVectorElement(θ[20]),
|
84
|
+
ParameterVectorElement(θ[21]), ParameterVectorElement(θ[22]),
|
85
|
+
ParameterVectorElement(θ[23])
|
86
|
+
])
|
87
|
+
|
88
|
+
.. code-block::
|
89
|
+
|
90
|
+
classifier.count_ops()
|
91
|
+
|
92
|
+
.. code-block:: text
|
93
|
+
|
94
|
+
OrderedDict([('ZZFeatureMap', 1), ('EfficientSU2', 1)])
|
95
|
+
|
96
|
+
"""
|
97
|
+
|
98
|
+
@deprecate_func(
|
99
|
+
since="1.3",
|
100
|
+
additional_msg=(
|
101
|
+
"Use the z_feature_map function as a replacement. Note that this will no longer "
|
102
|
+
"return a BlueprintCircuit, but just a plain QuantumCircuit."
|
103
|
+
),
|
104
|
+
pending=True,
|
105
|
+
)
|
106
|
+
def __init__(
|
107
|
+
self,
|
108
|
+
feature_dimension: int,
|
109
|
+
reps: int = 2,
|
110
|
+
entanglement: Union[
|
111
|
+
str,
|
112
|
+
Dict[int, List[Tuple[int]]],
|
113
|
+
Callable[[int], Union[str, Dict[int, List[Tuple[int]]]]],
|
114
|
+
] = "full",
|
115
|
+
data_map_func: Optional[Callable[[np.ndarray], float]] = None,
|
116
|
+
parameter_prefix: str = "x",
|
117
|
+
insert_barriers: bool = False,
|
118
|
+
name: str = "ZZFeatureMap",
|
119
|
+
) -> None:
|
120
|
+
"""Create a new second-order Pauli-Z expansion.
|
121
|
+
|
122
|
+
Args:
|
123
|
+
feature_dimension: Number of features.
|
124
|
+
reps: The number of repeated circuits, has a min. value of 1.
|
125
|
+
entanglement: Specifies the entanglement structure. Refer to
|
126
|
+
:class:`~qiskit.circuit.library.PauliFeatureMap` for detail.
|
127
|
+
data_map_func: A mapping function for data x.
|
128
|
+
parameter_prefix: The prefix used if default parameters are generated.
|
129
|
+
insert_barriers: If True, barriers are inserted in between the evolution instructions
|
130
|
+
and hadamard layers.
|
131
|
+
|
132
|
+
Raises:
|
133
|
+
ValueError: If the feature dimension is smaller than 2.
|
134
|
+
"""
|
135
|
+
if feature_dimension < 2:
|
136
|
+
raise ValueError(
|
137
|
+
"The ZZFeatureMap contains 2-local interactions and cannot be "
|
138
|
+
f"defined for less than 2 qubits. You provided {feature_dimension}."
|
139
|
+
)
|
140
|
+
|
141
|
+
super().__init__(
|
142
|
+
feature_dimension=feature_dimension,
|
143
|
+
reps=reps,
|
144
|
+
entanglement=entanglement,
|
145
|
+
paulis=["Z", "ZZ"],
|
146
|
+
data_map_func=data_map_func,
|
147
|
+
parameter_prefix=parameter_prefix,
|
148
|
+
insert_barriers=insert_barriers,
|
149
|
+
name=name,
|
150
|
+
)
|
@@ -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
|