from typing import Any, Dict, List, Optional, Tuple, Union
from pydantic.v1 import BaseModel, Field
from braket.schema_common import BraketSchemaBase, BraketSchemaHeader
[docs]
class InstructionArgument(BaseModel):
"""
Defines an Instruction argument
Attributes:
name: The argument name
value: The value of the argument
type: The string name of the argument's value type
optional: The boolean to represent if argument is optional or not
"""
name: str
value: Any
type: str
optional: bool = False
[docs]
class Instruction(BaseModel):
"""
Defines a Native Gate Calibration Instruction
Attributes:
instructionName: The name of the instruction
arguments: List of instruction's argument
"""
name: str
arguments: Optional[List[InstructionArgument]]
[docs]
class PulseFunctionArgument(BaseModel):
"""
Defines a pulse function argument
Attributes:
name: The argument name
value: The value of the argument
type: The string name of the argument's value type
optional: The boolean to represent if argumenet is optional or not
"""
name: str
value: Any
type: str
optional: bool = False
[docs]
class PulseFunction(BaseModel):
"""
Defines a pulse function used in native gate calibrations
Attributes:
name: The name of the pulse function
arguments: List of the pulse function's arguments
"""
name: str
arguments: List[PulseFunctionArgument]
[docs]
class NativeGate(BaseModel):
"""
Defines a native gate
Attributes:
name: The name of the native gate
qubits: The name of qubits that the gate acts on
arguments: The list of the native gate's argument
calibrations: List of instructions/pulse functions
"""
name: str
qubits: List[str]
arguments: List[str]
calibrations: List[Union[Instruction, PulseFunction]]
[docs]
class NativeGateCalibrations(BraketSchemaBase):
"""
Defines the structure of how native gates will be represented
Attributes:
gates: Nested dictionary with an outer and inner key.
Outer key will be the qubit and inner key will be the gate name.
waveforms: Dictionary that holds waveform ID as the key and waveform as the value
Examples:
>>> input_json = {
... "braketSchemaHeader": {
... "name": "braket.device_schema.pulse.native_gate_calibrations",
... "version": "1",
... },
... "gates":
... {
... "0": {
... "rx": [{"name": "rx", "qubits": ["0"], "arguments": ["-1.5707963267948966"], "calibrations": [
... {"name": "barrier", "arguments": [{"name": "qubit", "value": "0", "type": "string"}]},
... {"name": "play", "arguments": [{"name": "frame", "value": "q0_rf_frame", "type": "frame"},
... {"name": "waveform", "value": "wf_drag_gaussian_0", "type": "waveform"}]},
... {"name": "barrier", "arguments": [{"name": "qubit", "value": "0", "type": "string"}]
... },
... .
... .
... },
... .
... .
... .
... },
... "waveforms": {
... "q0_q1_cz_CZ": {"waveformId": "q0_q1_cz_CZ", "amplitudes": [[0.0, 0.0], [0.0, 0.0], ...]},
... "wf_drag_gaussian_0": {"waveformId": "wf_drag_gaussian_0", "name": "drag_gaussian" , "arguments": [
... {"name": "length", "value": 6.000000000000001e-08, "type": "float"},
... {"name": "sigma", "value": 6.369913502160144e-09, "type": "float"},
... {"name": "amplitude", "value": -0.4549282253548838, "type": "float"},
... {"name": "beta", "value": 7.494904522022295e-10, "type": "float"}]}
... .
... .
... .
... }
... }
>>> NativeGateCalibrations.parse_raw_schema(json.dumps(input_json))
""" # noqa: E501
_PROGRAM_HEADER = BraketSchemaHeader(
name="braket.device_schema.pulse.native_gate_calibrations", version="1"
)
braketSchemaHeader: BraketSchemaHeader = Field(default=_PROGRAM_HEADER, const=_PROGRAM_HEADER)
gates: Dict[str, Dict[str, List[NativeGate]]]
waveforms: Dict[str, Union[TemplateWaveform, ArbitraryWaveform]]