Skip to content

Commit

Permalink
Reshaped string parameter assignment
Browse files Browse the repository at this point in the history
Corrected mistake in string assignment

Corrected mistake in string assignment
  • Loading branch information
arthurostrauss committed Apr 26, 2024
1 parent 19efe66 commit 6a58f19
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 31 deletions.
43 changes: 14 additions & 29 deletions qiskit/pulse/parameter_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
from qiskit.pulse.library import SymbolicPulse, Waveform
from qiskit.pulse.schedule import Schedule, ScheduleBlock
from qiskit.pulse.transforms.alignments import AlignmentKind
from qiskit.pulse.utils import format_parameter_value
from qiskit.pulse.utils import format_parameter_value, _validate_parameter_vector


class NodeVisitor:
Expand Down Expand Up @@ -411,38 +411,23 @@ def _unroll_param_dict(
A dictionary from parameter to value.
"""
out = {}
param_name_dict = {param.name: param for param in self.parameters}
param_vec_dict = {
param.vector.name: param.vector
for param in self.parameters
if isinstance(param, ParameterVectorElement)
}
for parameter, value in parameter_binds.items():
if isinstance(parameter, ParameterVector):
if not isinstance(value, Sequence):
raise PulseError(
f"Parameter vector '{parameter.name}' has length {len(parameter)},"
f" but was assigned to {value}."
)
if len(parameter) != len(value):
raise PulseError(
f"Parameter vector '{parameter.name}' has length {len(parameter)},"
f" but was assigned to {len(value)} values."
)
_validate_parameter_vector(parameter, value)
out.update(zip(parameter, value))
elif isinstance(parameter, str):
for param in self.parameters:
if param.name == parameter:
out[param] = value
elif (
isinstance(param, ParameterVectorElement) and param.vector.name == parameter
):
if not isinstance(value, Sequence):
raise PulseError(
f"ParameterVector '{param.vector.name}' has length {len(param.vector)},"
f" but was assigned to a single value."
)
if len(param.vector) != len(value):
raise PulseError(
f"ParameterVector '{param.vector.name}' has length {len(param.vector)},"
f" but was assigned to {len(value)} values."
)
out[param] = value[param.index]

if parameter in param_vec_dict:
param = param_vec_dict[parameter]
_validate_parameter_vector(param, value)
out.update(zip(param, value))
elif parameter in param_name_dict:
out[param_name_dict[parameter]] = value
else:
out[parameter] = value
return out
19 changes: 17 additions & 2 deletions qiskit/pulse/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,14 @@
# that they have been altered from the originals.

"""Module for common pulse programming utilities."""
from typing import List, Dict, Union
from typing import List, Dict, Union, Sequence
import warnings

import numpy as np

from qiskit.circuit import ParameterVector
from qiskit.circuit.parameterexpression import ParameterExpression
from qiskit.pulse.exceptions import UnassignedDurationError, QiskitError
from qiskit.pulse.exceptions import UnassignedDurationError, QiskitError, PulseError


def format_meas_map(meas_map: List[List[int]]) -> Dict[int, List[int]]:
Expand Down Expand Up @@ -117,3 +118,17 @@ def instruction_duration_validation(duration: int):
raise QiskitError(
f"Instruction duration must be a non-negative integer, got {duration} instead."
)


def _validate_parameter_vector(parameter: ParameterVector, value):
"""Validate parameter vector and its value."""
if not isinstance(value, Sequence):
raise PulseError(
f"Parameter vector '{parameter.name}' has length {len(parameter)},"
f" but was assigned to {value}."
)
if len(parameter) != len(value):
raise PulseError(
f"Parameter vector '{parameter.name}' has length {len(parameter)},"
f" but was assigned to {len(value)} values."
)

0 comments on commit 6a58f19

Please sign in to comment.