qiskit 1.1.2__cp38-abi3-win32.whl → 1.2.0__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 +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
qiskit/circuit/parameter.py
CHANGED
@@ -59,10 +59,10 @@ class Parameter(ParameterExpression):
|
|
59
59
|
bc.draw('mpl')
|
60
60
|
"""
|
61
61
|
|
62
|
-
__slots__ = ("
|
62
|
+
__slots__ = ("_uuid", "_hash")
|
63
63
|
|
64
64
|
# This `__init__` does not call the super init, because we can't construct the
|
65
|
-
# `_parameter_symbols` dictionary we need to pass to it before we're entirely
|
65
|
+
# `_parameter_symbols` dictionary we need to pass to it before we're entirely initialized
|
66
66
|
# anyway, because `ParameterExpression` depends heavily on the structure of `Parameter`.
|
67
67
|
|
68
68
|
def __init__(
|
@@ -79,7 +79,6 @@ class Parameter(ParameterExpression):
|
|
79
79
|
field when creating two parameters to the same thing (along with the same name)
|
80
80
|
allows them to be equal. This is useful during serialization and deserialization.
|
81
81
|
"""
|
82
|
-
self._name = name
|
83
82
|
self._uuid = uuid4() if uuid is None else uuid
|
84
83
|
symbol = symengine.Symbol(name)
|
85
84
|
|
@@ -110,14 +109,14 @@ class Parameter(ParameterExpression):
|
|
110
109
|
if allow_unknown_parameters:
|
111
110
|
return self
|
112
111
|
raise CircuitError(
|
113
|
-
"Cannot bind Parameters ({}) not present in "
|
114
|
-
"expression."
|
112
|
+
f"Cannot bind Parameters ({[str(p) for p in parameter_map]}) not present in "
|
113
|
+
"expression."
|
115
114
|
)
|
116
115
|
|
117
116
|
@property
|
118
117
|
def name(self):
|
119
118
|
"""Returns the name of the :class:`Parameter`."""
|
120
|
-
return self.
|
119
|
+
return self._symbol_expr.name
|
121
120
|
|
122
121
|
@property
|
123
122
|
def uuid(self) -> UUID:
|
@@ -143,7 +142,7 @@ class Parameter(ParameterExpression):
|
|
143
142
|
|
144
143
|
def __eq__(self, other):
|
145
144
|
if isinstance(other, Parameter):
|
146
|
-
return (self._uuid, self.
|
145
|
+
return (self._uuid, self._symbol_expr) == (other._uuid, other._symbol_expr)
|
147
146
|
elif isinstance(other, ParameterExpression):
|
148
147
|
return super().__eq__(other)
|
149
148
|
else:
|
@@ -155,7 +154,7 @@ class Parameter(ParameterExpression):
|
|
155
154
|
# expression, so its full hash key is split into `(parameter_keys, symbolic_expression)`.
|
156
155
|
# This method lets containing expressions get only the bits they need for equality checks in
|
157
156
|
# the first value, without wasting time re-hashing individual Sympy/Symengine symbols.
|
158
|
-
return (self.
|
157
|
+
return (self._symbol_expr, self._uuid)
|
159
158
|
|
160
159
|
def __hash__(self):
|
161
160
|
# This is precached for performance, since it's used a lot and we are immutable.
|
@@ -165,10 +164,10 @@ class Parameter(ParameterExpression):
|
|
165
164
|
# operation attempts to put this parameter into a hashmap.
|
166
165
|
|
167
166
|
def __getstate__(self):
|
168
|
-
return (self.
|
167
|
+
return (self.name, self._uuid, self._symbol_expr)
|
169
168
|
|
170
169
|
def __setstate__(self, state):
|
171
|
-
|
170
|
+
_, self._uuid, self._symbol_expr = state
|
172
171
|
self._parameter_keys = frozenset((self._hash_key(),))
|
173
172
|
self._hash = hash((self._parameter_keys, self._symbol_expr))
|
174
173
|
self._parameter_symbols = {self: self._symbol_expr}
|
@@ -48,7 +48,7 @@ class ParameterExpression:
|
|
48
48
|
expr (sympy.Expr): Expression of :class:`sympy.Symbol` s.
|
49
49
|
"""
|
50
50
|
# NOTE: `Parameter.__init__` does not call up to this method, since this method is dependent
|
51
|
-
# on `Parameter` instances already being
|
51
|
+
# on `Parameter` instances already being initialized enough to be hashable. If changing
|
52
52
|
# this method, check that `Parameter.__init__` and `__setstate__` are still valid.
|
53
53
|
self._parameter_symbols = symbol_map
|
54
54
|
self._parameter_keys = frozenset(p._hash_key() for p in self._parameter_symbols)
|
@@ -140,7 +140,7 @@ class ParameterExpression:
|
|
140
140
|
raise ZeroDivisionError(
|
141
141
|
"Binding provided for expression "
|
142
142
|
"results in division by zero "
|
143
|
-
"(Expression: {}, Bindings: {})."
|
143
|
+
f"(Expression: {self}, Bindings: {parameter_values})."
|
144
144
|
)
|
145
145
|
|
146
146
|
return ParameterExpression(free_parameter_symbols, bound_symbol_expr)
|
@@ -199,8 +199,8 @@ class ParameterExpression:
|
|
199
199
|
unknown_parameters = parameters - self.parameters
|
200
200
|
if unknown_parameters:
|
201
201
|
raise CircuitError(
|
202
|
-
"Cannot bind Parameters ({}) not present in "
|
203
|
-
"expression."
|
202
|
+
f"Cannot bind Parameters ({[str(p) for p in unknown_parameters]}) not present in "
|
203
|
+
"expression."
|
204
204
|
)
|
205
205
|
|
206
206
|
def _raise_if_passed_nan(self, parameter_values):
|
@@ -327,8 +327,11 @@ class ParameterExpression:
|
|
327
327
|
def __mul__(self, other):
|
328
328
|
return self._apply_operation(operator.mul, other)
|
329
329
|
|
330
|
+
def __pos__(self):
|
331
|
+
return self._apply_operation(operator.mul, 1)
|
332
|
+
|
330
333
|
def __neg__(self):
|
331
|
-
return self._apply_operation(operator.mul, -1
|
334
|
+
return self._apply_operation(operator.mul, -1)
|
332
335
|
|
333
336
|
def __rmul__(self, other):
|
334
337
|
return self._apply_operation(operator.mul, other, reflected=True)
|
@@ -401,8 +404,8 @@ class ParameterExpression:
|
|
401
404
|
except (TypeError, RuntimeError) as exc:
|
402
405
|
if self.parameters:
|
403
406
|
raise TypeError(
|
404
|
-
"ParameterExpression with unbound parameters ({}) "
|
405
|
-
"cannot be cast to a complex."
|
407
|
+
f"ParameterExpression with unbound parameters ({self.parameters}) "
|
408
|
+
"cannot be cast to a complex."
|
406
409
|
) from None
|
407
410
|
raise TypeError("could not cast expression to complex") from exc
|
408
411
|
|
@@ -413,13 +416,13 @@ class ParameterExpression:
|
|
413
416
|
except (TypeError, RuntimeError) as exc:
|
414
417
|
if self.parameters:
|
415
418
|
raise TypeError(
|
416
|
-
"ParameterExpression with unbound parameters ({}) "
|
417
|
-
"cannot be cast to a float."
|
419
|
+
f"ParameterExpression with unbound parameters ({self.parameters}) "
|
420
|
+
"cannot be cast to a float."
|
418
421
|
) from None
|
419
422
|
# In symengine, if an expression was complex at any time, its type is likely to have
|
420
423
|
# stayed "complex" even when the imaginary part symbolically (i.e. exactly)
|
421
|
-
# cancelled out. Sympy tends to more aggressively
|
422
|
-
# real. This second attempt at a cast is a way of unifying the
|
424
|
+
# cancelled out. Sympy tends to more aggressively recognize these as symbolically
|
425
|
+
# real. This second attempt at a cast is a way of unifying the behavior to the
|
423
426
|
# more expected form for our users.
|
424
427
|
cval = complex(self)
|
425
428
|
if cval.imag == 0.0:
|
@@ -433,8 +436,8 @@ class ParameterExpression:
|
|
433
436
|
except RuntimeError as exc:
|
434
437
|
if self.parameters:
|
435
438
|
raise TypeError(
|
436
|
-
"ParameterExpression with unbound parameters ({}) "
|
437
|
-
"cannot be cast to an int."
|
439
|
+
f"ParameterExpression with unbound parameters ({self.parameters}) "
|
440
|
+
"cannot be cast to an int."
|
438
441
|
) from None
|
439
442
|
raise TypeError("could not cast expression to int") from exc
|
440
443
|
|
qiskit/circuit/parametertable.py
CHANGED
@@ -12,197 +12,8 @@
|
|
12
12
|
"""
|
13
13
|
Look-up table for variable parameters in QuantumCircuit.
|
14
14
|
"""
|
15
|
-
import operator
|
16
|
-
import typing
|
17
|
-
from collections.abc import MappingView, MutableMapping, MutableSet
|
18
15
|
|
19
|
-
|
20
|
-
class ParameterReferences(MutableSet):
|
21
|
-
"""A set of instruction parameter slot references.
|
22
|
-
Items are expected in the form ``(instruction, param_index)``. Membership
|
23
|
-
testing is overridden such that items that are otherwise value-wise equal
|
24
|
-
are still considered distinct if their ``instruction``\\ s are referentially
|
25
|
-
distinct.
|
26
|
-
|
27
|
-
In the case of the special value :attr:`.ParameterTable.GLOBAL_PHASE` for ``instruction``, the
|
28
|
-
``param_index`` should be ``None``.
|
29
|
-
"""
|
30
|
-
|
31
|
-
def _instance_key(self, ref):
|
32
|
-
return (id(ref[0]), ref[1])
|
33
|
-
|
34
|
-
def __init__(self, refs):
|
35
|
-
self._instance_ids = {}
|
36
|
-
|
37
|
-
for ref in refs:
|
38
|
-
if not isinstance(ref, tuple) or len(ref) != 2:
|
39
|
-
raise ValueError("refs must be in form (instruction, param_index)")
|
40
|
-
k = self._instance_key(ref)
|
41
|
-
self._instance_ids[k] = ref[0]
|
42
|
-
|
43
|
-
def __getstate__(self):
|
44
|
-
# Leave behind the reference IDs (keys of _instance_ids) since they'll
|
45
|
-
# be incorrect after unpickling on the other side.
|
46
|
-
return list(self)
|
47
|
-
|
48
|
-
def __setstate__(self, refs):
|
49
|
-
# Recompute reference IDs for the newly unpickled instructions.
|
50
|
-
self._instance_ids = {self._instance_key(ref): ref[0] for ref in refs}
|
51
|
-
|
52
|
-
def __len__(self):
|
53
|
-
return len(self._instance_ids)
|
54
|
-
|
55
|
-
def __iter__(self):
|
56
|
-
for (_, idx), instruction in self._instance_ids.items():
|
57
|
-
yield (instruction, idx)
|
58
|
-
|
59
|
-
def __contains__(self, x) -> bool:
|
60
|
-
return self._instance_key(x) in self._instance_ids
|
61
|
-
|
62
|
-
def __repr__(self) -> str:
|
63
|
-
return f"ParameterReferences({repr(list(self))})"
|
64
|
-
|
65
|
-
def add(self, value):
|
66
|
-
"""Adds a reference to the listing if it's not already present."""
|
67
|
-
k = self._instance_key(value)
|
68
|
-
self._instance_ids[k] = value[0]
|
69
|
-
|
70
|
-
def discard(self, value):
|
71
|
-
k = self._instance_key(value)
|
72
|
-
self._instance_ids.pop(k, None)
|
73
|
-
|
74
|
-
def copy(self):
|
75
|
-
"""Create a shallow copy."""
|
76
|
-
return ParameterReferences(self)
|
77
|
-
|
78
|
-
|
79
|
-
class ParameterTable(MutableMapping):
|
80
|
-
"""Class for tracking references to circuit parameters by specific
|
81
|
-
instruction instances.
|
82
|
-
|
83
|
-
Keys are parameters. Values are of type :class:`~ParameterReferences`,
|
84
|
-
which overrides membership testing to be referential for instructions,
|
85
|
-
and is set-like. Elements of :class:`~ParameterReferences`
|
86
|
-
are tuples of ``(instruction, param_index)``.
|
87
|
-
"""
|
88
|
-
|
89
|
-
__slots__ = ["_table", "_keys", "_names"]
|
90
|
-
|
91
|
-
class _GlobalPhaseSentinel:
|
92
|
-
__slots__ = ()
|
93
|
-
|
94
|
-
def __copy__(self):
|
95
|
-
return self
|
96
|
-
|
97
|
-
def __deepcopy__(self, memo=None):
|
98
|
-
return self
|
99
|
-
|
100
|
-
def __reduce__(self):
|
101
|
-
return (operator.attrgetter("GLOBAL_PHASE"), (ParameterTable,))
|
102
|
-
|
103
|
-
def __repr__(self):
|
104
|
-
return "<global-phase sentinel>"
|
105
|
-
|
106
|
-
GLOBAL_PHASE = _GlobalPhaseSentinel()
|
107
|
-
"""Tracking object to indicate that a reference refers to the global phase of a circuit."""
|
108
|
-
|
109
|
-
def __init__(self, mapping=None):
|
110
|
-
"""Create a new instance, initialized with ``mapping`` if provided.
|
111
|
-
|
112
|
-
Args:
|
113
|
-
mapping (Mapping[Parameter, ParameterReferences]):
|
114
|
-
Mapping of parameter to the set of parameter slots that reference
|
115
|
-
it.
|
116
|
-
|
117
|
-
Raises:
|
118
|
-
ValueError: A value in ``mapping`` is not a :class:`~ParameterReferences`.
|
119
|
-
"""
|
120
|
-
if mapping is not None:
|
121
|
-
if any(not isinstance(refs, ParameterReferences) for refs in mapping.values()):
|
122
|
-
raise ValueError("Values must be of type ParameterReferences")
|
123
|
-
self._table = mapping.copy()
|
124
|
-
else:
|
125
|
-
self._table = {}
|
126
|
-
|
127
|
-
self._keys = set(self._table)
|
128
|
-
self._names = {x.name: x for x in self._table}
|
129
|
-
|
130
|
-
def __getitem__(self, key):
|
131
|
-
return self._table[key]
|
132
|
-
|
133
|
-
def __setitem__(self, parameter, refs):
|
134
|
-
"""Associate a parameter with the set of parameter slots ``(instruction, param_index)``
|
135
|
-
that reference it.
|
136
|
-
|
137
|
-
.. note::
|
138
|
-
|
139
|
-
Items in ``refs`` are considered unique if their ``instruction`` is referentially
|
140
|
-
unique. See :class:`~ParameterReferences` for details.
|
141
|
-
|
142
|
-
Args:
|
143
|
-
parameter (Parameter): the parameter
|
144
|
-
refs (Union[ParameterReferences, Iterable[(Instruction, int)]]): the parameter slots.
|
145
|
-
If this is an iterable, a new :class:`~ParameterReferences` is created from its
|
146
|
-
contents.
|
147
|
-
"""
|
148
|
-
if not isinstance(refs, ParameterReferences):
|
149
|
-
refs = ParameterReferences(refs)
|
150
|
-
|
151
|
-
self._table[parameter] = refs
|
152
|
-
self._keys.add(parameter)
|
153
|
-
self._names[parameter.name] = parameter
|
154
|
-
|
155
|
-
def get_keys(self):
|
156
|
-
"""Return a set of all keys in the parameter table
|
157
|
-
|
158
|
-
Returns:
|
159
|
-
set: A set of all the keys in the parameter table
|
160
|
-
"""
|
161
|
-
return self._keys
|
162
|
-
|
163
|
-
def get_names(self):
|
164
|
-
"""Return a set of all parameter names in the parameter table
|
165
|
-
|
166
|
-
Returns:
|
167
|
-
set: A set of all the names in the parameter table
|
168
|
-
"""
|
169
|
-
return self._names.keys()
|
170
|
-
|
171
|
-
def parameter_from_name(self, name: str, default: typing.Any = None):
|
172
|
-
"""Get a :class:`.Parameter` with references in this table by its string name.
|
173
|
-
|
174
|
-
If the parameter is not present, return the ``default`` value.
|
175
|
-
|
176
|
-
Args:
|
177
|
-
name: The name of the :class:`.Parameter`
|
178
|
-
default: The object that should be returned if the parameter is missing.
|
179
|
-
"""
|
180
|
-
return self._names.get(name, default)
|
181
|
-
|
182
|
-
def discard_references(self, expression, key):
|
183
|
-
"""Remove all references to parameters contained within ``expression`` at the given table
|
184
|
-
``key``. This also discards parameter entries from the table if they have no further
|
185
|
-
references. No action is taken if the object is not tracked."""
|
186
|
-
for parameter in expression.parameters:
|
187
|
-
if (refs := self._table.get(parameter)) is not None:
|
188
|
-
if len(refs) == 1:
|
189
|
-
del self[parameter]
|
190
|
-
else:
|
191
|
-
refs.discard(key)
|
192
|
-
|
193
|
-
def __delitem__(self, key):
|
194
|
-
del self._table[key]
|
195
|
-
self._keys.discard(key)
|
196
|
-
del self._names[key.name]
|
197
|
-
|
198
|
-
def __iter__(self):
|
199
|
-
return iter(self._table)
|
200
|
-
|
201
|
-
def __len__(self):
|
202
|
-
return len(self._table)
|
203
|
-
|
204
|
-
def __repr__(self):
|
205
|
-
return f"ParameterTable({repr(self._table)})"
|
16
|
+
from collections.abc import MappingView
|
206
17
|
|
207
18
|
|
208
19
|
class ParameterView(MappingView):
|
@@ -87,7 +87,7 @@ class ParameterVector:
|
|
87
87
|
return f"{self.name}, {[str(item) for item in self.params]}"
|
88
88
|
|
89
89
|
def __repr__(self):
|
90
|
-
return f"{self.__class__.__name__}(name={self.name}, length={len(self)})"
|
90
|
+
return f"{self.__class__.__name__}(name={repr(self.name)}, length={len(self)})"
|
91
91
|
|
92
92
|
def resize(self, length):
|
93
93
|
"""Resize the parameter vector. If necessary, new elements are generated.
|