Source code for braket.circuits.noise_model.criteria_input_parsing
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You
# may not use this file except in compliance with the License. A copy of
# the License is located at
#
# http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.
from collections.abc import Iterable
from typing import Optional, Union
from braket.circuits.quantum_operator import QuantumOperator
from braket.registers.qubit_set import QubitSetInput
[docs]
def parse_operator_input(
operators: Union[QuantumOperator, Iterable[QuantumOperator]],
) -> Optional[set[QuantumOperator]]:
"""Processes the quantum operator input to __init__ to validate and return a set of
QuantumOperators.
Args:
operators (Union[QuantumOperator, Iterable[QuantumOperator]]): QuantumOperator input.
Returns:
Optional[set[QuantumOperator]]: The set of relevant QuantumOperators or None if none
is specified.
Throws:
ValueError: If no quantum operator are provided, if the quantum operator don't all operate
on the same number of qubits.
"""
if not operators:
return None
if not isinstance(operators, Iterable):
return {operators}
fixed_qubit_counts = {operator.fixed_qubit_count() for operator in operators}
if len(fixed_qubit_counts) != 1:
raise ValueError("All operators in a criteria must operate on the same number of qubits.")
return set(operators)
[docs]
def parse_qubit_input(
qubits: Optional[QubitSetInput], expected_qubit_count: Optional[int] = 0
) -> Optional[set[Union[int, tuple[int]]]]:
"""Processes the qubit input to __init__ to validate and return a set of qubit targets.
Args:
qubits (Optional[QubitSetInput]): Qubit input.
expected_qubit_count (Optional[int]): The expected number of qubits that the input
gates operates on. If the value is non-zero, this method will validate that the
expected qubit count matches the actual qubit count. Default is 0.
Returns:
Optional[set[Union[int, tuple[int]]]]: The set of qubit targets, or None if no qubits
are specified.
"""
if qubits is None:
return None
if not isinstance(qubits, Iterable):
return {int(qubits)}
if len(qubits) == 0:
return None
types = {type(item) for item in qubits}
if len(types) != 1:
raise TypeError("Qubit targets must be all the same type.")
qubit_count = (
expected_qubit_count if expected_qubit_count is not None and expected_qubit_count > 0 else 1
)
if isinstance(qubits[0], Iterable):
qubit_count = (
expected_qubit_count
if expected_qubit_count is not None and expected_qubit_count > 0
else len(qubits[0])
)
target_set_all_same = all(len(item) == qubit_count for item in qubits)
if not target_set_all_same:
raise ValueError(f"Qubits must all target {qubit_count}-qubit operations.")
if qubit_count == 1:
return {item[0] for item in qubits}
return {tuple(item) for item in qubits}
return {tuple(qubits)} if qubit_count > 1 else set(qubits)