qiskit 1.1.2__cp38-abi3-win32.whl → 1.2.0rc1__cp38-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 +27 -24
- qiskit/_accelerate.pyd +0 -0
- qiskit/_numpy_compat.py +1 -1
- qiskit/assembler/assemble_circuits.py +107 -64
- qiskit/assembler/assemble_schedules.py +5 -12
- qiskit/assembler/disassemble.py +10 -1
- qiskit/circuit/__init__.py +1 -1
- qiskit/circuit/_classical_resource_map.py +5 -5
- qiskit/circuit/_utils.py +0 -13
- qiskit/circuit/add_control.py +1 -1
- qiskit/circuit/annotated_operation.py +23 -1
- qiskit/circuit/classical/expr/expr.py +4 -4
- qiskit/circuit/classical/expr/visitors.py +1 -1
- qiskit/circuit/classical/types/__init__.py +1 -1
- qiskit/circuit/classical/types/types.py +2 -2
- qiskit/circuit/classicalfunction/boolean_expression.py +1 -1
- qiskit/circuit/classicalfunction/classical_function_visitor.py +5 -5
- qiskit/circuit/classicalfunction/utils.py +1 -1
- qiskit/circuit/classicalregister.py +1 -1
- qiskit/circuit/commutation_checker.py +83 -35
- qiskit/circuit/controlflow/_builder_utils.py +1 -1
- qiskit/circuit/controlflow/builder.py +10 -6
- qiskit/circuit/controlflow/if_else.py +2 -2
- qiskit/circuit/controlflow/switch_case.py +1 -1
- qiskit/circuit/delay.py +1 -1
- qiskit/circuit/duration.py +2 -2
- qiskit/circuit/equivalence.py +5 -7
- qiskit/circuit/gate.py +11 -8
- qiskit/circuit/instruction.py +31 -13
- qiskit/circuit/instructionset.py +2 -5
- qiskit/circuit/library/__init__.py +2 -1
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +1 -1
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +3 -3
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +1 -1
- qiskit/circuit/library/basis_change/__init__.py +1 -1
- qiskit/circuit/library/basis_change/qft.py +40 -6
- qiskit/circuit/library/blueprintcircuit.py +3 -5
- qiskit/circuit/library/data_preparation/__init__.py +9 -2
- qiskit/circuit/library/data_preparation/initializer.py +8 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +98 -178
- qiskit/circuit/library/generalized_gates/isometry.py +8 -8
- qiskit/circuit/library/generalized_gates/linear_function.py +3 -2
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +4 -4
- qiskit/circuit/library/generalized_gates/permutation.py +8 -9
- qiskit/circuit/library/generalized_gates/uc.py +3 -3
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +2 -2
- qiskit/circuit/library/generalized_gates/unitary.py +13 -11
- qiskit/circuit/library/graph_state.py +1 -1
- qiskit/circuit/library/hamiltonian_gate.py +1 -2
- qiskit/circuit/library/hidden_linear_function.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +3 -2
- qiskit/circuit/library/n_local/n_local.py +4 -5
- qiskit/circuit/library/n_local/pauli_two_design.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +6 -8
- qiskit/circuit/library/n_local/two_local.py +1 -1
- qiskit/circuit/library/overlap.py +11 -5
- qiskit/circuit/library/pauli_evolution.py +7 -3
- qiskit/circuit/library/standard_gates/dcx.py +3 -0
- qiskit/circuit/library/standard_gates/ecr.py +3 -0
- qiskit/circuit/library/standard_gates/global_phase.py +3 -0
- qiskit/circuit/library/standard_gates/h.py +13 -5
- qiskit/circuit/library/standard_gates/i.py +3 -0
- qiskit/circuit/library/standard_gates/iswap.py +3 -0
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +19 -10
- qiskit/circuit/library/standard_gates/p.py +14 -9
- qiskit/circuit/library/standard_gates/r.py +3 -0
- qiskit/circuit/library/standard_gates/rx.py +21 -6
- qiskit/circuit/library/standard_gates/rxx.py +40 -1
- qiskit/circuit/library/standard_gates/ry.py +21 -6
- qiskit/circuit/library/standard_gates/ryy.py +40 -1
- qiskit/circuit/library/standard_gates/rz.py +22 -6
- qiskit/circuit/library/standard_gates/rzx.py +40 -1
- qiskit/circuit/library/standard_gates/rzz.py +41 -2
- qiskit/circuit/library/standard_gates/s.py +77 -0
- qiskit/circuit/library/standard_gates/swap.py +12 -5
- qiskit/circuit/library/standard_gates/sx.py +14 -5
- qiskit/circuit/library/standard_gates/t.py +5 -0
- qiskit/circuit/library/standard_gates/u.py +22 -7
- qiskit/circuit/library/standard_gates/u1.py +8 -3
- qiskit/circuit/library/standard_gates/u2.py +3 -0
- qiskit/circuit/library/standard_gates/u3.py +22 -7
- qiskit/circuit/library/standard_gates/x.py +156 -92
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +40 -1
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +52 -11
- qiskit/circuit/library/standard_gates/y.py +6 -1
- qiskit/circuit/library/standard_gates/z.py +8 -1
- qiskit/circuit/operation.py +1 -1
- qiskit/circuit/parameter.py +9 -10
- qiskit/circuit/parameterexpression.py +16 -13
- qiskit/circuit/parametertable.py +1 -190
- qiskit/circuit/parametervector.py +1 -1
- qiskit/circuit/quantumcircuit.py +392 -384
- qiskit/circuit/quantumcircuitdata.py +3 -5
- qiskit/circuit/quantumregister.py +1 -1
- qiskit/circuit/random/__init__.py +1 -1
- qiskit/circuit/random/utils.py +175 -26
- qiskit/circuit/register.py +5 -7
- qiskit/circuit/singleton.py +3 -3
- qiskit/circuit/tools/pi_check.py +4 -4
- qiskit/compiler/assembler.py +95 -24
- qiskit/compiler/scheduler.py +2 -2
- qiskit/compiler/transpiler.py +41 -127
- qiskit/converters/circuit_to_dag.py +4 -6
- qiskit/converters/circuit_to_gate.py +4 -8
- qiskit/converters/circuit_to_instruction.py +5 -17
- qiskit/converters/dag_to_circuit.py +2 -6
- qiskit/dagcircuit/collect_blocks.py +2 -2
- qiskit/dagcircuit/dagcircuit.py +190 -187
- qiskit/dagcircuit/dagdependency.py +4 -4
- qiskit/dagcircuit/dagdependency_v2.py +4 -4
- qiskit/dagcircuit/dagdepnode.py +1 -1
- qiskit/dagcircuit/dagnode.py +66 -157
- qiskit/passmanager/flow_controllers.py +1 -1
- qiskit/passmanager/passmanager.py +3 -3
- qiskit/primitives/__init__.py +1 -5
- qiskit/primitives/backend_estimator.py +25 -15
- qiskit/primitives/backend_estimator_v2.py +31 -7
- qiskit/primitives/backend_sampler.py +21 -12
- qiskit/primitives/backend_sampler_v2.py +12 -3
- qiskit/primitives/base/base_estimator.py +31 -4
- qiskit/primitives/base/base_primitive.py +2 -2
- qiskit/primitives/base/base_result.py +2 -2
- qiskit/primitives/base/base_sampler.py +26 -2
- qiskit/primitives/base/estimator_result.py +2 -2
- qiskit/primitives/base/sampler_result.py +2 -2
- qiskit/primitives/containers/__init__.py +0 -1
- qiskit/primitives/containers/bindings_array.py +2 -2
- qiskit/primitives/containers/bit_array.py +108 -10
- qiskit/primitives/containers/shape.py +3 -3
- qiskit/primitives/estimator.py +9 -2
- qiskit/primitives/primitive_job.py +1 -1
- qiskit/primitives/sampler.py +10 -3
- qiskit/primitives/statevector_estimator.py +5 -3
- qiskit/primitives/statevector_sampler.py +11 -5
- qiskit/primitives/utils.py +16 -0
- qiskit/providers/backend.py +15 -6
- qiskit/providers/backend_compat.py +7 -4
- qiskit/providers/basic_provider/basic_provider_tools.py +1 -1
- qiskit/providers/basic_provider/basic_simulator.py +32 -24
- qiskit/providers/fake_provider/fake_backend.py +10 -3
- qiskit/providers/fake_provider/fake_openpulse_2q.py +154 -146
- qiskit/providers/fake_provider/fake_openpulse_3q.py +226 -217
- qiskit/providers/fake_provider/fake_qasm_backend.py +5 -1
- qiskit/providers/fake_provider/generic_backend_v2.py +80 -50
- qiskit/providers/models/__init__.py +11 -0
- qiskit/providers/models/backendconfiguration.py +50 -4
- qiskit/providers/models/backendproperties.py +13 -2
- qiskit/providers/models/pulsedefaults.py +10 -11
- qiskit/providers/options.py +13 -13
- qiskit/providers/providerutils.py +3 -1
- qiskit/pulse/configuration.py +8 -12
- qiskit/pulse/instruction_schedule_map.py +3 -5
- qiskit/pulse/instructions/acquire.py +7 -8
- qiskit/pulse/instructions/instruction.py +2 -3
- qiskit/pulse/library/samplers/decorators.py +5 -9
- qiskit/pulse/library/symbolic_pulses.py +4 -7
- qiskit/pulse/library/waveform.py +2 -5
- qiskit/pulse/macros.py +11 -6
- qiskit/pulse/parser.py +8 -10
- qiskit/pulse/schedule.py +9 -17
- qiskit/pulse/transforms/alignments.py +1 -3
- qiskit/pulse/utils.py +1 -2
- qiskit/qasm/libs/stdgates.inc +35 -28
- qiskit/qasm2/__init__.py +7 -7
- qiskit/qasm2/export.py +5 -9
- qiskit/qasm2/parse.py +1 -1
- qiskit/qasm3/ast.py +9 -25
- qiskit/qasm3/exporter.py +578 -481
- qiskit/qasm3/printer.py +7 -16
- qiskit/qobj/common.py +10 -0
- qiskit/qobj/converters/lo_config.py +9 -0
- qiskit/qobj/converters/pulse_instruction.py +13 -6
- qiskit/qobj/pulse_qobj.py +69 -15
- qiskit/qobj/qasm_qobj.py +72 -20
- qiskit/qobj/utils.py +9 -0
- qiskit/qpy/binary_io/circuits.py +8 -5
- qiskit/qpy/binary_io/schedules.py +1 -1
- qiskit/qpy/binary_io/value.py +3 -3
- qiskit/qpy/interface.py +3 -2
- qiskit/qpy/type_keys.py +2 -2
- qiskit/quantum_info/operators/channel/quantum_channel.py +3 -6
- qiskit/quantum_info/operators/channel/superop.py +2 -2
- qiskit/quantum_info/operators/channel/transformations.py +1 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -4
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +1 -3
- qiskit/quantum_info/operators/dihedral/random.py +6 -3
- qiskit/quantum_info/operators/measures.py +2 -2
- qiskit/quantum_info/operators/op_shape.py +12 -20
- qiskit/quantum_info/operators/operator.py +14 -21
- qiskit/quantum_info/operators/predicates.py +1 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +7 -11
- qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +3 -3
- qiskit/quantum_info/operators/symplectic/pauli_list.py +9 -10
- qiskit/quantum_info/operators/symplectic/random.py +1 -1
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +14 -16
- qiskit/quantum_info/quaternion.py +1 -1
- qiskit/quantum_info/states/densitymatrix.py +5 -8
- qiskit/quantum_info/states/stabilizerstate.py +128 -37
- qiskit/quantum_info/states/statevector.py +4 -8
- qiskit/result/counts.py +2 -2
- qiskit/result/mitigation/correlated_readout_mitigator.py +2 -2
- qiskit/result/mitigation/local_readout_mitigator.py +2 -2
- qiskit/result/mitigation/utils.py +1 -3
- qiskit/result/models.py +17 -16
- qiskit/result/result.py +15 -20
- qiskit/scheduler/lowering.py +2 -2
- qiskit/synthesis/__init__.py +2 -1
- qiskit/synthesis/clifford/__init__.py +1 -1
- qiskit/synthesis/clifford/clifford_decompose_ag.py +2 -2
- qiskit/synthesis/clifford/clifford_decompose_bm.py +10 -240
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +9 -303
- qiskit/synthesis/clifford/clifford_decompose_layers.py +25 -23
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +1 -1
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +1 -1
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +1 -1
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +2 -2
- qiskit/synthesis/evolution/evolution_synthesis.py +4 -2
- qiskit/synthesis/evolution/lie_trotter.py +46 -19
- qiskit/synthesis/evolution/product_formula.py +111 -55
- qiskit/synthesis/evolution/qdrift.py +40 -10
- qiskit/synthesis/evolution/suzuki_trotter.py +43 -33
- qiskit/synthesis/linear/__init__.py +1 -0
- qiskit/synthesis/linear/cnot_synth.py +22 -96
- qiskit/synthesis/linear/linear_depth_lnn.py +8 -8
- qiskit/synthesis/linear/linear_matrix_utils.py +13 -161
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +1 -1
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +3 -3
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +1 -1
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +29 -29
- qiskit/synthesis/permutation/permutation_full.py +5 -29
- qiskit/synthesis/permutation/permutation_lnn.py +2 -24
- qiskit/synthesis/permutation/permutation_utils.py +2 -59
- qiskit/synthesis/qft/__init__.py +1 -0
- qiskit/synthesis/qft/qft_decompose_full.py +79 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +17 -9
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +6 -6
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -2
- qiskit/synthesis/two_qubit/local_invariance.py +8 -38
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +48 -129
- qiskit/synthesis/unitary/aqc/cnot_structures.py +1 -1
- qiskit/synthesis/unitary/qsd.py +5 -3
- qiskit/transpiler/__init__.py +1 -0
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/coupling.py +3 -3
- qiskit/transpiler/instruction_durations.py +1 -2
- qiskit/transpiler/layout.py +3 -3
- qiskit/transpiler/passes/__init__.py +2 -0
- qiskit/transpiler/passes/basis/basis_translator.py +82 -63
- qiskit/transpiler/passes/basis/translate_parameterized.py +3 -5
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +10 -10
- qiskit/transpiler/passes/calibration/rx_builder.py +3 -3
- qiskit/transpiler/passes/calibration/rzx_builder.py +3 -3
- qiskit/transpiler/passes/layout/apply_layout.py +13 -3
- qiskit/transpiler/passes/layout/sabre_layout.py +10 -8
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +4 -1
- qiskit/transpiler/passes/layout/set_layout.py +2 -2
- qiskit/transpiler/passes/layout/vf2_layout.py +1 -1
- qiskit/transpiler/passes/layout/vf2_utils.py +3 -3
- qiskit/transpiler/passes/optimization/__init__.py +1 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
- qiskit/transpiler/passes/optimization/commutation_analysis.py +7 -10
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +35 -19
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +11 -8
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +6 -6
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +64 -41
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +83 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +1 -1
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +2 -2
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -2
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
- qiskit/transpiler/passes/routing/layout_transformation.py +2 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +35 -26
- qiskit/transpiler/passes/routing/star_prerouting.py +80 -105
- qiskit/transpiler/passes/routing/stochastic_swap.py +1 -3
- qiskit/transpiler/passes/scheduling/alap.py +1 -2
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +1 -1
- qiskit/transpiler/passes/scheduling/asap.py +1 -2
- qiskit/transpiler/passes/scheduling/base_scheduler.py +5 -5
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +3 -3
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +11 -11
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +7 -6
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -3
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +211 -36
- qiskit/transpiler/passes/synthesis/plugin.py +2 -2
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +80 -40
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +4 -4
- qiskit/transpiler/passes/utils/check_map.py +3 -6
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +3 -4
- qiskit/transpiler/passes/utils/error.py +2 -2
- qiskit/transpiler/passes/utils/fixed_point.py +3 -3
- qiskit/transpiler/passes/utils/gate_direction.py +1 -1
- qiskit/transpiler/passes/utils/gates_basis.py +1 -2
- qiskit/transpiler/passmanager.py +7 -6
- qiskit/transpiler/preset_passmanagers/__init__.py +4 -228
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +117 -18
- qiskit/transpiler/preset_passmanagers/common.py +3 -6
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +518 -0
- qiskit/transpiler/preset_passmanagers/level0.py +1 -1
- qiskit/transpiler/target.py +27 -8
- qiskit/user_config.py +29 -6
- qiskit/utils/classtools.py +3 -3
- qiskit/utils/deprecation.py +3 -2
- qiskit/utils/lazy_tester.py +2 -2
- qiskit/utils/optionals.py +8 -8
- qiskit/visualization/bloch.py +19 -67
- qiskit/visualization/circuit/_utils.py +34 -10
- qiskit/visualization/circuit/circuit_visualization.py +23 -16
- qiskit/visualization/circuit/latex.py +29 -27
- qiskit/visualization/circuit/matplotlib.py +4 -2
- qiskit/visualization/circuit/qcstyle.py +2 -2
- qiskit/visualization/circuit/text.py +9 -15
- qiskit/visualization/dag_visualization.py +5 -12
- qiskit/visualization/pulse_v2/core.py +1 -1
- qiskit/visualization/pulse_v2/events.py +1 -1
- qiskit/visualization/pulse_v2/generators/frame.py +3 -4
- qiskit/visualization/pulse_v2/generators/waveform.py +5 -9
- qiskit/visualization/pulse_v2/layouts.py +1 -5
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +1 -2
- qiskit/visualization/state_visualization.py +5 -6
- qiskit/visualization/timeline/plotters/matplotlib.py +1 -2
- qiskit/visualization/transition_visualization.py +7 -2
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/METADATA +26 -26
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/RECORD +340 -338
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/WHEEL +1 -1
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/entry_points.txt +3 -0
- qiskit/transpiler/passes/utils/block_to_matrix.py +0 -47
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/top_level.txt +0 -0
@@ -355,8 +355,8 @@ class SuperOp(QuantumChannel):
|
|
355
355
|
raise QiskitError(f"Cannot apply Instruction: {obj.name}")
|
356
356
|
if not isinstance(obj.definition, QuantumCircuit):
|
357
357
|
raise QiskitError(
|
358
|
-
"{} instruction definition is {}; "
|
359
|
-
"expected QuantumCircuit"
|
358
|
+
f"{obj.name} instruction definition is {type(obj.definition)}; "
|
359
|
+
"expected QuantumCircuit"
|
360
360
|
)
|
361
361
|
qubit_indices = {bit: idx for idx, bit in enumerate(obj.definition.qubits)}
|
362
362
|
for instruction in obj.definition.data:
|
@@ -228,7 +228,7 @@ def _choi_to_kraus(data, input_dim, output_dim, atol=ATOL_DEFAULT):
|
|
228
228
|
# This should be a call to la.eigh, but there is an OpenBlas
|
229
229
|
# threading issue that is causing segfaults.
|
230
230
|
# Need schur here since la.eig does not
|
231
|
-
#
|
231
|
+
# guarantee orthogonality in degenerate subspaces
|
232
232
|
w, v = la.schur(data, output="complex")
|
233
233
|
w = w.diagonal().real
|
234
234
|
# Check eigenvalues are non-negative
|
@@ -97,7 +97,7 @@ class CNOTDihedral(BaseOperator, AdjointMixin):
|
|
97
97
|
with optimal number of two qubit gates*, `Quantum 4(369), 2020
|
98
98
|
<https://quantum-journal.org/papers/q-2020-12-07-369/>`_
|
99
99
|
2. Andrew W. Cross, Easwar Magesan, Lev S. Bishop, John A. Smolin and Jay M. Gambetta,
|
100
|
-
*Scalable
|
100
|
+
*Scalable randomized benchmarking of non-Clifford gates*,
|
101
101
|
npj Quantum Inf 2, 16012 (2016).
|
102
102
|
"""
|
103
103
|
|
@@ -325,7 +325,7 @@ class CNOTDihedral(BaseOperator, AdjointMixin):
|
|
325
325
|
with optimal number of two qubit gates*, `Quantum 4(369), 2020
|
326
326
|
<https://quantum-journal.org/papers/q-2020-12-07-369/>`_
|
327
327
|
2. Andrew W. Cross, Easwar Magesan, Lev S. Bishop, John A. Smolin and Jay M. Gambetta,
|
328
|
-
*Scalable
|
328
|
+
*Scalable randomized benchmarking of non-Clifford gates*,
|
329
329
|
npj Quantum Inf 2, 16012 (2016).
|
330
330
|
"""
|
331
331
|
# pylint: disable=cyclic-import
|
@@ -452,8 +452,7 @@ class CNOTDihedral(BaseOperator, AdjointMixin):
|
|
452
452
|
new_qubits = [bit_indices[tup] for tup in instruction.qubits]
|
453
453
|
if instruction.operation.name == "p":
|
454
454
|
params = 2 * np.pi - instruction.operation.params[0]
|
455
|
-
|
456
|
-
new_circ.append(instruction.operation, new_qubits)
|
455
|
+
new_circ.p(params, new_qubits)
|
457
456
|
elif instruction.operation.name == "t":
|
458
457
|
instruction.operation.name = "tdg"
|
459
458
|
new_circ.append(instruction.operation, new_qubits)
|
@@ -92,9 +92,7 @@ def _append_circuit(elem, circuit, qargs=None):
|
|
92
92
|
raise QiskitError(f"Cannot apply Instruction: {gate.name}")
|
93
93
|
if not isinstance(gate.definition, QuantumCircuit):
|
94
94
|
raise QiskitError(
|
95
|
-
"{} instruction definition is {}; expected QuantumCircuit"
|
96
|
-
gate.name, type(gate.definition)
|
97
|
-
)
|
95
|
+
f"{gate.name} instruction definition is {type(gate.definition)}; expected QuantumCircuit"
|
98
96
|
)
|
99
97
|
|
100
98
|
flat_instr = gate.definition
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# This code is part of Qiskit.
|
2
2
|
#
|
3
|
-
# (C) Copyright IBM 2019,
|
3
|
+
# (C) Copyright IBM 2019, 2024.
|
4
4
|
#
|
5
5
|
# This code is licensed under the Apache License, Version 2.0. You may
|
6
6
|
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
@@ -49,9 +49,12 @@ def random_cnotdihedral(num_qubits, seed=None):
|
|
49
49
|
|
50
50
|
# Random affine function
|
51
51
|
# Random invertible binary matrix
|
52
|
-
from qiskit.synthesis.linear import
|
52
|
+
from qiskit.synthesis.linear import ( # pylint: disable=cyclic-import
|
53
|
+
random_invertible_binary_matrix,
|
54
|
+
)
|
53
55
|
|
54
|
-
|
56
|
+
seed = rng.integers(100000, size=1, dtype=np.uint64)[0]
|
57
|
+
linear = random_invertible_binary_matrix(num_qubits, seed=seed).astype(int, copy=False)
|
55
58
|
elem.linear = linear
|
56
59
|
|
57
60
|
# Random shift
|
@@ -93,7 +93,7 @@ def process_fidelity(
|
|
93
93
|
if channel.dim != target.dim:
|
94
94
|
raise QiskitError(
|
95
95
|
"Input quantum channel and target unitary must have the same "
|
96
|
-
"dimensions ({} != {})."
|
96
|
+
f"dimensions ({channel.dim} != {target.dim})."
|
97
97
|
)
|
98
98
|
|
99
99
|
# Validate complete-positivity and trace-preserving
|
@@ -316,7 +316,7 @@ def diamond_norm(choi: Choi | QuantumChannel, solver: str = "SCS", **kwargs) ->
|
|
316
316
|
iden = sparse.eye(dim_out)
|
317
317
|
|
318
318
|
# Watrous uses row-vec convention for his Choi matrix while we use
|
319
|
-
# col-vec. It turns out row-vec convention is
|
319
|
+
# col-vec. It turns out row-vec convention is required for CVXPY too
|
320
320
|
# since the cvxpy.kron function must have a constant as its first argument.
|
321
321
|
c_r = cvxpy.bmat([[cvxpy.kron(iden, r0_r), x_r], [x_r.T, cvxpy.kron(iden, r1_r)]])
|
322
322
|
c_i = cvxpy.bmat([[cvxpy.kron(iden, r0_i), x_i], [-x_i.T, cvxpy.kron(iden, r1_i)]])
|
@@ -193,7 +193,7 @@ class OpShape:
|
|
193
193
|
if raise_exception:
|
194
194
|
raise QiskitError(
|
195
195
|
"Output dimensions do not match matrix shape "
|
196
|
-
"({
|
196
|
+
f"({reduce(mul, self._dims_l)} != {shape[0]})"
|
197
197
|
)
|
198
198
|
return False
|
199
199
|
elif shape[0] != 2**self._num_qargs_l:
|
@@ -207,7 +207,7 @@ class OpShape:
|
|
207
207
|
if raise_exception:
|
208
208
|
raise QiskitError(
|
209
209
|
"Input dimensions do not match matrix shape "
|
210
|
-
"({
|
210
|
+
f"({reduce(mul, self._dims_r)} != {shape[1]})"
|
211
211
|
)
|
212
212
|
return False
|
213
213
|
elif shape[1] != 2**self._num_qargs_r:
|
@@ -430,7 +430,7 @@ class OpShape:
|
|
430
430
|
if self._num_qargs_r != other._num_qargs_l or self._dims_r != other._dims_l:
|
431
431
|
raise QiskitError(
|
432
432
|
"Left and right compose dimensions don't match "
|
433
|
-
"({
|
433
|
+
f"({self.dims_r()} != {other.dims_l()})"
|
434
434
|
)
|
435
435
|
ret._dims_l = self._dims_l
|
436
436
|
ret._dims_r = other._dims_r
|
@@ -440,7 +440,7 @@ class OpShape:
|
|
440
440
|
if self._num_qargs_l != other._num_qargs_r or self._dims_l != other._dims_r:
|
441
441
|
raise QiskitError(
|
442
442
|
"Left and right compose dimensions don't match "
|
443
|
-
"({
|
443
|
+
f"({self.dims_l()} != {other.dims_r()})"
|
444
444
|
)
|
445
445
|
ret._dims_l = other._dims_l
|
446
446
|
ret._dims_r = self._dims_r
|
@@ -453,15 +453,13 @@ class OpShape:
|
|
453
453
|
ret._num_qargs_l = self._num_qargs_l
|
454
454
|
if len(qargs) != other._num_qargs_l:
|
455
455
|
raise QiskitError(
|
456
|
-
"Number of qargs does not match ({} != {})"
|
457
|
-
len(qargs), other._num_qargs_l
|
458
|
-
)
|
456
|
+
f"Number of qargs does not match ({len(qargs)} != {other._num_qargs_l})"
|
459
457
|
)
|
460
458
|
if self._dims_r or other._dims_r:
|
461
459
|
if self.dims_r(qargs) != other.dims_l():
|
462
460
|
raise QiskitError(
|
463
461
|
"Subsystem dimension do not match on specified qargs "
|
464
|
-
"{
|
462
|
+
f"{self.dims_r(qargs)} != {other.dims_l()}"
|
465
463
|
)
|
466
464
|
dims_r = list(self.dims_r())
|
467
465
|
for i, dim in zip(qargs, other.dims_r()):
|
@@ -475,15 +473,13 @@ class OpShape:
|
|
475
473
|
ret._num_qargs_r = self._num_qargs_r
|
476
474
|
if len(qargs) != other._num_qargs_r:
|
477
475
|
raise QiskitError(
|
478
|
-
"Number of qargs does not match ({} != {})"
|
479
|
-
len(qargs), other._num_qargs_r
|
480
|
-
)
|
476
|
+
f"Number of qargs does not match ({len(qargs)} != {other._num_qargs_r})"
|
481
477
|
)
|
482
478
|
if self._dims_l or other._dims_l:
|
483
479
|
if self.dims_l(qargs) != other.dims_r():
|
484
480
|
raise QiskitError(
|
485
481
|
"Subsystem dimension do not match on specified qargs "
|
486
|
-
"{
|
482
|
+
f"{self.dims_l(qargs)} != {other.dims_r()}"
|
487
483
|
)
|
488
484
|
dims_l = list(self.dims_l())
|
489
485
|
for i, dim in zip(qargs, other.dims_l()):
|
@@ -508,26 +504,22 @@ class OpShape:
|
|
508
504
|
if self.dims_l(qargs) != other.dims_l():
|
509
505
|
raise QiskitError(
|
510
506
|
"Cannot add shapes width different left "
|
511
|
-
"dimension on specified qargs {} != {}"
|
512
|
-
self.dims_l(qargs), other.dims_l()
|
513
|
-
)
|
507
|
+
f"dimension on specified qargs {self.dims_l(qargs)} != {other.dims_l()}"
|
514
508
|
)
|
515
509
|
if self.dims_r(qargs) != other.dims_r():
|
516
510
|
raise QiskitError(
|
517
511
|
"Cannot add shapes width different total right "
|
518
|
-
"dimension on specified qargs{} != {}"
|
519
|
-
self.dims_r(qargs), other.dims_r()
|
520
|
-
)
|
512
|
+
f"dimension on specified qargs{self.dims_r(qargs)} != {other.dims_r()}"
|
521
513
|
)
|
522
514
|
elif self != other:
|
523
515
|
if self._dim_l != other._dim_l:
|
524
516
|
raise QiskitError(
|
525
517
|
"Cannot add shapes width different total left "
|
526
|
-
"dimension {} != {
|
518
|
+
f"dimension {self._dim_l} != {other._dim_l}"
|
527
519
|
)
|
528
520
|
if self._dim_r != other._dim_r:
|
529
521
|
raise QiskitError(
|
530
522
|
"Cannot add shapes width different total right "
|
531
|
-
"dimension {} != {
|
523
|
+
f"dimension {self._dim_r} != {other._dim_r}"
|
532
524
|
)
|
533
525
|
return self
|
@@ -128,12 +128,9 @@ class Operator(LinearOp):
|
|
128
128
|
def __repr__(self):
|
129
129
|
prefix = "Operator("
|
130
130
|
pad = len(prefix) * " "
|
131
|
-
return
|
132
|
-
prefix,
|
133
|
-
|
134
|
-
pad,
|
135
|
-
self.input_dims(),
|
136
|
-
self.output_dims(),
|
131
|
+
return (
|
132
|
+
f"{prefix}{np.array2string(self.data, separator=', ', prefix=prefix)},\n"
|
133
|
+
f"{pad}input_dims={self.input_dims()}, output_dims={self.output_dims()})"
|
137
134
|
)
|
138
135
|
|
139
136
|
def __eq__(self, other):
|
@@ -414,6 +411,8 @@ class Operator(LinearOp):
|
|
414
411
|
|
415
412
|
from qiskit.synthesis.permutation.permutation_utils import _inverse_pattern
|
416
413
|
|
414
|
+
op = Operator(circuit)
|
415
|
+
|
417
416
|
if initial_layout is not None:
|
418
417
|
input_qubits = [None] * len(layout.input_qubit_mapping)
|
419
418
|
for q, p in layout.input_qubit_mapping.items():
|
@@ -421,22 +420,18 @@ class Operator(LinearOp):
|
|
421
420
|
|
422
421
|
initial_permutation = initial_layout.to_permutation(input_qubits)
|
423
422
|
initial_permutation_inverse = _inverse_pattern(initial_permutation)
|
423
|
+
op = op.apply_permutation(initial_permutation, True)
|
424
424
|
|
425
|
-
|
425
|
+
if final_layout is not None:
|
426
|
+
final_permutation = final_layout.to_permutation(circuit.qubits)
|
427
|
+
final_permutation_inverse = _inverse_pattern(final_permutation)
|
428
|
+
op = op.apply_permutation(final_permutation_inverse, False)
|
429
|
+
op = op.apply_permutation(initial_permutation_inverse, False)
|
430
|
+
elif final_layout is not None:
|
426
431
|
final_permutation = final_layout.to_permutation(circuit.qubits)
|
427
432
|
final_permutation_inverse = _inverse_pattern(final_permutation)
|
428
|
-
|
429
|
-
op = Operator(circuit)
|
430
|
-
|
431
|
-
if initial_layout:
|
432
|
-
op = op.apply_permutation(initial_permutation, True)
|
433
|
-
|
434
|
-
if final_layout:
|
435
433
|
op = op.apply_permutation(final_permutation_inverse, False)
|
436
434
|
|
437
|
-
if initial_layout:
|
438
|
-
op = op.apply_permutation(initial_permutation_inverse, False)
|
439
|
-
|
440
435
|
return op
|
441
436
|
|
442
437
|
def is_unitary(self, atol=None, rtol=None):
|
@@ -765,10 +760,8 @@ class Operator(LinearOp):
|
|
765
760
|
raise QiskitError(f"Cannot apply Operation: {obj.name}")
|
766
761
|
if not isinstance(obj.definition, QuantumCircuit):
|
767
762
|
raise QiskitError(
|
768
|
-
'Operation "{}" '
|
769
|
-
"definition is {} but expected QuantumCircuit."
|
770
|
-
obj.name, type(obj.definition)
|
771
|
-
)
|
763
|
+
f'Operation "{obj.name}" '
|
764
|
+
f"definition is {type(obj.definition)} but expected QuantumCircuit."
|
772
765
|
)
|
773
766
|
if obj.definition.global_phase:
|
774
767
|
dimension = 2**obj.num_qubits
|
@@ -22,6 +22,7 @@ RTOL_DEFAULT = 1e-5
|
|
22
22
|
|
23
23
|
|
24
24
|
def matrix_equal(mat1, mat2, ignore_phase=False, rtol=RTOL_DEFAULT, atol=ATOL_DEFAULT, props=None):
|
25
|
+
# pylint: disable-next=consider-using-f-string
|
25
26
|
"""Test if two arrays are equal.
|
26
27
|
|
27
28
|
The final comparison is implemented using Numpy.allclose. See its
|
@@ -215,12 +215,12 @@ class BasePauli(BaseOperator, AdjointMixin, MultiplyMixin):
|
|
215
215
|
if qargs is not None and len(qargs) != other.num_qubits:
|
216
216
|
raise QiskitError(
|
217
217
|
"Number of qubits of other Pauli does not match number of "
|
218
|
-
"qargs ({} != {
|
218
|
+
f"qargs ({other.num_qubits} != {len(qargs)})."
|
219
219
|
)
|
220
220
|
if qargs is None and self.num_qubits != other.num_qubits:
|
221
221
|
raise QiskitError(
|
222
222
|
"Number of qubits of other Pauli does not match the current "
|
223
|
-
"Pauli ({} != {})."
|
223
|
+
f"Pauli ({other.num_qubits} != {self.num_qubits})."
|
224
224
|
)
|
225
225
|
if qargs is not None:
|
226
226
|
inds = list(qargs)
|
@@ -262,15 +262,12 @@ class BasePauli(BaseOperator, AdjointMixin, MultiplyMixin):
|
|
262
262
|
# Check dimension
|
263
263
|
if qargs is not None and len(qargs) != other.num_qubits:
|
264
264
|
raise QiskitError(
|
265
|
-
"Incorrect number of qubits for Clifford circuit ({} != {})."
|
266
|
-
other.num_qubits, len(qargs)
|
267
|
-
)
|
265
|
+
f"Incorrect number of qubits for Clifford circuit ({other.num_qubits} != {len(qargs)})."
|
268
266
|
)
|
269
267
|
if qargs is None and self.num_qubits != other.num_qubits:
|
270
268
|
raise QiskitError(
|
271
|
-
"Incorrect number of qubits for Clifford circuit
|
272
|
-
|
273
|
-
)
|
269
|
+
f"Incorrect number of qubits for Clifford circuit "
|
270
|
+
f"({other.num_qubits} != {self.num_qubits})."
|
274
271
|
)
|
275
272
|
|
276
273
|
# Evolve via Pauli
|
@@ -571,9 +568,8 @@ class BasePauli(BaseOperator, AdjointMixin, MultiplyMixin):
|
|
571
568
|
raise QiskitError(f"Cannot apply Instruction: {gate.name}")
|
572
569
|
if not isinstance(gate.definition, QuantumCircuit):
|
573
570
|
raise QiskitError(
|
574
|
-
"{} instruction definition is {};
|
575
|
-
|
576
|
-
)
|
571
|
+
f"{gate.name} instruction definition is {type(gate.definition)};"
|
572
|
+
f" expected QuantumCircuit"
|
577
573
|
)
|
578
574
|
|
579
575
|
circuit = gate.definition
|
@@ -185,7 +185,7 @@ class Clifford(BaseOperator, AdjointMixin, Operation):
|
|
185
185
|
isinstance(data, (list, np.ndarray))
|
186
186
|
and (data_asarray := np.asarray(data, dtype=bool)).ndim == 2
|
187
187
|
):
|
188
|
-
# This little dance is to avoid Numpy 1/2
|
188
|
+
# This little dance is to avoid Numpy 1/2 incompatibilities between the availability
|
189
189
|
# and meaning of the 'copy' argument in 'array' and 'asarray', when the input needs
|
190
190
|
# its dtype converting. 'asarray' prefers to return 'self' if possible in both.
|
191
191
|
if copy and np.may_share_memory(data, data_asarray):
|
@@ -346,7 +346,7 @@ class Pauli(BasePauli):
|
|
346
346
|
if max(qubits) > self.num_qubits - 1:
|
347
347
|
raise QiskitError(
|
348
348
|
"Qubit index is larger than the number of qubits "
|
349
|
-
"({
|
349
|
+
f"({max(qubits)}>{self.num_qubits - 1})."
|
350
350
|
)
|
351
351
|
if len(qubits) == self.num_qubits:
|
352
352
|
raise QiskitError("Cannot delete all qubits of Pauli")
|
@@ -381,12 +381,12 @@ class Pauli(BasePauli):
|
|
381
381
|
if len(qubits) != value.num_qubits:
|
382
382
|
raise QiskitError(
|
383
383
|
"Number of indices does not match number of qubits for "
|
384
|
-
"the inserted Pauli ({
|
384
|
+
f"the inserted Pauli ({len(qubits)}!={value.num_qubits})"
|
385
385
|
)
|
386
386
|
if max(qubits) > ret.num_qubits - 1:
|
387
387
|
raise QiskitError(
|
388
388
|
"Index is too larger for combined Pauli number of qubits "
|
389
|
-
"({
|
389
|
+
f"({max(qubits)}>{ret.num_qubits - 1})."
|
390
390
|
)
|
391
391
|
# Qubit positions for original op
|
392
392
|
self_qubits = [i for i in range(ret.num_qubits) if i not in qubits]
|
@@ -382,8 +382,8 @@ class PauliList(BasePauli, LinearMixin, GroupMixin):
|
|
382
382
|
if not qubit:
|
383
383
|
if max(ind) >= len(self):
|
384
384
|
raise QiskitError(
|
385
|
-
"Indices {} are not all less than the size"
|
386
|
-
" of the PauliList ({
|
385
|
+
f"Indices {ind} are not all less than the size"
|
386
|
+
f" of the PauliList ({len(self)})"
|
387
387
|
)
|
388
388
|
z = np.delete(self._z, ind, axis=0)
|
389
389
|
x = np.delete(self._x, ind, axis=0)
|
@@ -394,8 +394,8 @@ class PauliList(BasePauli, LinearMixin, GroupMixin):
|
|
394
394
|
# Column (qubit) deletion
|
395
395
|
if max(ind) >= self.num_qubits:
|
396
396
|
raise QiskitError(
|
397
|
-
"Indices {} are not all less than the number of"
|
398
|
-
" qubits in the PauliList ({
|
397
|
+
f"Indices {ind} are not all less than the number of"
|
398
|
+
f" qubits in the PauliList ({self.num_qubits})"
|
399
399
|
)
|
400
400
|
z = np.delete(self._z, ind, axis=1)
|
401
401
|
x = np.delete(self._x, ind, axis=1)
|
@@ -432,8 +432,7 @@ class PauliList(BasePauli, LinearMixin, GroupMixin):
|
|
432
432
|
if not qubit:
|
433
433
|
if ind > size:
|
434
434
|
raise QiskitError(
|
435
|
-
"Index {} is larger than the number of rows in the"
|
436
|
-
" PauliList ({}).".format(ind, size)
|
435
|
+
f"Index {ind} is larger than the number of rows in the" f" PauliList ({size})."
|
437
436
|
)
|
438
437
|
base_z = np.insert(self._z, ind, value._z, axis=0)
|
439
438
|
base_x = np.insert(self._x, ind, value._x, axis=0)
|
@@ -443,8 +442,8 @@ class PauliList(BasePauli, LinearMixin, GroupMixin):
|
|
443
442
|
# Column insertion
|
444
443
|
if ind > self.num_qubits:
|
445
444
|
raise QiskitError(
|
446
|
-
"Index {} is greater than number of qubits"
|
447
|
-
" in the PauliList ({
|
445
|
+
f"Index {ind} is greater than number of qubits"
|
446
|
+
f" in the PauliList ({self.num_qubits})"
|
448
447
|
)
|
449
448
|
if len(value) == 1:
|
450
449
|
# Pad blocks to correct size
|
@@ -461,7 +460,7 @@ class PauliList(BasePauli, LinearMixin, GroupMixin):
|
|
461
460
|
raise QiskitError(
|
462
461
|
"Input PauliList must have a single row, or"
|
463
462
|
" the same number of rows as the Pauli Table"
|
464
|
-
" ({})."
|
463
|
+
f" ({size})."
|
465
464
|
)
|
466
465
|
# Build new array by blocks
|
467
466
|
z = np.hstack([self.z[:, :ind], value_z, self.z[:, ind:]])
|
@@ -647,7 +646,7 @@ class PauliList(BasePauli, LinearMixin, GroupMixin):
|
|
647
646
|
index = index[sort_inds]
|
648
647
|
unique = PauliList(BasePauli(self._z[index], self._x[index], self._phase[index]))
|
649
648
|
|
650
|
-
#
|
649
|
+
# Concatenate return tuples
|
651
650
|
ret = (unique,)
|
652
651
|
if return_index:
|
653
652
|
ret += (index,)
|
@@ -135,19 +135,19 @@ class SparsePauliOp(LinearOp):
|
|
135
135
|
|
136
136
|
pauli_list = PauliList(data.copy() if copy and hasattr(data, "copy") else data)
|
137
137
|
|
138
|
-
if isinstance(coeffs, np.ndarray):
|
139
|
-
dtype = object if coeffs.dtype == object else complex
|
140
|
-
elif coeffs is not None:
|
141
|
-
if not isinstance(coeffs, (np.ndarray, Sequence)):
|
142
|
-
coeffs = [coeffs]
|
143
|
-
if any(isinstance(coeff, ParameterExpression) for coeff in coeffs):
|
144
|
-
dtype = object
|
145
|
-
else:
|
146
|
-
dtype = complex
|
147
|
-
|
148
138
|
if coeffs is None:
|
149
139
|
coeffs = np.ones(pauli_list.size, dtype=complex)
|
150
140
|
else:
|
141
|
+
if isinstance(coeffs, np.ndarray):
|
142
|
+
dtype = object if coeffs.dtype == object else complex
|
143
|
+
else:
|
144
|
+
if not isinstance(coeffs, Sequence):
|
145
|
+
coeffs = [coeffs]
|
146
|
+
if any(isinstance(coeff, ParameterExpression) for coeff in coeffs):
|
147
|
+
dtype = object
|
148
|
+
else:
|
149
|
+
dtype = complex
|
150
|
+
|
151
151
|
coeffs_asarray = np.asarray(coeffs, dtype=dtype)
|
152
152
|
coeffs = (
|
153
153
|
coeffs_asarray.copy()
|
@@ -172,7 +172,7 @@ class SparsePauliOp(LinearOp):
|
|
172
172
|
if self._coeffs.shape != (self._pauli_list.size,):
|
173
173
|
raise QiskitError(
|
174
174
|
"coeff vector is incorrect shape for number"
|
175
|
-
" of Paulis {
|
175
|
+
f" of Paulis {self._coeffs.shape} != {self._pauli_list.size}"
|
176
176
|
)
|
177
177
|
# Initialize LinearOp
|
178
178
|
super().__init__(num_qubits=self._pauli_list.num_qubits)
|
@@ -186,11 +186,9 @@ class SparsePauliOp(LinearOp):
|
|
186
186
|
def __repr__(self):
|
187
187
|
prefix = "SparsePauliOp("
|
188
188
|
pad = len(prefix) * " "
|
189
|
-
return
|
190
|
-
prefix
|
191
|
-
self.
|
192
|
-
pad,
|
193
|
-
np.array2string(self.coeffs, separator=", "),
|
189
|
+
return (
|
190
|
+
f"{prefix}{self.paulis.to_labels()},\n{pad}"
|
191
|
+
f"coeffs={np.array2string(self.coeffs, separator=', ')})"
|
194
192
|
)
|
195
193
|
|
196
194
|
def __eq__(self, other):
|
@@ -43,7 +43,7 @@ class Quaternion:
|
|
43
43
|
out_data[3] = r(0) * q(3) - r(1) * q(2) + r(2) * q(1) + r(3) * q(0)
|
44
44
|
return Quaternion(out_data)
|
45
45
|
else:
|
46
|
-
|
46
|
+
return NotImplemented
|
47
47
|
|
48
48
|
def norm(self):
|
49
49
|
"""Norm of quaternion."""
|
@@ -123,11 +123,9 @@ class DensityMatrix(QuantumState, TolerancesMixin):
|
|
123
123
|
def __repr__(self):
|
124
124
|
prefix = "DensityMatrix("
|
125
125
|
pad = len(prefix) * " "
|
126
|
-
return
|
127
|
-
prefix,
|
128
|
-
|
129
|
-
pad,
|
130
|
-
self._op_shape.dims_l(),
|
126
|
+
return (
|
127
|
+
f"{prefix}{np.array2string(self._data, separator=', ', prefix=prefix)},\n"
|
128
|
+
f"{pad}dims={self._op_shape.dims_l()})"
|
131
129
|
)
|
132
130
|
|
133
131
|
@property
|
@@ -771,9 +769,8 @@ class DensityMatrix(QuantumState, TolerancesMixin):
|
|
771
769
|
raise QiskitError(f"Cannot apply Instruction: {other.name}")
|
772
770
|
if not isinstance(other.definition, QuantumCircuit):
|
773
771
|
raise QiskitError(
|
774
|
-
"{} instruction definition is {};
|
775
|
-
|
776
|
-
)
|
772
|
+
f"{other.name} instruction definition is {type(other.definition)};"
|
773
|
+
f" expected QuantumCircuit"
|
777
774
|
)
|
778
775
|
qubit_indices = {bit: idx for idx, bit in enumerate(other.definition.qubits)}
|
779
776
|
for instruction in other.definition:
|