qiskit 1.1.2__cp38-abi3-macosx_10_9_universal2.whl → 1.2.0__cp38-abi3-macosx_10_9_universal2.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.abi3.so +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 +6 -3
- 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 +395 -387
- 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 +42 -128
- 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 +33 -25
- qiskit/providers/fake_provider/fake_backend.py +10 -3
- qiskit/providers/fake_provider/fake_openpulse_2q.py +157 -149
- qiskit/providers/fake_provider/fake_openpulse_3q.py +228 -220
- qiskit/providers/fake_provider/fake_pulse_backend.py +2 -1
- qiskit/providers/fake_provider/fake_qasm_backend.py +7 -2
- qiskit/providers/fake_provider/generic_backend_v2.py +514 -68
- qiskit/providers/models/__init__.py +48 -11
- 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 +582 -479
- 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/__init__.py +1 -1
- 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 +15 -17
- 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 +84 -64
- 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 +17 -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 +2 -2
- 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 +20 -14
- 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 +73 -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 +18 -23
- 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 +2 -2
- 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.0.dist-info}/METADATA +12 -12
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/RECORD +342 -340
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.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.0.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/WHEEL +0 -0
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/top_level.txt +0 -0
@@ -297,7 +297,7 @@ class StabilizerState(QuantumState):
|
|
297
297
|
|
298
298
|
# Otherwise pauli is (-1)^a prod_j S_j^b_j for Clifford stabilizers
|
299
299
|
# If pauli anti-commutes with D_j then b_j = 1.
|
300
|
-
# Multiply pauli by stabilizers with anti-commuting
|
300
|
+
# Multiply pauli by stabilizers with anti-commuting destabilisers
|
301
301
|
pauli_z = (pauli.z).copy() # Make a copy of pauli.z
|
302
302
|
for p in range(num_qubits):
|
303
303
|
# Check if destabilizer anti-commutes
|
@@ -386,8 +386,17 @@ class StabilizerState(QuantumState):
|
|
386
386
|
|
387
387
|
return probs
|
388
388
|
|
389
|
-
def
|
390
|
-
|
389
|
+
def probabilities_dict_from_bitstring(
|
390
|
+
self,
|
391
|
+
outcome_bitstring: str,
|
392
|
+
qargs: None | list = None,
|
393
|
+
decimals: None | int = None,
|
394
|
+
) -> dict[str, float]:
|
395
|
+
"""Return the subsystem measurement probability dictionary utilizing
|
396
|
+
a targeted outcome_bitstring to perform the measurement for. This
|
397
|
+
will calculate a probability for only a single targeted
|
398
|
+
outcome_bitstring value, giving a performance boost over calculating
|
399
|
+
all possible outcomes.
|
391
400
|
|
392
401
|
Measurement probabilities are with respect to measurement in the
|
393
402
|
computation (diagonal) basis.
|
@@ -398,30 +407,44 @@ class StabilizerState(QuantumState):
|
|
398
407
|
inserted between integers so that subsystems can be distinguished.
|
399
408
|
|
400
409
|
Args:
|
410
|
+
outcome_bitstring (None or str): targeted outcome bitstring
|
411
|
+
to perform a measurement calculation for, this will significantly
|
412
|
+
reduce the number of calculation performed (Default: None)
|
401
413
|
qargs (None or list): subsystems to return probabilities for,
|
402
|
-
|
414
|
+
if None return for all subsystems (Default: None).
|
403
415
|
decimals (None or int): the number of decimal places to round
|
404
|
-
|
416
|
+
values. If None no rounding is done (Default: None)
|
405
417
|
|
406
418
|
Returns:
|
407
|
-
dict: The measurement probabilities in dict (ket) form.
|
419
|
+
dict[str, float]: The measurement probabilities in dict (ket) form.
|
408
420
|
"""
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
qubits = qargs
|
421
|
+
return self._get_probabilities_dict(
|
422
|
+
outcome_bitstring=outcome_bitstring, qargs=qargs, decimals=decimals
|
423
|
+
)
|
413
424
|
|
414
|
-
|
415
|
-
|
416
|
-
|
425
|
+
def probabilities_dict(
|
426
|
+
self, qargs: None | list = None, decimals: None | int = None
|
427
|
+
) -> dict[str, float]:
|
428
|
+
"""Return the subsystem measurement probability dictionary.
|
417
429
|
|
418
|
-
|
430
|
+
Measurement probabilities are with respect to measurement in the
|
431
|
+
computation (diagonal) basis.
|
419
432
|
|
420
|
-
|
421
|
-
|
422
|
-
|
433
|
+
This dictionary representation uses a Ket-like notation where the
|
434
|
+
dictionary keys are qudit strings for the subsystem basis vectors.
|
435
|
+
If any subsystem has a dimension greater than 10 comma delimiters are
|
436
|
+
inserted between integers so that subsystems can be distinguished.
|
423
437
|
|
424
|
-
|
438
|
+
Args:
|
439
|
+
qargs (None or list): subsystems to return probabilities for,
|
440
|
+
if None return for all subsystems (Default: None).
|
441
|
+
decimals (None or int): the number of decimal places to round
|
442
|
+
values. If None no rounding is done (Default: None).
|
443
|
+
|
444
|
+
Returns:
|
445
|
+
dict: The measurement probabilities in dict (key) form.
|
446
|
+
"""
|
447
|
+
return self._get_probabilities_dict(outcome_bitstring=None, qargs=qargs, decimals=decimals)
|
425
448
|
|
426
449
|
def reset(self, qargs: list | None = None) -> StabilizerState:
|
427
450
|
"""Reset state or subsystems to the 0-state.
|
@@ -623,7 +646,7 @@ class StabilizerState(QuantumState):
|
|
623
646
|
|
624
647
|
@staticmethod
|
625
648
|
def _rowsum_deterministic(clifford, aux_pauli, row):
|
626
|
-
"""Updating an
|
649
|
+
"""Updating an auxiliary Pauli aux_pauli in the
|
627
650
|
deterministic rowsum calculation.
|
628
651
|
The StabilizerState itself is not updated."""
|
629
652
|
|
@@ -644,22 +667,48 @@ class StabilizerState(QuantumState):
|
|
644
667
|
# -----------------------------------------------------------------------
|
645
668
|
# Helper functions for calculating the probabilities
|
646
669
|
# -----------------------------------------------------------------------
|
647
|
-
def _get_probabilities(
|
648
|
-
|
670
|
+
def _get_probabilities(
|
671
|
+
self,
|
672
|
+
qubits: range,
|
673
|
+
outcome: list[str],
|
674
|
+
outcome_prob: float,
|
675
|
+
probs: dict[str, float],
|
676
|
+
outcome_bitstring: str = None,
|
677
|
+
):
|
678
|
+
"""Recursive helper function for calculating the probabilities
|
649
679
|
|
650
|
-
|
651
|
-
|
680
|
+
Args:
|
681
|
+
qubits (range): range of qubits
|
682
|
+
outcome (list[str]): outcome being built
|
683
|
+
outcome_prob (float): probability of the outcome
|
684
|
+
probs (dict[str, float]): holds the outcomes and probability results
|
685
|
+
outcome_bitstring (str): target outcome to measure which reduces measurements, None
|
686
|
+
if not targeting a specific target
|
687
|
+
"""
|
688
|
+
qubit_for_branching: int = -1
|
652
689
|
|
690
|
+
ret: StabilizerState = self.copy()
|
691
|
+
|
692
|
+
# Find outcomes for each qubit
|
653
693
|
for i in range(len(qubits)):
|
654
|
-
qubit = qubits[len(qubits) - i - 1]
|
655
694
|
if outcome[i] == "X":
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
695
|
+
# Retrieve the qubit for the current measurement
|
696
|
+
qubit = qubits[(len(qubits) - i - 1)]
|
697
|
+
# Determine if the probability is deterministic
|
698
|
+
if not any(ret.clifford.stab_x[:, qubit]):
|
699
|
+
single_qubit_outcome: np.int64 = ret._measure_and_update(qubit, 0)
|
700
|
+
if outcome_bitstring is None or (
|
701
|
+
int(outcome_bitstring[i]) == single_qubit_outcome
|
702
|
+
):
|
703
|
+
# No outcome_bitstring target, or using outcome_bitstring target and
|
704
|
+
# the single_qubit_outcome equals the desired outcome_bitstring target value,
|
705
|
+
# then use current outcome_prob value
|
706
|
+
outcome[i] = str(single_qubit_outcome)
|
661
707
|
else:
|
662
|
-
|
708
|
+
# If the single_qubit_outcome does not equal the outcome_bitsring target
|
709
|
+
# then we know that the probability will be 0
|
710
|
+
outcome[i] = str(outcome_bitstring[i])
|
711
|
+
outcome_prob = 0
|
663
712
|
else:
|
664
713
|
qubit_for_branching = i
|
665
714
|
|
@@ -668,15 +717,57 @@ class StabilizerState(QuantumState):
|
|
668
717
|
probs[str_outcome] = outcome_prob
|
669
718
|
return
|
670
719
|
|
671
|
-
for single_qubit_outcome in
|
720
|
+
for single_qubit_outcome in (
|
721
|
+
range(0, 2)
|
722
|
+
if (outcome_bitstring is None)
|
723
|
+
else [int(outcome_bitstring[qubit_for_branching])]
|
724
|
+
):
|
672
725
|
new_outcome = outcome.copy()
|
673
|
-
|
674
|
-
new_outcome[qubit_for_branching] = "1"
|
675
|
-
else:
|
676
|
-
new_outcome[qubit_for_branching] = "0"
|
726
|
+
new_outcome[qubit_for_branching] = str(single_qubit_outcome)
|
677
727
|
|
678
728
|
stab_cpy = ret.copy()
|
679
729
|
stab_cpy._measure_and_update(
|
680
|
-
qubits[len(qubits) - qubit_for_branching - 1], single_qubit_outcome
|
730
|
+
qubits[(len(qubits) - qubit_for_branching - 1)], single_qubit_outcome
|
731
|
+
)
|
732
|
+
stab_cpy._get_probabilities(
|
733
|
+
qubits, new_outcome, (0.5 * outcome_prob), probs, outcome_bitstring
|
681
734
|
)
|
682
|
-
|
735
|
+
|
736
|
+
def _get_probabilities_dict(
|
737
|
+
self,
|
738
|
+
outcome_bitstring: None | str = None,
|
739
|
+
qargs: None | list = None,
|
740
|
+
decimals: None | int = None,
|
741
|
+
) -> dict[str, float]:
|
742
|
+
"""Helper Function for calculating the subsystem measurement probability dictionary.
|
743
|
+
When the targeted outcome_bitstring value is set, then only the single outcome_bitstring
|
744
|
+
probability will be calculated.
|
745
|
+
|
746
|
+
Args:
|
747
|
+
outcome_bitstring (None or str): targeted outcome bitstring
|
748
|
+
to perform a measurement calculation for, this will significantly
|
749
|
+
reduce the number of calculation performed (Default: None)
|
750
|
+
qargs (None or list): subsystems to return probabilities for,
|
751
|
+
if None return for all subsystems (Default: None).
|
752
|
+
decimals (None or int): the number of decimal places to round
|
753
|
+
values. If None no rounding is done (Default: None).
|
754
|
+
|
755
|
+
Returns:
|
756
|
+
dict: The measurement probabilities in dict (key) form.
|
757
|
+
"""
|
758
|
+
if qargs is None:
|
759
|
+
qubits = range(self.clifford.num_qubits)
|
760
|
+
else:
|
761
|
+
qubits = qargs
|
762
|
+
|
763
|
+
outcome = ["X"] * len(qubits)
|
764
|
+
outcome_prob = 1.0
|
765
|
+
probs: dict[str, float] = {} # Probabilities dict to return with the measured values
|
766
|
+
|
767
|
+
self._get_probabilities(qubits, outcome, outcome_prob, probs, outcome_bitstring)
|
768
|
+
|
769
|
+
if decimals is not None:
|
770
|
+
for key, value in probs.items():
|
771
|
+
probs[key] = round(value, decimals)
|
772
|
+
|
773
|
+
return probs
|
@@ -117,11 +117,9 @@ class Statevector(QuantumState, TolerancesMixin):
|
|
117
117
|
def __repr__(self):
|
118
118
|
prefix = "Statevector("
|
119
119
|
pad = len(prefix) * " "
|
120
|
-
return
|
121
|
-
prefix,
|
122
|
-
|
123
|
-
pad,
|
124
|
-
self._op_shape.dims_l(),
|
120
|
+
return (
|
121
|
+
f"{prefix}{np.array2string(self._data, separator=', ', prefix=prefix)},\n{pad}"
|
122
|
+
f"dims={self._op_shape.dims_l()})"
|
125
123
|
)
|
126
124
|
|
127
125
|
@property
|
@@ -940,9 +938,7 @@ class Statevector(QuantumState, TolerancesMixin):
|
|
940
938
|
raise QiskitError(f"Cannot apply Instruction: {obj.name}")
|
941
939
|
if not isinstance(obj.definition, QuantumCircuit):
|
942
940
|
raise QiskitError(
|
943
|
-
"{} instruction definition is {}; expected QuantumCircuit"
|
944
|
-
obj.name, type(obj.definition)
|
945
|
-
)
|
941
|
+
f"{obj.name} instruction definition is {type(obj.definition)}; expected QuantumCircuit"
|
946
942
|
)
|
947
943
|
|
948
944
|
if obj.definition.global_phase:
|
qiskit/result/counts.py
CHANGED
@@ -101,7 +101,7 @@ class Counts(dict):
|
|
101
101
|
else:
|
102
102
|
raise TypeError(
|
103
103
|
"Invalid input key type %s, must be either an int "
|
104
|
-
"key or string key with
|
104
|
+
"key or string key with hexadecimal value or bit string"
|
105
105
|
)
|
106
106
|
header = {}
|
107
107
|
self.creg_sizes = creg_sizes
|
@@ -130,7 +130,7 @@ class Counts(dict):
|
|
130
130
|
max_values_counts = [x[0] for x in self.items() if x[1] == max_value]
|
131
131
|
if len(max_values_counts) != 1:
|
132
132
|
raise exceptions.QiskitError(
|
133
|
-
"Multiple values have the same maximum counts:
|
133
|
+
f"Multiple values have the same maximum counts: {','.join(max_values_counts)}"
|
134
134
|
)
|
135
135
|
return max_values_counts[0]
|
136
136
|
|
@@ -54,8 +54,8 @@ class CorrelatedReadoutMitigator(BaseReadoutMitigator):
|
|
54
54
|
else:
|
55
55
|
if len(qubits) != matrix_qubits_num:
|
56
56
|
raise QiskitError(
|
57
|
-
"The number of given qubits ({}) is different than the number of "
|
58
|
-
"qubits inferred from the matrices ({})"
|
57
|
+
f"The number of given qubits ({len(qubits)}) is different than the number of "
|
58
|
+
f"qubits inferred from the matrices ({matrix_qubits_num})"
|
59
59
|
)
|
60
60
|
self._qubits = qubits
|
61
61
|
self._num_qubits = len(self._qubits)
|
@@ -68,8 +68,8 @@ class LocalReadoutMitigator(BaseReadoutMitigator):
|
|
68
68
|
else:
|
69
69
|
if len(qubits) != len(assignment_matrices):
|
70
70
|
raise QiskitError(
|
71
|
-
"The number of given qubits ({}) is different than the number of qubits "
|
72
|
-
"inferred from the matrices ({
|
71
|
+
f"The number of given qubits ({len(qubits)}) is different than the number of qubits "
|
72
|
+
f"inferred from the matrices ({len(assignment_matrices)})"
|
73
73
|
)
|
74
74
|
self._qubits = qubits
|
75
75
|
self._num_qubits = len(self._qubits)
|
@@ -120,9 +120,7 @@ def marganalize_counts(
|
|
120
120
|
clbits_len = len(clbits) if not clbits is None else 0
|
121
121
|
if clbits_len not in (0, qubits_len):
|
122
122
|
raise QiskitError(
|
123
|
-
"Num qubits ({}) does not match number of clbits ({})."
|
124
|
-
qubits_len, clbits_len
|
125
|
-
)
|
123
|
+
f"Num qubits ({qubits_len}) does not match number of clbits ({clbits_len})."
|
126
124
|
)
|
127
125
|
counts = marginal_counts(counts, clbits)
|
128
126
|
if clbits is None and qubits is not None:
|
qiskit/result/models.py
CHANGED
@@ -13,6 +13,7 @@
|
|
13
13
|
"""Schema and helper models for schema-conformant Results."""
|
14
14
|
|
15
15
|
import copy
|
16
|
+
import warnings
|
16
17
|
|
17
18
|
from qiskit.qobj.utils import MeasReturnType, MeasLevel
|
18
19
|
from qiskit.qobj import QobjExperimentHeader
|
@@ -66,8 +67,7 @@ class ExperimentResultData:
|
|
66
67
|
string_list = []
|
67
68
|
for field in self._data_attributes:
|
68
69
|
string_list.append(f"{field}={getattr(self, field)}")
|
69
|
-
|
70
|
-
return out
|
70
|
+
return f"ExperimentResultData({', '.join(string_list)})"
|
71
71
|
|
72
72
|
def to_dict(self):
|
73
73
|
"""Return a dictionary format representation of the ExperimentResultData
|
@@ -157,25 +157,23 @@ class ExperimentResult:
|
|
157
157
|
self._metadata.update(kwargs)
|
158
158
|
|
159
159
|
def __repr__(self):
|
160
|
-
out =
|
161
|
-
self.shots,
|
162
|
-
self.
|
163
|
-
self.meas_level,
|
164
|
-
self.data,
|
160
|
+
out = (
|
161
|
+
f"ExperimentResult(shots={self.shots}, success={self.success},"
|
162
|
+
f" meas_level={self.meas_level}, data={self.data}"
|
165
163
|
)
|
166
164
|
if hasattr(self, "header"):
|
167
|
-
out += ", header
|
165
|
+
out += f", header={self.header}"
|
168
166
|
if hasattr(self, "status"):
|
169
|
-
out += ", status
|
167
|
+
out += f", status={self.status}"
|
170
168
|
if hasattr(self, "seed"):
|
171
|
-
out += ", seed
|
169
|
+
out += f", seed={self.seed}"
|
172
170
|
if hasattr(self, "meas_return"):
|
173
|
-
out += ", meas_return
|
174
|
-
for key in self._metadata:
|
175
|
-
if isinstance(
|
176
|
-
value_str = "'
|
171
|
+
out += f", meas_return={self.meas_return}"
|
172
|
+
for key, value in self._metadata.items():
|
173
|
+
if isinstance(value, str):
|
174
|
+
value_str = f"'{value}'"
|
177
175
|
else:
|
178
|
-
value_str = repr(
|
176
|
+
value_str = repr(value)
|
179
177
|
out += f", {key}={value_str}"
|
180
178
|
out += ")"
|
181
179
|
return out
|
@@ -226,7 +224,10 @@ class ExperimentResult:
|
|
226
224
|
in_data = copy.copy(data)
|
227
225
|
data_obj = ExperimentResultData.from_dict(in_data.pop("data"))
|
228
226
|
if "header" in in_data:
|
229
|
-
|
227
|
+
with warnings.catch_warnings():
|
228
|
+
# The class QobjExperimentHeader is deprecated
|
229
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
230
|
+
in_data["header"] = QobjExperimentHeader.from_dict(in_data.pop("header"))
|
230
231
|
shots = in_data.pop("shots")
|
231
232
|
success = in_data.pop("success")
|
232
233
|
|
qiskit/result/result.py
CHANGED
@@ -69,23 +69,16 @@ class Result:
|
|
69
69
|
|
70
70
|
def __repr__(self):
|
71
71
|
out = (
|
72
|
-
"Result(backend_name='
|
73
|
-
"job_id='
|
74
|
-
|
75
|
-
self.backend_name,
|
76
|
-
self.backend_version,
|
77
|
-
self.qobj_id,
|
78
|
-
self.job_id,
|
79
|
-
self.success,
|
80
|
-
self.results,
|
81
|
-
)
|
72
|
+
f"Result(backend_name='{self.backend_name}', backend_version='{self.backend_version}',"
|
73
|
+
f" qobj_id='{self.qobj_id}', job_id='{self.job_id}', success={self.success},"
|
74
|
+
f" results={self.results}"
|
82
75
|
)
|
83
76
|
out += f", date={self.date}, status={self.status}, header={self.header}"
|
84
|
-
for key in self._metadata:
|
85
|
-
if isinstance(
|
86
|
-
value_str = "'
|
77
|
+
for key, value in self._metadata.items():
|
78
|
+
if isinstance(value, str):
|
79
|
+
value_str = f"'{value}'"
|
87
80
|
else:
|
88
|
-
value_str = repr(
|
81
|
+
value_str = repr(value)
|
89
82
|
out += f", {key}={value_str}"
|
90
83
|
out += ")"
|
91
84
|
return out
|
@@ -132,7 +125,9 @@ class Result:
|
|
132
125
|
in_data = copy.copy(data)
|
133
126
|
in_data["results"] = [ExperimentResult.from_dict(x) for x in in_data.pop("results")]
|
134
127
|
if in_data.get("header") is not None:
|
135
|
-
|
128
|
+
with warnings.catch_warnings():
|
129
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
130
|
+
in_data["header"] = QobjHeader.from_dict(in_data.pop("header"))
|
136
131
|
return cls(**in_data)
|
137
132
|
|
138
133
|
def data(self, experiment=None):
|
@@ -236,10 +231,10 @@ class Result:
|
|
236
231
|
|
237
232
|
except KeyError as ex:
|
238
233
|
raise QiskitError(
|
239
|
-
'No memory for experiment "{}". '
|
234
|
+
f'No memory for experiment "{repr(experiment)}". '
|
240
235
|
"Please verify that you either ran a measurement level 2 job "
|
241
236
|
'with the memory flag set, eg., "memory=True", '
|
242
|
-
"or a measurement level 0/1 job."
|
237
|
+
"or a measurement level 0/1 job."
|
243
238
|
) from ex
|
244
239
|
|
245
240
|
def get_counts(self, experiment=None):
|
@@ -377,14 +372,14 @@ class Result:
|
|
377
372
|
]
|
378
373
|
|
379
374
|
if len(exp) == 0:
|
380
|
-
raise QiskitError('Data for experiment "
|
375
|
+
raise QiskitError(f'Data for experiment "{key}" could not be found.')
|
381
376
|
if len(exp) == 1:
|
382
377
|
exp = exp[0]
|
383
378
|
else:
|
384
379
|
warnings.warn(
|
385
|
-
'Result object contained multiple results matching name "
|
380
|
+
f'Result object contained multiple results matching name "{key}", '
|
386
381
|
"only first match will be returned. Use an integer index to "
|
387
|
-
"retrieve results for all entries."
|
382
|
+
"retrieve results for all entries."
|
388
383
|
)
|
389
384
|
exp = exp[0]
|
390
385
|
|
qiskit/scheduler/lowering.py
CHANGED
@@ -145,9 +145,9 @@ def lower_gates(
|
|
145
145
|
elif isinstance(instruction.operation, Measure):
|
146
146
|
if len(inst_qubits) != 1 and len(instruction.clbits) != 1:
|
147
147
|
raise QiskitError(
|
148
|
-
"Qubit '{}' or classical bit '{}' errored because the "
|
148
|
+
f"Qubit '{inst_qubits}' or classical bit '{instruction.clbits}' errored because the "
|
149
149
|
"circuit Measure instruction only takes one of "
|
150
|
-
"each."
|
150
|
+
"each."
|
151
151
|
)
|
152
152
|
qubit_mem_slots[inst_qubits[0]] = clbit_indices[instruction.clbits[0]]
|
153
153
|
else:
|
qiskit/synthesis/__init__.py
CHANGED
@@ -91,6 +91,7 @@ Basis Change Synthesis
|
|
91
91
|
======================
|
92
92
|
|
93
93
|
.. autofunction:: synth_qft_line
|
94
|
+
.. autofunction:: synth_qft_full
|
94
95
|
|
95
96
|
Unitary Synthesis
|
96
97
|
=================
|
@@ -162,7 +163,7 @@ from .stabilizer import (
|
|
162
163
|
synth_circuit_from_stabilizers,
|
163
164
|
)
|
164
165
|
from .discrete_basis import SolovayKitaevDecomposition, generate_basic_approximations
|
165
|
-
from .qft import synth_qft_line
|
166
|
+
from .qft import synth_qft_line, synth_qft_full
|
166
167
|
from .unitary.qsd import qs_decomposition
|
167
168
|
from .unitary import aqc
|
168
169
|
from .one_qubit import OneQubitEulerDecomposer
|
@@ -14,6 +14,6 @@
|
|
14
14
|
|
15
15
|
from .clifford_decompose_full import synth_clifford_full
|
16
16
|
from .clifford_decompose_ag import synth_clifford_ag
|
17
|
-
from .clifford_decompose_bm import synth_clifford_bm
|
17
|
+
from .clifford_decompose_bm import synth_clifford_bm
|
18
18
|
from .clifford_decompose_greedy import synth_clifford_greedy
|
19
19
|
from .clifford_decompose_layers import synth_clifford_layers, synth_clifford_depth_lnn
|
@@ -30,7 +30,7 @@ from qiskit.quantum_info.operators.symplectic.clifford_circuits import (
|
|
30
30
|
_append_x,
|
31
31
|
_append_z,
|
32
32
|
)
|
33
|
-
from .clifford_decompose_bm import
|
33
|
+
from .clifford_decompose_bm import synth_clifford_bm
|
34
34
|
|
35
35
|
|
36
36
|
def synth_clifford_ag(clifford: Clifford) -> QuantumCircuit:
|
@@ -50,7 +50,7 @@ def synth_clifford_ag(clifford: Clifford) -> QuantumCircuit:
|
|
50
50
|
"""
|
51
51
|
# Use 1-qubit decomposition method
|
52
52
|
if clifford.num_qubits == 1:
|
53
|
-
return
|
53
|
+
return synth_clifford_bm(clifford)
|
54
54
|
|
55
55
|
# Compose a circuit which we will convert to an instruction
|
56
56
|
circuit = QuantumCircuit(clifford.num_qubits, name=str(clifford))
|