qiskit 1.3.0__cp39-abi3-win32.whl → 1.3.0b1__cp39-abi3-win32.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +1 -20
- qiskit/_accelerate.pyd +0 -0
- qiskit/assembler/assemble_schedules.py +0 -2
- qiskit/circuit/__init__.py +1 -44
- qiskit/circuit/_standard_gates_commutations.py +0 -585
- qiskit/circuit/barrier.py +0 -2
- qiskit/circuit/controlflow/builder.py +3 -3
- qiskit/circuit/controlflow/if_else.py +5 -13
- qiskit/circuit/controlflow/while_loop.py +2 -10
- qiskit/circuit/delay.py +3 -20
- qiskit/circuit/equivalence.py +214 -13
- qiskit/circuit/gate.py +1 -3
- qiskit/circuit/instruction.py +11 -32
- qiskit/circuit/instructionset.py +0 -2
- qiskit/circuit/library/__init__.py +14 -110
- qiskit/circuit/library/arithmetic/__init__.py +2 -9
- qiskit/circuit/library/arithmetic/adders/__init__.py +0 -1
- qiskit/circuit/library/arithmetic/adders/adder.py +2 -154
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +56 -20
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +1 -14
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +91 -21
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +0 -1
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -8
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +3 -94
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +1 -8
- qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
- qiskit/circuit/library/basis_change/qft.py +38 -20
- qiskit/circuit/library/blueprintcircuit.py +0 -64
- qiskit/circuit/library/boolean_logic/__init__.py +4 -4
- qiskit/circuit/library/boolean_logic/inner_product.py +4 -81
- qiskit/circuit/library/boolean_logic/quantum_and.py +4 -107
- qiskit/circuit/library/boolean_logic/quantum_or.py +3 -107
- qiskit/circuit/library/boolean_logic/quantum_xor.py +3 -97
- qiskit/circuit/library/data_preparation/__init__.py +3 -6
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +29 -342
- qiskit/circuit/library/data_preparation/{_z_feature_map.py → z_feature_map.py} +34 -45
- qiskit/circuit/library/data_preparation/zz_feature_map.py +118 -0
- qiskit/circuit/library/fourier_checking.py +11 -72
- qiskit/circuit/library/generalized_gates/__init__.py +1 -1
- qiskit/circuit/library/generalized_gates/diagonal.py +51 -45
- qiskit/circuit/library/generalized_gates/gms.py +14 -67
- qiskit/circuit/library/generalized_gates/gr.py +4 -4
- qiskit/circuit/library/generalized_gates/isometry.py +2 -2
- qiskit/circuit/library/generalized_gates/linear_function.py +6 -12
- qiskit/circuit/library/generalized_gates/mcmt.py +107 -167
- qiskit/circuit/library/generalized_gates/permutation.py +6 -8
- qiskit/circuit/library/generalized_gates/rv.py +9 -8
- qiskit/circuit/library/graph_state.py +10 -93
- qiskit/circuit/library/grover_operator.py +2 -270
- qiskit/circuit/library/hidden_linear_function.py +20 -83
- qiskit/circuit/library/iqp.py +20 -99
- qiskit/circuit/library/n_local/__init__.py +7 -19
- qiskit/circuit/library/n_local/efficient_su2.py +5 -118
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +0 -259
- qiskit/circuit/library/n_local/excitation_preserving.py +6 -130
- qiskit/circuit/library/n_local/n_local.py +5 -406
- qiskit/circuit/library/n_local/pauli_two_design.py +4 -106
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -80
- qiskit/circuit/library/n_local/real_amplitudes.py +7 -127
- qiskit/circuit/library/n_local/two_local.py +7 -14
- qiskit/circuit/library/overlap.py +26 -91
- qiskit/circuit/library/pauli_evolution.py +15 -17
- qiskit/circuit/library/phase_estimation.py +4 -80
- qiskit/circuit/library/quantum_volume.py +20 -72
- qiskit/circuit/library/standard_gates/__init__.py +1 -20
- qiskit/circuit/library/standard_gates/dcx.py +1 -2
- qiskit/circuit/library/standard_gates/ecr.py +2 -2
- qiskit/circuit/library/standard_gates/h.py +3 -4
- qiskit/circuit/library/standard_gates/i.py +1 -2
- qiskit/circuit/library/standard_gates/iswap.py +2 -2
- qiskit/circuit/library/standard_gates/p.py +12 -20
- qiskit/circuit/library/standard_gates/r.py +1 -1
- qiskit/circuit/library/standard_gates/rx.py +3 -4
- qiskit/circuit/library/standard_gates/rxx.py +2 -2
- qiskit/circuit/library/standard_gates/ry.py +3 -4
- qiskit/circuit/library/standard_gates/ryy.py +2 -2
- qiskit/circuit/library/standard_gates/rz.py +12 -13
- qiskit/circuit/library/standard_gates/rzx.py +6 -6
- qiskit/circuit/library/standard_gates/rzz.py +1 -1
- qiskit/circuit/library/standard_gates/s.py +4 -4
- qiskit/circuit/library/standard_gates/swap.py +3 -3
- qiskit/circuit/library/standard_gates/sx.py +3 -4
- qiskit/circuit/library/standard_gates/t.py +2 -2
- qiskit/circuit/library/standard_gates/u.py +3 -11
- qiskit/circuit/library/standard_gates/u1.py +15 -65
- qiskit/circuit/library/standard_gates/u2.py +1 -4
- qiskit/circuit/library/standard_gates/u3.py +3 -31
- qiskit/circuit/library/standard_gates/x.py +5 -7
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -2
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -2
- qiskit/circuit/library/standard_gates/y.py +3 -4
- qiskit/circuit/library/standard_gates/z.py +3 -3
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +8 -9
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +7 -9
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +8 -9
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +8 -9
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +8 -9
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +9 -10
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +7 -9
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +8 -10
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +14 -16
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +12 -14
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +12 -14
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +9 -11
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +9 -11
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +9 -11
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +9 -11
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +10 -12
- qiskit/circuit/library/templates/rzx/rzx_cy.py +10 -11
- qiskit/circuit/library/templates/rzx/rzx_xz.py +15 -16
- qiskit/circuit/library/templates/rzx/rzx_yz.py +10 -12
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +20 -22
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +15 -16
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +15 -17
- qiskit/circuit/parameter.py +0 -4
- qiskit/circuit/parameterexpression.py +34 -167
- qiskit/circuit/quantumcircuit.py +126 -162
- qiskit/circuit/singleton.py +0 -2
- qiskit/circuit/store.py +0 -2
- qiskit/compiler/assembler.py +4 -17
- qiskit/compiler/scheduler.py +0 -2
- qiskit/compiler/sequencer.py +0 -2
- qiskit/compiler/transpiler.py +26 -81
- qiskit/converters/circuit_to_dag.py +2 -2
- qiskit/converters/circuit_to_dagdependency.py +1 -1
- qiskit/converters/circuit_to_dagdependency_v2.py +1 -1
- qiskit/converters/circuit_to_instruction.py +1 -1
- qiskit/converters/dag_to_circuit.py +5 -7
- qiskit/converters/dag_to_dagdependency.py +1 -1
- qiskit/converters/dag_to_dagdependency_v2.py +1 -1
- qiskit/converters/dagdependency_to_circuit.py +1 -5
- qiskit/converters/dagdependency_to_dag.py +1 -6
- qiskit/dagcircuit/collect_blocks.py +3 -3
- qiskit/dagcircuit/dagdependency.py +5 -18
- qiskit/dagcircuit/dagdependency_v2.py +1 -1
- qiskit/dagcircuit/dagnode.py +2 -2
- qiskit/passmanager/__init__.py +2 -2
- qiskit/primitives/backend_estimator.py +2 -5
- qiskit/primitives/backend_sampler_v2.py +18 -61
- qiskit/primitives/base/base_estimator.py +2 -2
- qiskit/primitives/containers/data_bin.py +1 -9
- qiskit/primitives/statevector_sampler.py +1 -1
- qiskit/primitives/utils.py +1 -1
- qiskit/providers/__init__.py +3 -3
- qiskit/providers/backend.py +1 -12
- qiskit/providers/backend_compat.py +3 -23
- qiskit/providers/basic_provider/basic_simulator.py +2 -12
- qiskit/providers/fake_provider/fake_pulse_backend.py +1 -6
- qiskit/providers/fake_provider/generic_backend_v2.py +30 -46
- qiskit/providers/models/pulsedefaults.py +0 -2
- qiskit/pulse/builder.py +18 -59
- qiskit/pulse/calibration_entries.py +1 -4
- qiskit/pulse/channels.py +0 -2
- qiskit/pulse/exceptions.py +0 -2
- qiskit/pulse/instruction_schedule_map.py +6 -21
- qiskit/pulse/instructions/acquire.py +0 -2
- qiskit/pulse/instructions/delay.py +0 -2
- qiskit/pulse/instructions/directives.py +0 -8
- qiskit/pulse/instructions/frequency.py +0 -3
- qiskit/pulse/instructions/instruction.py +0 -2
- qiskit/pulse/instructions/phase.py +0 -3
- qiskit/pulse/instructions/play.py +0 -2
- qiskit/pulse/instructions/reference.py +0 -2
- qiskit/pulse/instructions/snapshot.py +0 -2
- qiskit/pulse/library/pulse.py +0 -2
- qiskit/pulse/library/symbolic_pulses.py +0 -28
- qiskit/pulse/library/waveform.py +0 -2
- qiskit/pulse/macros.py +1 -1
- qiskit/pulse/schedule.py +13 -12
- qiskit/pulse/transforms/alignments.py +3 -5
- qiskit/pulse/transforms/dag.py +0 -7
- qiskit/qasm2/export.py +3 -5
- qiskit/qasm2/parse.py +2 -46
- qiskit/qasm3/__init__.py +0 -1
- qiskit/qasm3/ast.py +15 -123
- qiskit/qasm3/exporter.py +77 -103
- qiskit/qobj/converters/pulse_instruction.py +4 -6
- qiskit/qpy/__init__.py +0 -181
- qiskit/qpy/binary_io/circuits.py +5 -20
- qiskit/qpy/binary_io/schedules.py +4 -3
- qiskit/qpy/binary_io/value.py +13 -310
- qiskit/qpy/common.py +2 -46
- qiskit/qpy/formats.py +0 -7
- qiskit/qpy/interface.py +4 -40
- qiskit/quantum_info/__init__.py +0 -4
- qiskit/quantum_info/operators/channel/transformations.py +21 -28
- qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
- qiskit/quantum_info/operators/operator.py +8 -54
- qiskit/quantum_info/operators/symplectic/base_pauli.py +19 -11
- qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +1 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +0 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +2 -23
- qiskit/quantum_info/states/densitymatrix.py +5 -5
- qiskit/quantum_info/states/stabilizerstate.py +1 -1
- qiskit/quantum_info/states/statevector.py +6 -6
- qiskit/result/mitigation/base_readout_mitigator.py +1 -1
- qiskit/result/mitigation/correlated_readout_mitigator.py +1 -9
- qiskit/result/mitigation/local_readout_mitigator.py +1 -9
- qiskit/result/mitigation/utils.py +0 -57
- qiskit/scheduler/config.py +0 -2
- qiskit/scheduler/methods/basic.py +0 -3
- qiskit/scheduler/schedule_circuit.py +0 -2
- qiskit/scheduler/sequence.py +0 -2
- qiskit/synthesis/__init__.py +0 -25
- qiskit/synthesis/clifford/clifford_decompose_bm.py +2 -1
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +2 -3
- qiskit/synthesis/clifford/clifford_decompose_layers.py +1 -2
- qiskit/synthesis/evolution/__init__.py +0 -1
- qiskit/synthesis/evolution/lie_trotter.py +42 -16
- qiskit/synthesis/evolution/product_formula.py +238 -165
- qiskit/synthesis/evolution/qdrift.py +29 -36
- qiskit/synthesis/evolution/suzuki_trotter.py +27 -87
- qiskit/synthesis/multi_controlled/__init__.py +0 -1
- qiskit/synthesis/qft/qft_decompose_full.py +1 -19
- qiskit/synthesis/qft/qft_decompose_lnn.py +1 -2
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +1 -2
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +63 -4
- qiskit/synthesis/two_qubit/weyl.py +97 -0
- qiskit/synthesis/unitary/qsd.py +5 -5
- qiskit/transpiler/__init__.py +14 -21
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/passes/__init__.py +0 -2
- qiskit/transpiler/passes/basis/basis_translator.py +565 -9
- qiskit/transpiler/passes/basis/decompose.py +12 -45
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
- qiskit/transpiler/passes/calibration/pulse_gate.py +2 -4
- qiskit/transpiler/passes/calibration/rx_builder.py +7 -11
- qiskit/transpiler/passes/calibration/rzx_builder.py +30 -46
- qiskit/transpiler/passes/layout/disjoint_utils.py +13 -15
- qiskit/transpiler/passes/layout/sabre_layout.py +2 -7
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +0 -5
- qiskit/transpiler/passes/optimization/__init__.py +0 -1
- qiskit/transpiler/passes/optimization/collect_cliffords.py +3 -19
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +131 -48
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +2 -4
- qiskit/transpiler/passes/optimization/elide_permutations.py +32 -9
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +0 -2
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +11 -5
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +3 -7
- qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
- qiskit/transpiler/passes/scheduling/alap.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -2
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
- qiskit/transpiler/passes/scheduling/asap.py +1 -1
- qiskit/transpiler/passes/scheduling/base_scheduler.py +12 -14
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +4 -9
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +5 -16
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +1 -4
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +2 -6
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -9
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +99 -262
- qiskit/transpiler/passes/synthesis/hls_plugins.py +7 -638
- qiskit/transpiler/passes/synthesis/qubit_tracker.py +132 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -55
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +56 -2
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -5
- qiskit/transpiler/passes/utils/gate_direction.py +275 -12
- qiskit/transpiler/passes/utils/gates_basis.py +30 -7
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +1 -2
- qiskit/transpiler/passmanager_config.py +4 -22
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +14 -40
- qiskit/transpiler/preset_passmanagers/common.py +3 -5
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +42 -125
- qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
- qiskit/transpiler/target.py +16 -74
- qiskit/visualization/circuit/_utils.py +2 -2
- qiskit/visualization/circuit/circuit_visualization.py +2 -3
- qiskit/visualization/circuit/matplotlib.py +1 -1
- qiskit/visualization/dag_visualization.py +1 -1
- qiskit/visualization/pass_manager_visualization.py +14 -3
- qiskit/visualization/pulse_v2/interface.py +1 -3
- qiskit/visualization/timeline/core.py +2 -25
- qiskit/visualization/timeline/interface.py +0 -12
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/METADATA +19 -20
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/RECORD +347 -358
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/WHEEL +1 -1
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/entry_points.txt +0 -19
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +0 -150
- qiskit/circuit/twirling.py +0 -145
- qiskit/synthesis/arithmetic/__init__.py +0 -16
- qiskit/synthesis/arithmetic/adders/__init__.py +0 -17
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +0 -154
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +0 -103
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +0 -161
- qiskit/synthesis/arithmetic/multipliers/__init__.py +0 -16
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +0 -102
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +0 -99
- qiskit/synthesis/evolution/pauli_network.py +0 -80
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +0 -52
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +0 -69
- qiskit/utils/deprecate_pulse.py +0 -119
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/top_level.txt +0 -0
@@ -16,19 +16,14 @@ from __future__ import annotations
|
|
16
16
|
|
17
17
|
import inspect
|
18
18
|
import math
|
19
|
-
import typing
|
20
|
-
from itertools import chain
|
21
19
|
from collections.abc import Callable
|
22
20
|
import numpy as np
|
23
21
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
24
22
|
from qiskit.quantum_info.operators import SparsePauliOp, Pauli
|
25
23
|
from qiskit.utils.deprecation import deprecate_arg
|
26
|
-
from qiskit.exceptions import QiskitError
|
27
24
|
|
28
|
-
from .product_formula import ProductFormula
|
29
|
-
|
30
|
-
if typing.TYPE_CHECKING:
|
31
|
-
from qiskit.circuit.library import PauliEvolutionGate
|
25
|
+
from .product_formula import ProductFormula
|
26
|
+
from .lie_trotter import LieTrotter
|
32
27
|
|
33
28
|
|
34
29
|
class QDrift(ProductFormula):
|
@@ -68,7 +63,6 @@ class QDrift(ProductFormula):
|
|
68
63
|
) = None,
|
69
64
|
seed: int | None = None,
|
70
65
|
wrap: bool = False,
|
71
|
-
preserve_order: bool = True,
|
72
66
|
) -> None:
|
73
67
|
r"""
|
74
68
|
Args:
|
@@ -89,50 +83,49 @@ class QDrift(ProductFormula):
|
|
89
83
|
seed: An optional seed for reproducibility of the random sampling process.
|
90
84
|
wrap: Whether to wrap the atomic evolutions into custom gate objects. This only takes
|
91
85
|
effect when ``atomic_evolution is None``.
|
92
|
-
preserve_order: If ``False``, allows reordering the terms of the operator to
|
93
|
-
potentially yield a shallower evolution circuit. Not relevant
|
94
|
-
when synthesizing operator with a single term.
|
95
86
|
"""
|
96
|
-
super().__init__(
|
97
|
-
1, reps, insert_barriers, cx_structure, atomic_evolution, wrap, preserve_order
|
98
|
-
)
|
87
|
+
super().__init__(1, reps, insert_barriers, cx_structure, atomic_evolution, wrap)
|
99
88
|
self.sampled_ops = None
|
100
89
|
self.rng = np.random.default_rng(seed)
|
101
90
|
|
102
|
-
def
|
91
|
+
def synthesize(self, evolution):
|
92
|
+
# get operators and time to evolve
|
103
93
|
operators = evolution.operator
|
104
|
-
time = evolution.time
|
94
|
+
time = evolution.time
|
105
95
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
paulis = list(chain.from_iterable([op.to_sparse_list() for op in operators]))
|
96
|
+
if not isinstance(operators, list):
|
97
|
+
pauli_list = [(Pauli(op), coeff) for op, coeff in operators.to_list()]
|
98
|
+
coeffs = [np.real(coeff) for op, coeff in operators.to_list()]
|
110
99
|
else:
|
111
|
-
|
112
|
-
|
113
|
-
try:
|
114
|
-
coeffs = [float(np.real_if_close(coeff)) for _, _, coeff in paulis]
|
115
|
-
except TypeError as exc:
|
116
|
-
raise QiskitError("QDrift requires bound, real coefficients.") from exc
|
100
|
+
pauli_list = [(op, 1) for op in operators]
|
101
|
+
coeffs = [1 for op in operators]
|
117
102
|
|
118
103
|
# We artificially make the weights positive
|
119
104
|
weights = np.abs(coeffs)
|
120
105
|
lambd = np.sum(weights)
|
121
106
|
|
122
107
|
num_gates = math.ceil(2 * (lambd**2) * (time**2) * self.reps)
|
123
|
-
|
124
108
|
# The protocol calls for the removal of the individual coefficients,
|
125
109
|
# and multiplication by a constant evolution time.
|
126
|
-
|
127
|
-
|
110
|
+
evolution_time = lambd * time / num_gates
|
111
|
+
|
112
|
+
self.sampled_ops = self.rng.choice(
|
113
|
+
np.array(pauli_list, dtype=object),
|
114
|
+
size=(num_gates,),
|
115
|
+
p=weights / lambd,
|
128
116
|
)
|
129
117
|
|
130
|
-
|
131
|
-
|
132
|
-
(pauli[0], pauli[1], np.real(np.sign(pauli[2])) * rescaled_time) for pauli in sampled
|
133
|
-
]
|
118
|
+
# pylint: disable=cyclic-import
|
119
|
+
from qiskit.circuit.library.pauli_evolution import PauliEvolutionGate
|
134
120
|
|
135
|
-
|
136
|
-
|
121
|
+
# Build the evolution circuit using the LieTrotter synthesis with the sampled operators
|
122
|
+
lie_trotter = LieTrotter(
|
123
|
+
insert_barriers=self.insert_barriers, atomic_evolution=self.atomic_evolution
|
124
|
+
)
|
125
|
+
evolution_circuit = PauliEvolutionGate(
|
126
|
+
sum(SparsePauliOp(np.sign(coeff) * op) for op, coeff in self.sampled_ops),
|
127
|
+
time=evolution_time,
|
128
|
+
synthesis=lie_trotter,
|
129
|
+
).definition
|
137
130
|
|
138
|
-
return
|
131
|
+
return evolution_circuit
|
@@ -15,19 +15,16 @@
|
|
15
15
|
from __future__ import annotations
|
16
16
|
|
17
17
|
import inspect
|
18
|
-
import typing
|
19
18
|
from collections.abc import Callable
|
20
|
-
|
19
|
+
|
20
|
+
import numpy as np
|
21
21
|
|
22
22
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
23
23
|
from qiskit.quantum_info.operators import SparsePauliOp, Pauli
|
24
24
|
from qiskit.utils.deprecation import deprecate_arg
|
25
25
|
|
26
|
-
from .product_formula import ProductFormula, reorder_paulis
|
27
26
|
|
28
|
-
|
29
|
-
from qiskit.circuit.quantumcircuit import ParameterValueType
|
30
|
-
from qiskit.circuit.library.pauli_evolution import PauliEvolutionGate
|
27
|
+
from .product_formula import ProductFormula
|
31
28
|
|
32
29
|
|
33
30
|
class SuzukiTrotter(ProductFormula):
|
@@ -47,7 +44,7 @@ class SuzukiTrotter(ProductFormula):
|
|
47
44
|
|
48
45
|
.. math::
|
49
46
|
|
50
|
-
e^{-it(
|
47
|
+
e^{-it(XX + ZZ)} = e^{-it/2 ZZ}e^{-it XX}e^{-it/2 ZZ} + \mathcal{O}(t^3).
|
51
48
|
|
52
49
|
References:
|
53
50
|
[1]: D. Berry, G. Ahokas, R. Cleve and B. Sanders,
|
@@ -85,7 +82,6 @@ class SuzukiTrotter(ProductFormula):
|
|
85
82
|
| None
|
86
83
|
) = None,
|
87
84
|
wrap: bool = False,
|
88
|
-
preserve_order: bool = True,
|
89
85
|
) -> None:
|
90
86
|
"""
|
91
87
|
Args:
|
@@ -105,111 +101,55 @@ class SuzukiTrotter(ProductFormula):
|
|
105
101
|
built.
|
106
102
|
wrap: Whether to wrap the atomic evolutions into custom gate objects. This only takes
|
107
103
|
effect when ``atomic_evolution is None``.
|
108
|
-
preserve_order: If ``False``, allows reordering the terms of the operator to
|
109
|
-
potentially yield a shallower evolution circuit. Not relevant
|
110
|
-
when synthesizing operator with a single term.
|
111
104
|
Raises:
|
112
105
|
ValueError: If order is not even
|
113
106
|
"""
|
114
107
|
|
115
|
-
if order
|
108
|
+
if order % 2 == 1:
|
116
109
|
raise ValueError(
|
117
110
|
"Suzuki product formulae are symmetric and therefore only defined "
|
118
|
-
|
111
|
+
"for even orders."
|
119
112
|
)
|
120
|
-
super().__init__(
|
121
|
-
order,
|
122
|
-
reps,
|
123
|
-
insert_barriers,
|
124
|
-
cx_structure,
|
125
|
-
atomic_evolution,
|
126
|
-
wrap,
|
127
|
-
preserve_order=preserve_order,
|
128
|
-
)
|
129
|
-
|
130
|
-
def expand(
|
131
|
-
self, evolution: PauliEvolutionGate
|
132
|
-
) -> list[tuple[str, list[int], ParameterValueType]]:
|
133
|
-
"""Expand the Hamiltonian into a Suzuki-Trotter sequence of sparse gates.
|
134
|
-
|
135
|
-
For example, the Hamiltonian ``H = IX + ZZ`` for an evolution time ``t`` and
|
136
|
-
1 repetition for an order 2 formula would get decomposed into a list of 3-tuples
|
137
|
-
containing ``(pauli, indices, rz_rotation_angle)``, that is:
|
138
|
-
|
139
|
-
.. code-block:: text
|
140
|
-
|
141
|
-
("X", [0], t), ("ZZ", [0, 1], 2t), ("X", [0], 2)
|
142
|
-
|
143
|
-
Note that the rotation angle contains a factor of 2, such that that evolution
|
144
|
-
of a Pauli :math:`P` over time :math:`t`, which is :math:`e^{itP}`, is represented
|
145
|
-
by ``(P, indices, 2 * t)``.
|
146
|
-
|
147
|
-
For ``N`` repetitions, this sequence would be repeated ``N`` times and the coefficients
|
148
|
-
divided by ``N``.
|
113
|
+
super().__init__(order, reps, insert_barriers, cx_structure, atomic_evolution, wrap)
|
149
114
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
Returns:
|
154
|
-
The Pauli network implementing the Trotter expansion.
|
155
|
-
"""
|
156
|
-
operators = evolution.operator # type: SparsePauliOp | list[SparsePauliOp]
|
115
|
+
def synthesize(self, evolution):
|
116
|
+
# get operators and time to evolve
|
117
|
+
operators = evolution.operator
|
157
118
|
time = evolution.time
|
158
119
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
120
|
+
if not isinstance(operators, list):
|
121
|
+
pauli_list = [(Pauli(op), np.real(coeff)) for op, coeff in operators.to_list()]
|
122
|
+
else:
|
123
|
+
pauli_list = [(op, 1) for op in operators]
|
163
124
|
|
164
|
-
|
125
|
+
ops_to_evolve = self._recurse(self.order, time / self.reps, pauli_list)
|
165
126
|
|
166
127
|
# construct the evolution circuit
|
167
|
-
|
168
|
-
non_commuting = [to_sparse_list(operator) for operator in operators]
|
169
|
-
else:
|
170
|
-
# Assume no commutativity here. If we were to group commuting Paulis,
|
171
|
-
# here would be the location to do so.
|
172
|
-
non_commuting = [[op] for op in to_sparse_list(operators)]
|
173
|
-
|
174
|
-
# normalize coefficients, i.e. ensure they are float or ParameterExpression
|
175
|
-
non_commuting = self._normalize_coefficients(non_commuting)
|
128
|
+
single_rep = QuantumCircuit(operators[0].num_qubits)
|
176
129
|
|
177
|
-
|
178
|
-
|
179
|
-
|
130
|
+
for i, (op, coeff) in enumerate(ops_to_evolve):
|
131
|
+
self.atomic_evolution(single_rep, op, coeff)
|
132
|
+
if self.insert_barriers and i != len(ops_to_evolve) - 1:
|
133
|
+
single_rep.barrier()
|
180
134
|
|
181
|
-
return
|
135
|
+
return single_rep.repeat(self.reps, insert_barriers=self.insert_barriers).decompose()
|
182
136
|
|
183
137
|
@staticmethod
|
184
|
-
def _recurse(order,
|
138
|
+
def _recurse(order, time, pauli_list):
|
185
139
|
if order == 1:
|
186
|
-
return
|
140
|
+
return pauli_list
|
187
141
|
|
188
142
|
elif order == 2:
|
189
|
-
halves = [
|
190
|
-
|
191
|
-
for paulis in grouped_paulis[:-1]
|
192
|
-
]
|
193
|
-
full = [grouped_paulis[-1]]
|
143
|
+
halves = [(op, coeff * time / 2) for op, coeff in pauli_list[:-1]]
|
144
|
+
full = [(pauli_list[-1][0], time * pauli_list[-1][1])]
|
194
145
|
return halves + full + list(reversed(halves))
|
195
146
|
|
196
147
|
else:
|
197
148
|
reduction = 1 / (4 - 4 ** (1 / (order - 1)))
|
198
149
|
outer = 2 * SuzukiTrotter._recurse(
|
199
|
-
order - 2,
|
200
|
-
[
|
201
|
-
[(label, qubits, coeff * reduction) for label, qubits, coeff in paulis]
|
202
|
-
for paulis in grouped_paulis
|
203
|
-
],
|
150
|
+
order - 2, time=reduction * time, pauli_list=pauli_list
|
204
151
|
)
|
205
152
|
inner = SuzukiTrotter._recurse(
|
206
|
-
order - 2,
|
207
|
-
[
|
208
|
-
[
|
209
|
-
(label, qubits, coeff * (1 - 4 * reduction))
|
210
|
-
for label, qubits, coeff in paulis
|
211
|
-
]
|
212
|
-
for paulis in grouped_paulis
|
213
|
-
],
|
153
|
+
order - 2, time=(1 - 4 * reduction) * time, pauli_list=pauli_list
|
214
154
|
)
|
215
155
|
return outer + inner + outer
|
@@ -14,7 +14,6 @@ Circuit synthesis for a QFT circuit.
|
|
14
14
|
"""
|
15
15
|
|
16
16
|
from __future__ import annotations
|
17
|
-
import warnings
|
18
17
|
import numpy as np
|
19
18
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
20
19
|
|
@@ -55,7 +54,7 @@ def synth_qft_full(
|
|
55
54
|
A circuit implementing the QFT operation.
|
56
55
|
|
57
56
|
"""
|
58
|
-
|
57
|
+
|
59
58
|
circuit = QuantumCircuit(num_qubits, name=name)
|
60
59
|
|
61
60
|
for j in reversed(range(num_qubits)):
|
@@ -78,20 +77,3 @@ def synth_qft_full(
|
|
78
77
|
circuit = circuit.inverse()
|
79
78
|
|
80
79
|
return circuit
|
81
|
-
|
82
|
-
|
83
|
-
def _warn_if_precision_loss(max_num_entanglements):
|
84
|
-
"""Issue a warning if constructing the circuit will lose precision.
|
85
|
-
|
86
|
-
If we need an angle smaller than ``pi * 2**-1022``, we start to lose precision by going into
|
87
|
-
the subnormal numbers. We won't lose _all_ precision until an exponent of about 1075, but
|
88
|
-
beyond 1022 we're using fractional bits to represent leading zeros.
|
89
|
-
"""
|
90
|
-
if max_num_entanglements > -np.finfo(float).minexp: # > 1022 for doubles.
|
91
|
-
warnings.warn(
|
92
|
-
"precision loss in QFT."
|
93
|
-
f" The rotation needed to represent {max_num_entanglements} entanglements"
|
94
|
-
" is smaller than the smallest normal floating-point number.",
|
95
|
-
category=RuntimeWarning,
|
96
|
-
stacklevel=4,
|
97
|
-
)
|
@@ -16,7 +16,6 @@ Circuit synthesis for a QFT circuit.
|
|
16
16
|
import numpy as np
|
17
17
|
from qiskit.circuit import QuantumCircuit
|
18
18
|
from qiskit.synthesis.permutation.permutation_reverse_lnn import _append_reverse_permutation_lnn_kms
|
19
|
-
from .qft_decompose_full import _warn_if_precision_loss
|
20
19
|
|
21
20
|
|
22
21
|
def synth_qft_line(
|
@@ -52,7 +51,7 @@ def synth_qft_line(
|
|
52
51
|
Quantum Info. Comput. 4, 4 (July 2004), 237–251.
|
53
52
|
`arXiv:quant-ph/0402196 [quant-ph] <https://arxiv.org/abs/quant-ph/0402196>`_
|
54
53
|
"""
|
55
|
-
|
54
|
+
|
56
55
|
qc = QuantumCircuit(num_qubits)
|
57
56
|
|
58
57
|
for i in range(num_qubits):
|
@@ -46,8 +46,7 @@ def synth_stabilizer_layers(
|
|
46
46
|
|
47
47
|
For example, a 5-qubit stabilizer state is decomposed into the following layers:
|
48
48
|
|
49
|
-
..
|
50
|
-
|
49
|
+
.. parsed-literal::
|
51
50
|
┌─────┐┌─────┐┌─────┐┌─────┐┌────────┐
|
52
51
|
q_0: ┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├
|
53
52
|
│ ││ ││ ││ ││ │
|
@@ -24,6 +24,8 @@ Gambetta, J. M. Validating quantum computers using randomized model circuits.
|
|
24
24
|
arXiv:1811.12926 [quant-ph] (2018).
|
25
25
|
"""
|
26
26
|
from __future__ import annotations
|
27
|
+
import cmath
|
28
|
+
import math
|
27
29
|
import io
|
28
30
|
import base64
|
29
31
|
import warnings
|
@@ -89,18 +91,41 @@ def decompose_two_qubit_product_gate(special_unitary_matrix: np.ndarray):
|
|
89
91
|
QiskitError: if decomposition isn't possible.
|
90
92
|
"""
|
91
93
|
special_unitary_matrix = np.asarray(special_unitary_matrix, dtype=complex)
|
92
|
-
|
94
|
+
# extract the right component
|
95
|
+
R = special_unitary_matrix[:2, :2].copy()
|
96
|
+
detR = R[0, 0] * R[1, 1] - R[0, 1] * R[1, 0]
|
97
|
+
if abs(detR) < 0.1:
|
98
|
+
R = special_unitary_matrix[2:, :2].copy()
|
99
|
+
detR = R[0, 0] * R[1, 1] - R[0, 1] * R[1, 0]
|
100
|
+
if abs(detR) < 0.1:
|
101
|
+
raise QiskitError("decompose_two_qubit_product_gate: unable to decompose: detR < 0.1")
|
102
|
+
R /= np.sqrt(detR)
|
103
|
+
|
104
|
+
# extract the left component
|
105
|
+
temp = np.kron(np.eye(2), R.T.conj())
|
106
|
+
temp = special_unitary_matrix.dot(temp)
|
107
|
+
L = temp[::2, ::2]
|
108
|
+
detL = L[0, 0] * L[1, 1] - L[0, 1] * L[1, 0]
|
109
|
+
if abs(detL) < 0.9:
|
110
|
+
raise QiskitError("decompose_two_qubit_product_gate: unable to decompose: detL < 0.9")
|
111
|
+
L /= np.sqrt(detL)
|
112
|
+
phase = cmath.phase(detL) / 2
|
93
113
|
|
94
114
|
temp = np.kron(L, R)
|
95
115
|
deviation = abs(abs(temp.conj().T.dot(special_unitary_matrix).trace()) - 4)
|
96
|
-
|
97
116
|
if deviation > 1.0e-13:
|
98
117
|
raise QiskitError(
|
99
118
|
"decompose_two_qubit_product_gate: decomposition failed: "
|
100
119
|
f"deviation too large: {deviation}"
|
101
120
|
)
|
102
121
|
|
103
|
-
return
|
122
|
+
return L, R, phase
|
123
|
+
|
124
|
+
|
125
|
+
_ipx = np.array([[0, 1j], [1j, 0]], dtype=complex)
|
126
|
+
_ipy = np.array([[0, 1], [-1, 0]], dtype=complex)
|
127
|
+
_ipz = np.array([[1j, 0], [0, -1j]], dtype=complex)
|
128
|
+
_id = np.array([[1, 0], [0, 1]], dtype=complex)
|
104
129
|
|
105
130
|
|
106
131
|
class TwoQubitWeylDecomposition:
|
@@ -214,7 +239,7 @@ class TwoQubitWeylDecomposition:
|
|
214
239
|
"""Calculates the actual fidelity of the decomposed circuit to the input unitary."""
|
215
240
|
circ = self.circuit(**kwargs)
|
216
241
|
trace = np.trace(Operator(circ).data.T.conj() @ self.unitary_matrix)
|
217
|
-
return
|
242
|
+
return trace_to_fid(trace)
|
218
243
|
|
219
244
|
def __repr__(self):
|
220
245
|
"""Represent with enough precision to allow copy-paste debugging of all corner cases"""
|
@@ -435,6 +460,40 @@ class TwoQubitControlledUDecomposer:
|
|
435
460
|
return circ
|
436
461
|
|
437
462
|
|
463
|
+
def Ud(a, b, c):
|
464
|
+
r"""Generates the array :math:`e^{(i a XX + i b YY + i c ZZ)}`"""
|
465
|
+
return np.array(
|
466
|
+
[
|
467
|
+
[cmath.exp(1j * c) * math.cos(a - b), 0, 0, 1j * cmath.exp(1j * c) * math.sin(a - b)],
|
468
|
+
[0, cmath.exp(-1j * c) * math.cos(a + b), 1j * cmath.exp(-1j * c) * math.sin(a + b), 0],
|
469
|
+
[0, 1j * cmath.exp(-1j * c) * math.sin(a + b), cmath.exp(-1j * c) * math.cos(a + b), 0],
|
470
|
+
[1j * cmath.exp(1j * c) * math.sin(a - b), 0, 0, cmath.exp(1j * c) * math.cos(a - b)],
|
471
|
+
],
|
472
|
+
dtype=complex,
|
473
|
+
)
|
474
|
+
|
475
|
+
|
476
|
+
def trace_to_fid(trace):
|
477
|
+
r"""Average gate fidelity is
|
478
|
+
|
479
|
+
.. math::
|
480
|
+
|
481
|
+
\bar{F} = \frac{d + |\mathrm{Tr} (U_\text{target} \cdot U^{\dag})|^2}{d(d+1)}
|
482
|
+
|
483
|
+
M. Horodecki, P. Horodecki and R. Horodecki, PRA 60, 1888 (1999)"""
|
484
|
+
return (4 + abs(trace) ** 2) / 20
|
485
|
+
|
486
|
+
|
487
|
+
def rz_array(theta):
|
488
|
+
"""Return numpy array for Rz(theta).
|
489
|
+
|
490
|
+
Rz(theta) = diag(exp(-i*theta/2),exp(i*theta/2))
|
491
|
+
"""
|
492
|
+
return np.array(
|
493
|
+
[[cmath.exp(-1j * theta / 2.0), 0], [0, cmath.exp(1j * theta / 2.0)]], dtype=complex
|
494
|
+
)
|
495
|
+
|
496
|
+
|
438
497
|
class TwoQubitBasisDecomposer:
|
439
498
|
"""A class for decomposing 2-qubit unitaries into minimal number of uses of a 2-qubit
|
440
499
|
basis gate.
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2019.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
# pylint: disable=invalid-name
|
13
|
+
|
14
|
+
"""Routines that compute and use the Weyl chamber coordinates.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
import numpy as np
|
19
|
+
|
20
|
+
# "Magic" basis used for the Weyl decomposition. The basis and its adjoint are stored individually
|
21
|
+
# unnormalized, but such that their matrix multiplication is still the identity. This is because
|
22
|
+
# they are only used in unitary transformations (so it's safe to do so), and `sqrt(0.5)` is not
|
23
|
+
# exactly representable in floating point. Doing it this way means that every element of the matrix
|
24
|
+
# is stored exactly correctly, and the multiplication is _exactly_ the identity rather than
|
25
|
+
# differing by 1ULP.
|
26
|
+
_B_nonnormalized = np.array([[1, 1j, 0, 0], [0, 0, 1j, 1], [0, 0, 1j, -1], [1, -1j, 0, 0]])
|
27
|
+
_B_nonnormalized_dagger = 0.5 * _B_nonnormalized.conj().T
|
28
|
+
|
29
|
+
|
30
|
+
def transform_to_magic_basis(U: np.ndarray, reverse: bool = False) -> np.ndarray:
|
31
|
+
"""Transform the 4-by-4 matrix ``U`` into the magic basis.
|
32
|
+
|
33
|
+
This method internally uses non-normalized versions of the basis to minimize the floating-point
|
34
|
+
errors that arise during the transformation.
|
35
|
+
|
36
|
+
Args:
|
37
|
+
U (np.ndarray): 4-by-4 matrix to transform.
|
38
|
+
reverse (bool): Whether to do the transformation forwards (``B @ U @ B.conj().T``, the
|
39
|
+
default) or backwards (``B.conj().T @ U @ B``).
|
40
|
+
|
41
|
+
Returns:
|
42
|
+
np.ndarray: The transformed 4-by-4 matrix.
|
43
|
+
"""
|
44
|
+
if reverse:
|
45
|
+
return _B_nonnormalized_dagger @ U @ _B_nonnormalized
|
46
|
+
return _B_nonnormalized @ U @ _B_nonnormalized_dagger
|
47
|
+
|
48
|
+
|
49
|
+
def weyl_coordinates(U: np.ndarray) -> np.ndarray:
|
50
|
+
"""Computes the Weyl coordinates for a given two-qubit unitary matrix.
|
51
|
+
|
52
|
+
Args:
|
53
|
+
U (np.ndarray): Input two-qubit unitary.
|
54
|
+
|
55
|
+
Returns:
|
56
|
+
np.ndarray: Array of the 3 Weyl coordinates.
|
57
|
+
"""
|
58
|
+
import scipy.linalg as la
|
59
|
+
|
60
|
+
pi2 = np.pi / 2
|
61
|
+
pi4 = np.pi / 4
|
62
|
+
|
63
|
+
U = U / la.det(U) ** (0.25)
|
64
|
+
Up = transform_to_magic_basis(U, reverse=True)
|
65
|
+
# We only need the eigenvalues of `M2 = Up.T @ Up` here, not the full diagonalization.
|
66
|
+
D = la.eigvals(Up.T @ Up)
|
67
|
+
d = -np.angle(D) / 2
|
68
|
+
d[3] = -d[0] - d[1] - d[2]
|
69
|
+
cs = np.mod((d[:3] + d[3]) / 2, 2 * np.pi)
|
70
|
+
|
71
|
+
# Reorder the eigenvalues to get in the Weyl chamber
|
72
|
+
cstemp = np.mod(cs, pi2)
|
73
|
+
np.minimum(cstemp, pi2 - cstemp, cstemp)
|
74
|
+
order = np.argsort(cstemp)[[1, 2, 0]]
|
75
|
+
cs = cs[order]
|
76
|
+
d[:3] = d[order]
|
77
|
+
|
78
|
+
# Flip into Weyl chamber
|
79
|
+
if cs[0] > pi2:
|
80
|
+
cs[0] -= 3 * pi2
|
81
|
+
if cs[1] > pi2:
|
82
|
+
cs[1] -= 3 * pi2
|
83
|
+
conjs = 0
|
84
|
+
if cs[0] > pi4:
|
85
|
+
cs[0] = pi2 - cs[0]
|
86
|
+
conjs += 1
|
87
|
+
if cs[1] > pi4:
|
88
|
+
cs[1] = pi2 - cs[1]
|
89
|
+
conjs += 1
|
90
|
+
if cs[2] > pi2:
|
91
|
+
cs[2] -= 3 * pi2
|
92
|
+
if conjs == 1:
|
93
|
+
cs[2] = pi2 - cs[2]
|
94
|
+
if cs[2] > pi4:
|
95
|
+
cs[2] -= pi2
|
96
|
+
|
97
|
+
return cs[[1, 0, 2]]
|
qiskit/synthesis/unitary/qsd.py
CHANGED
@@ -47,8 +47,7 @@ def qs_decomposition(
|
|
47
47
|
|
48
48
|
This decomposition is described in Shende et al. [1].
|
49
49
|
|
50
|
-
..
|
51
|
-
|
50
|
+
.. parsed-literal::
|
52
51
|
┌───┐ ┌───┐ ┌───┐ ┌───┐
|
53
52
|
─┤ ├─ ───────┤ Rz├─────┤ Ry├─────┤ Rz├─────
|
54
53
|
│ │ ≃ ┌───┐└─┬─┘┌───┐└─┬─┘┌───┐└─┬─┘┌───┐
|
@@ -251,13 +250,14 @@ def _get_ucry_cz(nqubits, angles):
|
|
251
250
|
|
252
251
|
|
253
252
|
def _apply_a2(circ):
|
253
|
+
from qiskit.compiler import transpile
|
254
254
|
from qiskit.quantum_info import Operator
|
255
255
|
from qiskit.circuit.library.generalized_gates.unitary import UnitaryGate
|
256
|
-
from qiskit.transpiler.passes.synthesis import HighLevelSynthesis
|
257
256
|
|
258
257
|
decomposer = two_qubit_decompose_up_to_diagonal
|
259
|
-
|
260
|
-
|
258
|
+
ccirc = transpile(
|
259
|
+
circ, basis_gates=["u", "cx", "qsd2q"], optimization_level=0, qubits_initially_zero=False
|
260
|
+
)
|
261
261
|
ind2q = []
|
262
262
|
# collect 2q instrs
|
263
263
|
for i, instruction in enumerate(ccirc.data):
|