iqm-station-control-client 11.1.0__tar.gz → 11.3.1__tar.gz
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.
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/CHANGELOG.rst +25 -0
- {iqm_station_control_client-11.1.0/src/iqm_station_control_client.egg-info → iqm_station_control_client-11.3.1}/PKG-INFO +2 -2
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/requirements/base.in +1 -1
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/requirements/base.txt +1 -1
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/iqm_server_client.py +3 -16
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/list_models.py +12 -2
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/station_control.py +7 -7
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/list_with_meta.py +8 -2
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/dut.py +9 -10
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/jobs.py +1 -1
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/static_quantum_architecture.py +22 -1
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/type_aliases.py +6 -6
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/pydantic_base.py +1 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1/src/iqm_station_control_client.egg-info}/PKG-INFO +2 -2
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm_station_control_client.egg-info/requires.txt +1 -1
- iqm_station_control_client-11.3.1/version.txt +1 -0
- iqm_station_control_client-11.1.0/version.txt +0 -1
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/LICENSE.txt +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/MANIFEST.in +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/README.rst +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/API.rst +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/Makefile +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/_static/css/custom.css +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/_static/images/favicon.ico +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/_static/images/logo.png +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/_templates/autosummary-class-template.rst +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/_templates/autosummary-module-template.rst +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/changelog.rst +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/conf.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/index.rst +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/license.rst +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/pyproject.toml +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/requirements/base.in.internal +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/setup.cfg +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/setup.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/__init__.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/__init__.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/error.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/grpc_utils.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/__init__.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/calibration_pb2.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/calibration_pb2.pyi +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/calibration_pb2_grpc.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/common_pb2.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/common_pb2.pyi +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/common_pb2_grpc.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/job_pb2.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/job_pb2.pyi +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/job_pb2_grpc.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/qc_pb2.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/qc_pb2.pyi +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/qc_pb2_grpc.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/uuid_pb2.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/uuid_pb2.pyi +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/uuid_pb2_grpc.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/testing/__init__.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/testing/iqm_server_mock.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/py.typed +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/qon.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/__init__.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/channel_property_serializer.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/datetime_serializers.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/playlist_serializers.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/run_serializers.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/setting_node_serializer.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/struct_serializer.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/sweep_serializers.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/task_serializers.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/utils.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/__init__.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/__init__.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/dynamic_quantum_architecture.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/monitor.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/observation.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/observation_set.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/run.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/sequence.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/sweep.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/py.typed +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/station_control.py +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm_station_control_client.egg-info/SOURCES.txt +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm_station_control_client.egg-info/dependency_links.txt +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm_station_control_client.egg-info/top_level.txt +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/tests/.pylintrc +0 -0
- {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/tests/__init__.py +0 -0
|
@@ -2,6 +2,31 @@
|
|
|
2
2
|
Changelog
|
|
3
3
|
=========
|
|
4
4
|
|
|
5
|
+
Version 11.3.1 (2025-10-27)
|
|
6
|
+
===========================
|
|
7
|
+
|
|
8
|
+
- Bump version for 4.3.1 release. No functional changes.
|
|
9
|
+
|
|
10
|
+
Version 11.3.0 (2025-10-23)
|
|
11
|
+
===========================
|
|
12
|
+
|
|
13
|
+
Bug fixes
|
|
14
|
+
---------
|
|
15
|
+
|
|
16
|
+
- Fix issue with meth:`.IqmServerClient.get_job` which failed to convert the server status (int) correctly
|
|
17
|
+
to :class:`.JobExecutorStatus`.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
Version 11.2.0 (2025-10-06)
|
|
21
|
+
===========================
|
|
22
|
+
|
|
23
|
+
Features
|
|
24
|
+
--------
|
|
25
|
+
|
|
26
|
+
- Deprecate "application/octet-stream" for protobuf data, use "application/protobuf" instead.
|
|
27
|
+
- Deprecate "detail" in server errors, use "message" instead to be consistent with IQM Server.
|
|
28
|
+
- Update dependencies.
|
|
29
|
+
|
|
5
30
|
Version 11.1.0 (2025-10-03)
|
|
6
31
|
===========================
|
|
7
32
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: iqm-station-control-client
|
|
3
|
-
Version: 11.1
|
|
3
|
+
Version: 11.3.1
|
|
4
4
|
Summary: Python client for communicating with Station Control Service
|
|
5
5
|
Author-email: IQM Finland Oy <info@meetiqm.com>
|
|
6
6
|
License: Apache License
|
|
@@ -214,7 +214,7 @@ Requires-Python: >=3.11
|
|
|
214
214
|
Description-Content-Type: text/x-rst
|
|
215
215
|
License-File: LICENSE.txt
|
|
216
216
|
Requires-Dist: iqm-exa-common<28,>=27
|
|
217
|
-
Requires-Dist: iqm-data-definitions<3.0,>=2.
|
|
217
|
+
Requires-Dist: iqm-data-definitions<3.0,>=2.18
|
|
218
218
|
Requires-Dist: opentelemetry-exporter-otlp<2.0,>=1.25.0
|
|
219
219
|
Requires-Dist: protobuf<5.0,>=4.25.3
|
|
220
220
|
Requires-Dist: types-protobuf
|
|
@@ -174,7 +174,7 @@ class IqmServerClient(_StationControlClientBase):
|
|
|
174
174
|
modified_timestamp=to_datetime(job.updated_at),
|
|
175
175
|
begin_timestamp=to_datetime(job.execution_started_at) if job.HasField("execution_started_at") else None,
|
|
176
176
|
end_timestamp=to_datetime(job.execution_ended_at) if job.HasField("execution_ended_at") else None,
|
|
177
|
-
job_status=
|
|
177
|
+
job_status=to_job_executor_status(job.status),
|
|
178
178
|
# Sweep definition is a subclass of SweepBase so we can just copy all SweepBase fields
|
|
179
179
|
# from the input sweep to the sweep data
|
|
180
180
|
**{f.name: getattr(sweep, f.name) for f in dataclasses.fields(SweepBase)},
|
|
@@ -298,7 +298,7 @@ class IqmServerClient(_StationControlClientBase):
|
|
|
298
298
|
job: proto.JobV1 = jobs.GetJobV1(proto.JobLookupV1(id=to_proto_uuid(job_id)))
|
|
299
299
|
return JobData(
|
|
300
300
|
job_id=from_proto_uuid(job.id),
|
|
301
|
-
job_status=job.status,
|
|
301
|
+
job_status=to_job_executor_status(job.status),
|
|
302
302
|
job_result=JobResult(
|
|
303
303
|
job_id=from_proto_uuid(job.id),
|
|
304
304
|
parallel_sweep_progress=[],
|
|
@@ -458,7 +458,7 @@ def payload_to_sweep(job_payload: bytes) -> SweepDefinition:
|
|
|
458
458
|
return sweep
|
|
459
459
|
|
|
460
460
|
|
|
461
|
-
def
|
|
461
|
+
def to_job_executor_status(job_status: proto.JobStatus) -> JobExecutorStatus:
|
|
462
462
|
match job_status:
|
|
463
463
|
case proto.JobStatus.IN_QUEUE:
|
|
464
464
|
return JobExecutorStatus.PENDING_EXECUTION
|
|
@@ -475,19 +475,6 @@ def to_job_status(job_status: proto.JobStatus) -> JobExecutorStatus:
|
|
|
475
475
|
raise ValueError(f"Unknown job status: '{job_status}'")
|
|
476
476
|
|
|
477
477
|
|
|
478
|
-
def to_string_job_status(job_status: proto.JobStatus) -> str:
|
|
479
|
-
match job_status:
|
|
480
|
-
case proto.JobStatus.IN_QUEUE:
|
|
481
|
-
return "PENDING"
|
|
482
|
-
case proto.JobStatus.EXECUTING:
|
|
483
|
-
return "STARTED"
|
|
484
|
-
case proto.JobStatus.FAILED | proto.JobStatus.INTERRUPTED | proto.JobStatus.CANCELLED:
|
|
485
|
-
return "FAILURE"
|
|
486
|
-
case proto.JobStatus.COMPLETED:
|
|
487
|
-
return "SUCCESS"
|
|
488
|
-
raise ValueError(f"Unknown job status: '{job_status}'")
|
|
489
|
-
|
|
490
|
-
|
|
491
478
|
def parse_json(data: bytes) -> Any:
|
|
492
479
|
return json.load(BytesIO(data))
|
|
493
480
|
|
|
@@ -31,14 +31,20 @@ from iqm.station_control.interface.models import (
|
|
|
31
31
|
ObservationUpdate,
|
|
32
32
|
RunLite,
|
|
33
33
|
SequenceMetadataData,
|
|
34
|
+
StaticQuantumArchitecture,
|
|
34
35
|
)
|
|
35
36
|
from iqm.station_control.interface.pydantic_base import PydanticBase
|
|
36
37
|
|
|
37
38
|
T = TypeVar("T")
|
|
38
39
|
|
|
39
40
|
|
|
40
|
-
class
|
|
41
|
-
"""Class used for
|
|
41
|
+
class ListWithMetaResponse(PydanticBase, Generic[T]):
|
|
42
|
+
"""Class used for list endpoints to envelope the items to a dict with additional metadata.
|
|
43
|
+
|
|
44
|
+
This should be used only in REST API communication (JSON). For Python users,
|
|
45
|
+
this model should be deserialized to :class:`iqm.pulse.ListWithMeta`:,
|
|
46
|
+
which behaves like a standard list.
|
|
47
|
+
"""
|
|
42
48
|
|
|
43
49
|
items: list[T]
|
|
44
50
|
meta: Meta | None = None
|
|
@@ -96,5 +102,9 @@ class SequenceMetadataDataList(ListModel):
|
|
|
96
102
|
root: list[SequenceMetadataData]
|
|
97
103
|
|
|
98
104
|
|
|
105
|
+
class StaticQuantumArchitectureList(ListModel):
|
|
106
|
+
root: list[StaticQuantumArchitecture]
|
|
107
|
+
|
|
108
|
+
|
|
99
109
|
class RunLiteList(ListModel):
|
|
100
110
|
root: list[RunLite]
|
|
@@ -44,12 +44,12 @@ from iqm.station_control.client.list_models import (
|
|
|
44
44
|
DutFieldDataList,
|
|
45
45
|
DutList,
|
|
46
46
|
ListModel,
|
|
47
|
+
ListWithMetaResponse,
|
|
47
48
|
ObservationDataList,
|
|
48
49
|
ObservationDefinitionList,
|
|
49
50
|
ObservationLiteList,
|
|
50
51
|
ObservationSetDataList,
|
|
51
52
|
ObservationUpdateList,
|
|
52
|
-
ResponseWithMeta,
|
|
53
53
|
RunLiteList,
|
|
54
54
|
SequenceMetadataDataList,
|
|
55
55
|
)
|
|
@@ -181,7 +181,7 @@ class _StationControlClientBase(StationControlInterface):
|
|
|
181
181
|
if not response.ok:
|
|
182
182
|
try:
|
|
183
183
|
response_json = response.json()
|
|
184
|
-
error_message = response_json.get("message")
|
|
184
|
+
error_message = response_json.get("message")
|
|
185
185
|
except (json.JSONDecodeError, KeyError):
|
|
186
186
|
error_message = response.text
|
|
187
187
|
|
|
@@ -215,7 +215,7 @@ class _StationControlClientBase(StationControlInterface):
|
|
|
215
215
|
headers["Content-Type"] = "application/json; charset=UTF-8"
|
|
216
216
|
elif octets is not None:
|
|
217
217
|
data = octets
|
|
218
|
-
headers["Content-Type"] = "application/
|
|
218
|
+
headers["Content-Type"] = "application/protobuf"
|
|
219
219
|
|
|
220
220
|
if self._enable_opentelemetry:
|
|
221
221
|
parent_span_context = trace.set_span_in_context(trace.get_current_span())
|
|
@@ -310,7 +310,7 @@ class StationControlClient(_StationControlClientBase):
|
|
|
310
310
|
|
|
311
311
|
@cache
|
|
312
312
|
def get_channel_properties(self) -> dict[str, ChannelProperties]:
|
|
313
|
-
headers = {"accept": "application/
|
|
313
|
+
headers = {"accept": "application/protobuf"}
|
|
314
314
|
response = self._send_request(requests.get, "channel-properties", headers=headers)
|
|
315
315
|
decoded_dict = unpack_channel_properties(response.content)
|
|
316
316
|
return decoded_dict
|
|
@@ -620,11 +620,11 @@ class StationControlClient(_StationControlClientBase):
|
|
|
620
620
|
# This validates the provided data as a JSON string or bytes object.
|
|
621
621
|
# If your incoming data is a JSON payload, this is generally considered faster.
|
|
622
622
|
if list_with_meta:
|
|
623
|
-
|
|
624
|
-
meta =
|
|
623
|
+
list_with_meta_response: ListWithMetaResponse = ListWithMetaResponse.model_validate_json(response.text)
|
|
624
|
+
meta = list_with_meta_response.meta or Meta()
|
|
625
625
|
if meta and meta.errors:
|
|
626
626
|
logger.warning("Errors in station control response:\n - %s", "\n - ".join(meta.errors))
|
|
627
|
-
return ListWithMeta(model_class.model_validate(
|
|
627
|
+
return ListWithMeta(model_class.model_validate(list_with_meta_response.items), meta=meta)
|
|
628
628
|
model = model_class.model_validate_json(response.text)
|
|
629
629
|
if isinstance(model, ListModel):
|
|
630
630
|
return model.root
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
from collections.abc import Iterable
|
|
17
17
|
from dataclasses import dataclass
|
|
18
|
+
from typing import Generic, TypeVar
|
|
18
19
|
|
|
19
20
|
|
|
20
21
|
@dataclass(kw_only=True)
|
|
@@ -28,9 +29,14 @@ class Meta:
|
|
|
28
29
|
errors: list[str] | None = None
|
|
29
30
|
|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
T = TypeVar("T")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class ListWithMeta(list, Generic[T]):
|
|
32
36
|
"""Standard list extension holding optional metadata as well."""
|
|
33
37
|
|
|
34
|
-
|
|
38
|
+
meta: Meta | None
|
|
39
|
+
|
|
40
|
+
def __init__(self, items: Iterable[T], *, meta: Meta | None = None):
|
|
35
41
|
super().__init__(items)
|
|
36
42
|
self.meta = meta
|
|
@@ -17,16 +17,6 @@ from iqm.station_control.interface.models.type_aliases import DutType
|
|
|
17
17
|
from iqm.station_control.interface.pydantic_base import PydanticBase
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
class DutData(PydanticBase):
|
|
21
|
-
"""Represents a Device Under Test, or DUT, for short."""
|
|
22
|
-
|
|
23
|
-
label: str
|
|
24
|
-
"""DUT label of the device."""
|
|
25
|
-
dut_type: DutType
|
|
26
|
-
"""String indicating the DUT type of the device
|
|
27
|
-
Can be either 'chip' or 'twpa'."""
|
|
28
|
-
|
|
29
|
-
|
|
30
20
|
class DutFieldData(PydanticBase):
|
|
31
21
|
"""A DUT field or path and its unit."""
|
|
32
22
|
|
|
@@ -34,3 +24,12 @@ class DutFieldData(PydanticBase):
|
|
|
34
24
|
"""DUT field or path."""
|
|
35
25
|
unit: str
|
|
36
26
|
"""SI unit of the value. Empty string means the value is dimensionless."""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class DutData(PydanticBase):
|
|
30
|
+
"""Represents a Device Under Test, or DUT, for short."""
|
|
31
|
+
|
|
32
|
+
label: str
|
|
33
|
+
"""DUT label of the device."""
|
|
34
|
+
dut_type: DutType
|
|
35
|
+
"""Type of the device."""
|
|
@@ -89,7 +89,7 @@ class JobExecutorStatus(Enum):
|
|
|
89
89
|
COMPILATION_STARTED = "compilation_started"
|
|
90
90
|
"""The job is being compiled."""
|
|
91
91
|
COMPILATION_ENDED = "compilation_ended"
|
|
92
|
-
"""The job has been
|
|
92
|
+
"""The job has been successfully compiled."""
|
|
93
93
|
|
|
94
94
|
# Executing sweep
|
|
95
95
|
SAVE_SWEEP_METADATA_STARTED = "save_sweep_metadata_started"
|
|
@@ -13,7 +13,10 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
"""Static quantum architecture (SQA) related interface models."""
|
|
15
15
|
|
|
16
|
-
from
|
|
16
|
+
from typing import Any
|
|
17
|
+
import warnings
|
|
18
|
+
|
|
19
|
+
from pydantic import Field, model_validator
|
|
17
20
|
|
|
18
21
|
from iqm.station_control.interface.pydantic_base import PydanticBase
|
|
19
22
|
|
|
@@ -24,6 +27,13 @@ class StaticQuantumArchitecture(PydanticBase):
|
|
|
24
27
|
For example, the names of its components and the connections between them.
|
|
25
28
|
"""
|
|
26
29
|
|
|
30
|
+
# Optional *for now* since 2025-10-04 (backwards compatible)
|
|
31
|
+
dut_label: str | None = Field(
|
|
32
|
+
default=None,
|
|
33
|
+
json_schema_extra={"x-optional-deprecated": True},
|
|
34
|
+
)
|
|
35
|
+
"""Identifies the QPU."""
|
|
36
|
+
|
|
27
37
|
qubits: list[str] = Field(
|
|
28
38
|
examples=[["QB1", "QB2"]],
|
|
29
39
|
)
|
|
@@ -38,3 +48,14 @@ class StaticQuantumArchitecture(PydanticBase):
|
|
|
38
48
|
examples=[[("QB1", "QB2"), ("QB1", "CR1")]],
|
|
39
49
|
)
|
|
40
50
|
"""Components (qubits and computational resonators) connected by a coupler on the QPU, sorted."""
|
|
51
|
+
|
|
52
|
+
@model_validator(mode="before")
|
|
53
|
+
@classmethod
|
|
54
|
+
def _warn_missing_dut_label(cls, data: Any) -> Any:
|
|
55
|
+
if isinstance(data, dict) and "dut_label" not in data:
|
|
56
|
+
warnings.warn(
|
|
57
|
+
"Missing 'dut_label'. This field will become REQUIRED in a future release.",
|
|
58
|
+
DeprecationWarning,
|
|
59
|
+
stacklevel=2,
|
|
60
|
+
)
|
|
61
|
+
return data
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
"""Type hint aliases used in the station control interface."""
|
|
15
15
|
|
|
16
|
-
from typing import Literal
|
|
16
|
+
from typing import Literal, TypeAlias
|
|
17
17
|
from uuid import UUID
|
|
18
18
|
|
|
19
19
|
import numpy as np
|
|
@@ -23,8 +23,8 @@ import numpy as np
|
|
|
23
23
|
# and then deserialized back to UUID on the server side.
|
|
24
24
|
StrUUID = str | UUID
|
|
25
25
|
|
|
26
|
-
DutType = Literal["chip", "twpa"]
|
|
27
|
-
GetObservationsMode = Literal["all_latest", "tags_and", "tags_or", "sequence"]
|
|
28
|
-
SoftwareVersionSet = dict[str, str]
|
|
29
|
-
Statuses = list[tuple[str, int, int]]
|
|
30
|
-
SweepResults = dict[str, list[np.ndarray]]
|
|
26
|
+
DutType: TypeAlias = Literal["chip", "twpa"]
|
|
27
|
+
GetObservationsMode: TypeAlias = Literal["all_latest", "tags_and", "tags_or", "sequence"]
|
|
28
|
+
SoftwareVersionSet: TypeAlias = dict[str, str]
|
|
29
|
+
Statuses: TypeAlias = list[tuple[str, int, int]]
|
|
30
|
+
SweepResults: TypeAlias = dict[str, list[np.ndarray]]
|
|
@@ -18,6 +18,7 @@ from pydantic import BaseModel, ConfigDict
|
|
|
18
18
|
|
|
19
19
|
class PydanticBase(BaseModel):
|
|
20
20
|
"""Pydantic base model to change the behaviour of pydantic globally.
|
|
21
|
+
|
|
21
22
|
Note that setting model_config in child classes will merge the configs rather than override this one.
|
|
22
23
|
https://docs.pydantic.dev/latest/concepts/config/#change-behaviour-globally
|
|
23
24
|
"""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: iqm-station-control-client
|
|
3
|
-
Version: 11.1
|
|
3
|
+
Version: 11.3.1
|
|
4
4
|
Summary: Python client for communicating with Station Control Service
|
|
5
5
|
Author-email: IQM Finland Oy <info@meetiqm.com>
|
|
6
6
|
License: Apache License
|
|
@@ -214,7 +214,7 @@ Requires-Python: >=3.11
|
|
|
214
214
|
Description-Content-Type: text/x-rst
|
|
215
215
|
License-File: LICENSE.txt
|
|
216
216
|
Requires-Dist: iqm-exa-common<28,>=27
|
|
217
|
-
Requires-Dist: iqm-data-definitions<3.0,>=2.
|
|
217
|
+
Requires-Dist: iqm-data-definitions<3.0,>=2.18
|
|
218
218
|
Requires-Dist: opentelemetry-exporter-otlp<2.0,>=1.25.0
|
|
219
219
|
Requires-Dist: protobuf<5.0,>=4.25.3
|
|
220
220
|
Requires-Dist: types-protobuf
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
11.3.1
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
11.1.0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/_static/css/custom.css
RENAMED
|
File without changes
|
|
File without changes
|
{iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/_static/images/logo.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|