class JobResponseSchema(BaseSchema): """Schema for IBMQJob. Schema for an `IBMQJob`. The following conventions are in use in order to provide enough flexibility in regards to attributes: * the "Required properties" reflect attributes that will always be present in the model. * the "Optional properties with a default value" reflect attributes that are always present in the model, but might contain uninitialized values depending on the state of the job. * some properties are prepended by underscore due to name clashes and extra constraints in the IBMQJob class (for example, existing IBMQJob methods that have the same name as a response field). The schema is used for GET Jobs, GET Jobs/{id}, and POST Jobs responses. """ # pylint: disable=invalid-name # Required properties. _creation_date = DateTime(required=True) kind = Enum(required=True, enum_cls=ApiJobKind) _job_id = String(required=True) _api_status = Enum(required=True, enum_cls=ApiJobStatus) # Optional properties with a default value. _name = String(missing=None) shots = Integer(validate=Range(min=0), missing=None) _time_per_step = Dict(keys=String, values=String, missing=None) _result = Nested(ResultSchema, missing=None) _qobj = Nested(QobjSchema, missing=None) _error = Nested(JobResponseErrorSchema, missing=None) # Optional properties _backend_info = Nested(JobResponseBackendSchema) allow_object_storage = Boolean() error = String() @pre_load def preprocess_field_names(self, data, **_): # type: ignore """Pre-process the job response fields. Rename selected fields of the job response due to name clashes, and convert from camel-case the rest of the fields. TODO: when updating to terra 0.10, check if changes related to marshmallow 3 allow to use directly `data_key`, as in 0.9 terra duplicates the unknown keys. """ rename_map = {} for field_name in data: if field_name in FIELDS_MAP: rename_map[field_name] = FIELDS_MAP[field_name] else: rename_map[field_name] = to_python_identifier(field_name) for old_name, new_name in rename_map.items(): data[new_name] = data.pop(old_name) return data
class QasmQobjExperimentSchema(QobjExperimentSchema): """Schema for QasmQobjExperiment.""" # Required properties. instructions = Nested(QasmQobjInstructionSchema, required=True, many=True) # Optional properties. config = Nested(QasmQobjExperimentConfigSchema)
class PulseQobjExperimentSchema(QobjExperimentSchema): """Schema for PulseQobjExperiment.""" # Required properties. instructions = Nested(PulseQobjInstructionSchema, required=True, many=True, validate=Length(min=1)) # Optional properties. config = Nested(PulseQobjExperimentConfigSchema)
class QobjExperimentSchema(BaseSchema): """Base Schema for QobjExperiment.""" # Required properties. instructions = Nested(QobjInstructionSchema, required=True, many=True) # Optional properties. header = Nested(QobjExperimentHeaderSchema) config = Nested(QobjExperimentConfigSchema)
class PulseQobjSchema(QobjSchema): """Schema for PulseQobj.""" # Required properties. config = Nested(PulseQobjConfigSchema, required=True) experiments = Nested(PulseQobjExperimentSchema, required=True, many=True) type = String(required=True, validate=Equal(QobjType.PULSE), missing=QobjType.PULSE)
class ExperimentResultDataSchema(BaseSchema): """Schema for ExperimentResultData.""" counts = Nested(ObjSchema, validate=PatternProperties( {Regexp('^0x([0-9A-Fa-f])+$'): Integer()})) snapshots = Nested(ObjSchema) memory = List(Raw(), validate=Length(min=1)) statevector = List(Complex(), validate=Length(min=1)) unitary = List(List(Complex(), validate=Length(min=1)), validate=Length(min=1))
class QobjSchema(BaseSchema): """Schema for Qobj.""" # Required properties. qobj_id = String(required=True) schema_version = String(required=True, missing=QOBJ_VERSION) # Required properties depend on Qobj type. config = Nested(QobjConfigSchema, required=True) experiments = Nested(QobjExperimentSchema, required=True, many=True) header = Nested(QobjHeaderSchema, required=True) type = String(required=True, validate=OneOf(choices=(QobjType.QASM, QobjType.PULSE)))
class PulseDefaultsSchema(BaseSchema): """Schema for PulseDefaults.""" # Required properties. qubit_freq_est = List(Number(), required=True, validate=Length(min=1)) meas_freq_est = List(Number(), required=True, validate=Length(min=1)) buffer = Integer(required=True, validate=Range(min=0)) pulse_library = Nested(PulseLibraryItemSchema, required=True, many=True) cmd_def = Nested(CommandSchema, many=True, required=True) # Optional properties. meas_kernel = Nested(MeasurementKernelSchema) discriminator = Nested(DiscriminatorSchema)
class JobResponseSchema(BaseSchema): """Schema for ``IBMQJob``. The following conventions are in use in order to provide enough flexibility in regards to attributes: * the "Required properties" reflect attributes that will always be present in the model. * the "Optional properties with a default value" reflect attributes that are always present in the model, but might contain uninitialized values depending on the state of the job. * some properties are prepended by underscore due to name clashes and extra constraints in the ``IBMQJob`` class (for example, existing ``IBMQJob`` methods that have the same name as a response field). The schema is used for ``GET /Jobs``, ``GET /Jobs/{id}``, and ``POST /Jobs`` responses. """ # pylint: disable=invalid-name # Required properties. _creation_date = DateTime(required=True) _job_id = String(required=True) _api_status = Enum(required=True, enum_cls=ApiJobStatus) # Optional properties with a default value. kind = Enum(enum_cls=ApiJobKind, missing=None) _name = String(missing=None) _time_per_step = Dict(keys=String, values=String, missing=None) _result = Nested(ResultSchema, missing=None) _qobj = Raw(missing=None) _error = Nested(JobResponseErrorSchema, missing=None) _tags = List(String, missing=[]) _run_mode = String(missing=None) # Optional properties _backend_info = Nested(JobResponseBackendSchema) allow_object_storage = Boolean() @pre_load def preprocess_field_names(self, data, **_): # type: ignore """Pre-process the job response fields. Rename selected fields of the job response due to name clashes, and convert the rest of the fields to Python convention. TODO: when updating to terra 0.10, check if changes related to marshmallow 3 allow to use directly `data_key`, as in 0.9 terra duplicates the unknown keys. """ return map_field_names(FIELDS_MAP, data)
class PulseQobjSchema(QobjSchema): """Schema for PulseQobj.""" # Required properties. config = Nested(PulseQobjConfigSchema, required=True) experiments = Nested(PulseQobjExperimentSchema, required=True, many=True) type = String(required=True, validate=Equal(QobjType.PULSE)) @pre_load def add_type(self, data, **_): """Add the Qobj type (PULSE) on loading.""" data['type'] = QobjType.PULSE.value return data
class ResultSchema(BaseSchema): """Schema for Result.""" # Required fields. backend_name = String(required=True) backend_version = String(required=True, validate=Regexp('[0-9]+.[0-9]+.[0-9]+$')) qobj_id = String(required=True) job_id = String(required=True) success = Boolean(required=True) results = Nested(ExperimentResultSchema, required=True, many=True) # Optional fields. date = DateTime() status = String() header = Nested(ObjSchema)
class UserInfoResponseSchema(BaseSchema): """Schema for UserInfoResponse.""" # Required properties. urls = Nested(UserApiUrlResponseSchema, required=True, description='base URLs for the services. Currently supported keys: ' 'http and ws')
class BackendConfigurationSchema(BaseSchema): """Schema for BackendConfiguration.""" # Required properties. backend_name = String(required=True) backend_version = String(required=True, validate=Regexp("[0-9]+.[0-9]+.[0-9]+$")) n_qubits = Integer(required=True, validate=Range(min=1)) basis_gates = List(String(), required=True, validate=Length(min=1)) gates = Nested(GateConfigSchema, required=True, many=True, validate=Length(min=1)) local = Boolean(required=True) simulator = Boolean(required=True) conditional = Boolean(required=True) memory = Boolean(required=True) max_shots = Integer(required=True, validate=Range(min=1)) open_pulse = Boolean(required=True) # Optional properties. max_experiments = Integer(validate=Range(min=1)) sample_name = String() coupling_map = List(List(Integer(), validate=Length(min=1)), validate=Length(min=1), allow_none=True) n_registers = Integer(validate=Range(min=1)) register_map = List(List(Integer(validate=OneOf([0, 1])), validate=Length(min=1)), validate=Length(min=1)) configurable = Boolean() credits_required = Boolean() online_date = DateTime() display_name = String() description = String() tags = List(String())
class BackendPropertiesSchema(BaseSchema): """Schema for BackendProperties.""" # Required properties. backend_name = String(required=True) backend_version = String(required=True, validate=Regexp("[0-9]+.[0-9]+.[0-9]+$")) last_update_date = DateTime(required=True) qubits = List(Nested(NduvSchema, many=True, validate=Length(min=1)), required=True, validate=Length(min=1)) gates = Nested(GateSchema, required=True, many=True, validate=Length(min=1)) general = Nested(NduvSchema, required=True, many=True)
class PulseBackendConfigurationSchema(QasmBackendConfigurationSchema): """Schema for pulse backend""" # Required properties. open_pulse = Boolean(required=True, validate=OneOf([True])) n_uchannels = Integer(required=True, validate=Range(min=0)) u_channel_lo = List( Nested(UchannelLOSchema, validate=Length(min=1), required=True, many=True)) meas_levels = List(Integer(), validate=Length(min=1), required=True) qubit_lo_range = List(List(Float(validate=Range(min=0)), validate=Length(equal=2)), required=True) meas_lo_range = List(List(Float(validate=Range(min=0)), validate=Length(equal=2)), required=True) dt = Float(required=True, validate=Range(min=0)) # pylint: disable=invalid-name dtm = Float(required=True, validate=Range(min=0)) rep_times = List(Float(validate=Range(min=0)), required=True) meas_kernels = List(String(), required=True) discriminators = List(String(), required=True) # Optional properties. meas_map = List(List(Integer(), validate=Length(min=1))) channel_bandwidth = List(List(Float(), validate=Length(equal=2))) acquisition_latency = List(List(Integer())) conditional_latency = List(List(Integer())) hamiltonian = PulseHamiltonianSchema()
class ExperimentResultSchema(BaseSchema): """Schema for ExperimentResult.""" # Required fields. shots = ByType([ Integer(), List(Integer(validate=Range(min=1)), validate=Length(equal=2)) ], required=True) success = Boolean(required=True) data = Nested(ExperimentResultDataSchema, required=True) # Optional fields. status = String() seed = Integer() meas_return = String(validate=OneOf(['single', 'avg'])) header = Nested(ObjSchema)
class ExperimentResultSchema(BaseSchema): """Schema for ExperimentResult.""" # Required fields. shots = ByType([Integer(), List(Integer(validate=Range(min=1)), validate=Length(equal=2))], required=True) success = Boolean(required=True) data = Nested(ExperimentResultDataSchema, required=True) # Optional fields. status = String() seed = Integer() meas_level = Integer(validate=Range(min=0, max=2)) meas_return = String(validate=OneOf(choices=(MeasReturnType.AVERAGE, MeasReturnType.SINGLE))) header = Nested(ObjSchema)
class StatusResponseSchema(BaseSchema): """Schema for StatusResponse""" # Optional properties infoQueue = Nested(InfoQueueResponseSchema, required=False) # Required properties status = String(required=True, validate=OneOf([status.value for status in ApiJobStatus]))
class QobjSchema(BaseSchema): """Schema for Qobj.""" # Required properties. qobj_id = String(required=True) schema_version = String(required=True) # Required properties depend on Qobj type. config = Nested(QobjConfigSchema, required=True) experiments = Nested(QobjExperimentSchema, required=True, many=True) header = Nested(QobjHeaderSchema, required=True) type = String(required=True, validate=OneOf(choices=(QobjType.QASM, QobjType.PULSE))) @pre_load def add_schema_version(self, data, **_): """Add the schema version on loading.""" data['schema_version'] = QOBJ_VERSION return data
class CommandSchema(BaseSchema): """Schema for Command.""" # Required properties. name = String(required=True) # Optional properties. qubits = List(Integer(validate=Range(min=0)), validate=Length(min=1)) sequence = Nested(PulseQobjInstructionSchema, many=True)
class QasmQobjInstructionSchema(QobjInstructionSchema): """Schema for QasmQobjInstruction.""" # Optional properties. qubits = List(Integer(validate=Range(min=0)), validate=Length(min=1)) params = List(InstructionParameter()) memory = List(Integer(validate=Range(min=0)), validate=Length(min=1)) conditional = Nested(QobjConditionalSchema)
class GateSchema(BaseSchema): """Schema for Gate.""" # Required properties. qubits = List(Integer(), required=True, validate=Length(min=1)) gate = String(required=True) parameters = Nested(NduvSchema, required=True, many=True, validate=Length(min=1))
class PulseQobjInstructionSchema(QobjInstructionSchema): """Schema for PulseQobjInstruction.""" # pylint: disable=invalid-name # Required properties t0 = Integer(required=True, validate=Range(min=0)) # Optional properties. ch = String(validate=Regexp('[dum]([0-9])+')) conditional = Integer(validate=Range(min=0)) val = ByType([Complex(), String()]) phase = ByType([Float(), String()]) duration = Integer(validate=Range(min=1)) qubits = List(Integer(validate=Range(min=0)), validate=Length(min=1)) memory_slot = List(Integer(validate=Range(min=0)), validate=Length(min=1)) register_slot = List(Integer(validate=Range(min=0)), validate=Length(min=1)) kernels = Nested(QobjMeasurementOptionSchema, many=True) discriminators = Nested(QobjMeasurementOptionSchema, many=True) label = String() type = String()
class JobsRequestSchema(BaseSchema): """Schema for JobsRequest""" # Optional properties name = String(required=False, description="custom name to be assigned to the job.") # Required properties qObject = Dict(required=True, description="the Qobj to be executed, as a dictionary.") backend = Nested(BackendRequestSchema, required=True)
class QobjInstructionSchema(BaseSchema): """Schema for QobjInstruction.""" # Required properties. name = String(required=True) # Optional properties. qubits = List(Integer(validate=Range(min=0)), validate=Length(min=1)) params = List(InstructionParameter()) memory = List(Integer(validate=Range(min=0)), validate=Length(min=1)) conditional = Nested(QobjConditionalSchema)
class PulseQobjConfigSchema(QobjConfigSchema): """Schema for PulseQobjConfig.""" # Required properties. # TODO : check if they are always required by backend meas_level = Integer(required=True, validate=Range(min=0, max=2)) memory_slot_size = Integer(required=True) pulse_library = Nested(QobjPulseLibrarySchema, many=True, required=True) qubit_lo_freq = List(Number(), required=True) meas_lo_freq = List(Number(), required=True) rep_time = Integer(required=True) meas_return = String(validate=OneOf(choices=(MeasReturnType.AVERAGE, MeasReturnType.SINGLE)))
class CircuitResponseSchema(BaseSchema): """Schema for CircuitResponse""" # pylint: disable=invalid-name # Optional properties error = Dict(Nested(CircuitErrorResponseSchema), required=False) # Required properties id = String(required=True, description="the job ID of an already submitted job.") creationDate = String(required=True, description="when the job was run.") status = String( required=True, description="`status` field directly from the API response.")
class PulseQobjConfigSchema(QobjConfigSchema): """Schema for PulseQobjConfig of device backend.""" # Required properties. meas_level = Integer(required=True, validate=Range(min=0, max=2)) meas_return = String(required=True, validate=OneOf(choices=(MeasReturnType.AVERAGE, MeasReturnType.SINGLE))) pulse_library = Nested(PulseLibraryItemSchema, required=True, many=True) qubit_lo_freq = List(Number(validate=Range(min=0)), required=True) meas_lo_freq = List(Number(validate=Range(min=0)), required=True) # Optional properties. memory_slot_size = Integer(validate=Range(min=1)) rep_time = Integer(validate=Range(min=0))
class GroupsResponseSchema(BaseSchema): """Nested schema for HubsResponseSchema""" # Required properties. group_name = String(required=True) group = Nested(GroupResponseSchema, required=True)
class GroupResponseSchema(BaseSchema): """Nested schema for GroupsResponseSchema""" # Required properties. projects = Dict(Nested(ProjectsResponseSchema), required=True)