qilisdk 0.1.3__py3-none-any.whl → 0.1.5__py3-none-any.whl

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.
Files changed (83) hide show
  1. qilisdk/__init__.py +11 -2
  2. qilisdk/__init__.pyi +2 -3
  3. qilisdk/_logging.py +135 -0
  4. qilisdk/_optionals.py +5 -7
  5. qilisdk/analog/__init__.py +3 -18
  6. qilisdk/analog/exceptions.py +2 -4
  7. qilisdk/analog/hamiltonian.py +455 -110
  8. qilisdk/analog/linear_schedule.py +118 -0
  9. qilisdk/analog/schedule.py +272 -79
  10. qilisdk/backends/__init__.py +45 -0
  11. qilisdk/{digital/digital_algorithm.py → backends/__init__.pyi} +3 -5
  12. qilisdk/backends/backend.py +117 -0
  13. qilisdk/{extras/cuda → backends}/cuda_backend.py +153 -161
  14. qilisdk/backends/qutip_backend.py +492 -0
  15. qilisdk/common/__init__.py +48 -2
  16. qilisdk/common/algorithm.py +2 -1
  17. qilisdk/{extras/qaas/qaas_settings.py → common/exceptions.py} +12 -6
  18. qilisdk/common/model.py +1019 -1
  19. qilisdk/common/parameterizable.py +75 -0
  20. qilisdk/common/qtensor.py +666 -0
  21. qilisdk/common/result.py +2 -1
  22. qilisdk/common/variables.py +1931 -0
  23. qilisdk/{extras/cuda/cuda_analog_result.py → cost_functions/__init__.py} +3 -4
  24. qilisdk/cost_functions/cost_function.py +77 -0
  25. qilisdk/cost_functions/model_cost_function.py +145 -0
  26. qilisdk/cost_functions/observable_cost_function.py +109 -0
  27. qilisdk/digital/__init__.py +3 -22
  28. qilisdk/digital/ansatz.py +203 -160
  29. qilisdk/digital/circuit.py +81 -9
  30. qilisdk/digital/exceptions.py +12 -6
  31. qilisdk/digital/gates.py +228 -85
  32. qilisdk/{extras/qaas/qaas_analog_result.py → functionals/__init__.py} +14 -5
  33. qilisdk/functionals/functional.py +39 -0
  34. qilisdk/{extras/cuda/cuda_digital_result.py → functionals/functional_result.py} +3 -4
  35. qilisdk/functionals/sampling.py +81 -0
  36. qilisdk/functionals/sampling_result.py +92 -0
  37. qilisdk/functionals/time_evolution.py +98 -0
  38. qilisdk/functionals/time_evolution_result.py +84 -0
  39. qilisdk/functionals/variational_program.py +80 -0
  40. qilisdk/functionals/variational_program_result.py +69 -0
  41. qilisdk/logging_config.yaml +16 -0
  42. qilisdk/{common/backend.py → optimizers/__init__.py} +2 -1
  43. qilisdk/optimizers/optimizer.py +39 -0
  44. qilisdk/{common → optimizers}/optimizer_result.py +3 -12
  45. qilisdk/{common/optimizer.py → optimizers/scipy_optimizer.py} +10 -28
  46. qilisdk/settings.py +78 -0
  47. qilisdk/{extras → speqtrum}/__init__.py +7 -8
  48. qilisdk/{extras → speqtrum}/__init__.pyi +3 -3
  49. qilisdk/speqtrum/experiments/__init__.py +25 -0
  50. qilisdk/speqtrum/experiments/experiment_functional.py +124 -0
  51. qilisdk/speqtrum/experiments/experiment_result.py +231 -0
  52. qilisdk/{extras/qaas → speqtrum}/keyring.py +8 -4
  53. qilisdk/speqtrum/speqtrum.py +432 -0
  54. qilisdk/speqtrum/speqtrum_models.py +300 -0
  55. qilisdk/utils/__init__.py +0 -14
  56. qilisdk/utils/openqasm2.py +1 -1
  57. qilisdk/utils/serialization.py +1 -1
  58. qilisdk/utils/visualization/PlusJakartaSans-SemiBold.ttf +0 -0
  59. qilisdk/utils/visualization/__init__.py +24 -0
  60. qilisdk/utils/visualization/circuit_renderers.py +781 -0
  61. qilisdk/utils/visualization/schedule_renderers.py +161 -0
  62. qilisdk/utils/visualization/style.py +154 -0
  63. qilisdk/utils/visualization/themes.py +76 -0
  64. qilisdk/yaml.py +126 -0
  65. {qilisdk-0.1.3.dist-info → qilisdk-0.1.5.dist-info}/METADATA +180 -135
  66. qilisdk-0.1.5.dist-info/RECORD +69 -0
  67. qilisdk/analog/algorithms.py +0 -111
  68. qilisdk/analog/analog_backend.py +0 -43
  69. qilisdk/analog/analog_result.py +0 -114
  70. qilisdk/analog/quantum_objects.py +0 -533
  71. qilisdk/digital/digital_backend.py +0 -90
  72. qilisdk/digital/digital_result.py +0 -145
  73. qilisdk/digital/vqe.py +0 -166
  74. qilisdk/extras/cuda/__init__.py +0 -13
  75. qilisdk/extras/qaas/__init__.py +0 -13
  76. qilisdk/extras/qaas/models.py +0 -132
  77. qilisdk/extras/qaas/qaas_backend.py +0 -255
  78. qilisdk/extras/qaas/qaas_digital_result.py +0 -20
  79. qilisdk/extras/qaas/qaas_time_evolution_result.py +0 -20
  80. qilisdk/extras/qaas/qaas_vqe_result.py +0 -20
  81. qilisdk-0.1.3.dist-info/RECORD +0 -51
  82. {qilisdk-0.1.3.dist-info → qilisdk-0.1.5.dist-info}/WHEEL +0 -0
  83. {qilisdk-0.1.3.dist-info → qilisdk-0.1.5.dist-info}/licenses/LICENCE +0 -0
@@ -0,0 +1,300 @@
1
+ # Copyright 2025 Qilimanjaro Quantum Tech
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ruff: noqa: ANN001, ANN202, PLR6301
15
+ from email.utils import parsedate_to_datetime
16
+ from enum import Enum
17
+
18
+ from pydantic import AwareDatetime, BaseModel, ConfigDict, Field, field_serializer, field_validator
19
+
20
+ from qilisdk.functionals import (
21
+ Sampling,
22
+ SamplingResult,
23
+ TimeEvolution,
24
+ TimeEvolutionResult,
25
+ VariationalProgram,
26
+ VariationalProgramResult,
27
+ )
28
+ from qilisdk.speqtrum.experiments import RabiExperiment, RabiExperimentResult, T1Experiment, T1ExperimentResult
29
+ from qilisdk.utils.serialization import deserialize, serialize
30
+
31
+
32
+ class SpeQtrumModel(BaseModel):
33
+ model_config = ConfigDict(validate_by_name=True, validate_by_alias=True, arbitrary_types_allowed=True)
34
+
35
+
36
+ class LoginPayload(BaseModel): ...
37
+
38
+
39
+ class Token(SpeQtrumModel):
40
+ """
41
+ Represents the structure of the login response:
42
+ {
43
+ "accessToken": "...",
44
+ "expiresIn": 123456789,
45
+ "issuedAt": "123456789",
46
+ "refreshToken": "...",
47
+ "tokenType": "bearer"
48
+ }
49
+ """
50
+
51
+ access_token: str = Field(alias="accessToken")
52
+ expires_in: int = Field(alias="expiresIn")
53
+ issued_at: str = Field(alias="issuedAt")
54
+ refresh_token: str = Field(alias="refreshToken")
55
+ token_type: str = Field(alias="tokenType")
56
+
57
+
58
+ class DeviceStatus(str, Enum):
59
+ """Device status typing for posting"""
60
+
61
+ ONLINE = "online"
62
+ MAINTENANCE = "maintenance"
63
+ OFFLINE = "offline"
64
+
65
+
66
+ class DeviceType(str, Enum):
67
+ """Device type"""
68
+
69
+ QPU_ANALOG = "qpu.analog"
70
+ QPU_DIGITAL = "qpu.digital"
71
+ SIMULATOR = "simulator"
72
+
73
+
74
+ class Device(SpeQtrumModel):
75
+ code: str = Field(...)
76
+ nqubits: int = Field(...)
77
+ name: str = Field(...)
78
+ description: str = Field(...)
79
+ type: DeviceType = Field(...)
80
+ status: DeviceStatus = Field(...)
81
+
82
+
83
+ class ExecuteType(str, Enum):
84
+ SAMPLING = "sampling"
85
+ TIME_EVOLUTION = "time_evolution"
86
+ VARIATIONAL_PROGRAM = "variational_program"
87
+ RABI_EXPERIMENT = "rabi_experiment"
88
+ T1_EXPERIMENT = "t1_experiment"
89
+
90
+
91
+ class SamplingPayload(SpeQtrumModel):
92
+ sampling: Sampling = Field(...)
93
+
94
+ @field_serializer("sampling")
95
+ def _serialize_sampling(self, sampling: Sampling, _info):
96
+ return serialize(sampling)
97
+
98
+ @field_validator("sampling", mode="before")
99
+ def _load_sampling(cls, v):
100
+ if isinstance(v, str):
101
+ return deserialize(v, Sampling)
102
+ return v
103
+
104
+
105
+ class TimeEvolutionPayload(SpeQtrumModel):
106
+ time_evolution: TimeEvolution = Field(...)
107
+
108
+ @field_serializer("time_evolution")
109
+ def _serialize_time_evolution(self, time_evolution: TimeEvolution, _info):
110
+ return serialize(time_evolution)
111
+
112
+ @field_validator("time_evolution", mode="before")
113
+ def _load_time_evolution(cls, v):
114
+ if isinstance(v, str):
115
+ return deserialize(v, TimeEvolution)
116
+ return v
117
+
118
+
119
+ class VariationalProgramPayload(SpeQtrumModel):
120
+ variational_program: VariationalProgram = Field(...)
121
+
122
+ @field_serializer("variational_program")
123
+ def _serialize_variational_program(self, variational_program: VariationalProgram, _info):
124
+ return serialize(variational_program)
125
+
126
+ @field_validator("variational_program", mode="before")
127
+ def _load_variational_program(cls, v):
128
+ if isinstance(v, str):
129
+ return deserialize(v, VariationalProgram)
130
+ return v
131
+
132
+
133
+ class RabiExperimentPayload(SpeQtrumModel):
134
+ rabi_experiment: RabiExperiment = Field(...)
135
+
136
+ @field_serializer("rabi_experiment")
137
+ def _serialize_rabi_experiment(self, rabi_experiment: RabiExperiment, _info):
138
+ return serialize(rabi_experiment)
139
+
140
+ @field_validator("rabi_experiment", mode="before")
141
+ def _load_rabi_experiment(cls, v):
142
+ if isinstance(v, str):
143
+ return deserialize(v, RabiExperiment)
144
+ return v
145
+
146
+
147
+ class T1ExperimentPayload(SpeQtrumModel):
148
+ t1_experiment: T1Experiment = Field(...)
149
+
150
+ @field_serializer("t1_experiment")
151
+ def _serialize_t1_experiment(self, t1_experiment: T1Experiment, _info):
152
+ return serialize(t1_experiment)
153
+
154
+ @field_validator("t1_experiment", mode="before")
155
+ def _load_t1_experiment(cls, v):
156
+ if isinstance(v, str):
157
+ return deserialize(v, T1Experiment)
158
+ return v
159
+
160
+
161
+ class ExecutePayload(SpeQtrumModel):
162
+ type: ExecuteType = Field(...)
163
+ sampling_payload: SamplingPayload | None = None
164
+ time_evolution_payload: TimeEvolutionPayload | None = None
165
+ variational_program_payload: VariationalProgramPayload | None = None
166
+ rabi_experiment_payload: RabiExperimentPayload | None = None
167
+ t1_experiment_payload: T1ExperimentPayload | None = None
168
+
169
+
170
+ class ExecuteResult(SpeQtrumModel):
171
+ type: ExecuteType = Field(...)
172
+ sampling_result: SamplingResult | None = None
173
+ time_evolution_result: TimeEvolutionResult | None = None
174
+ variational_program_result: VariationalProgramResult | None = None
175
+ rabi_experiment_result: RabiExperimentResult | None = None
176
+ t1_experiment_result: T1ExperimentResult | None = None
177
+
178
+ @field_serializer("sampling_result")
179
+ def _serialize_sampling_result(self, sampling_result: SamplingResult, _info):
180
+ return serialize(sampling_result) if sampling_result is not None else None
181
+
182
+ @field_validator("sampling_result", mode="before")
183
+ def _load_sampling_result(cls, v):
184
+ if isinstance(v, str) and v.startswith("!"):
185
+ return deserialize(v, SamplingResult)
186
+ return v
187
+
188
+ @field_serializer("time_evolution_result")
189
+ def _serialize_time_evolution_result(self, time_evolution_result: TimeEvolutionResult, _info):
190
+ return serialize(time_evolution_result) if time_evolution_result is not None else None
191
+
192
+ @field_validator("time_evolution_result", mode="before")
193
+ def _load_time_evolution_result(cls, v):
194
+ if isinstance(v, str) and v.startswith("!"):
195
+ return deserialize(v, TimeEvolutionResult)
196
+ return v
197
+
198
+ @field_serializer("variational_program_result")
199
+ def _serialize_variational_program_result(self, variational_program_result: VariationalProgramResult, _info):
200
+ return serialize(variational_program_result) if variational_program_result is not None else None
201
+
202
+ @field_validator("variational_program_result", mode="before")
203
+ def _load_variational_program_result(cls, v):
204
+ if isinstance(v, str) and v.startswith("!"):
205
+ return deserialize(v, VariationalProgramResult)
206
+ return v
207
+
208
+ @field_serializer("rabi_experiment_result")
209
+ def _serialize_rabi_experiment_result(self, rabi_experiment_result: RabiExperimentResult, _info):
210
+ return serialize(rabi_experiment_result) if rabi_experiment_result is not None else None
211
+
212
+ @field_validator("rabi_experiment_result", mode="before")
213
+ def _load_rabi_experiment_result(cls, v):
214
+ if isinstance(v, str) and v.startswith("!"):
215
+ return deserialize(v, RabiExperimentResult)
216
+ return v
217
+
218
+ @field_serializer("t1_experiment_result")
219
+ def _serialize_t1_experiment_result(self, t1_experiment_result: T1ExperimentResult, _info):
220
+ return serialize(t1_experiment_result) if t1_experiment_result is not None else None
221
+
222
+ @field_validator("t1_experiment_result", mode="before")
223
+ def _load_t1_experiment_result(cls, v):
224
+ if isinstance(v, str) and v.startswith("!"):
225
+ return deserialize(v, T1ExperimentResult)
226
+ return v
227
+
228
+
229
+ class JobStatus(str, Enum):
230
+ "Job has not been submitted to the Lab api"
231
+
232
+ PENDING = "pending"
233
+ "Job has been queued but not yet validated"
234
+ VALIDATING = "validating"
235
+ "Job has been validated and is queued for execution"
236
+ QUEUED = "queued"
237
+ "Job is being executed on the device"
238
+ RUNNING = "running"
239
+ "Job finished successfully"
240
+ COMPLETED = "completed"
241
+ "Job failed due to an error"
242
+ ERROR = "error"
243
+ "Job was cancelled by the user or system"
244
+ CANCELLED = "cancelled"
245
+ "Job failed due to timeout"
246
+ TIMEOUT = "timeout"
247
+
248
+
249
+ class JobType(str, Enum):
250
+ DIGITAL = "digital"
251
+ PULSE = "pulse"
252
+ ANALOG = "analog"
253
+ VARIATIONAL = "variational"
254
+
255
+
256
+ class JobId(SpeQtrumModel):
257
+ """Handle/reference you normally get back immediately after `POST /execute`."""
258
+
259
+ id: int = Field(...)
260
+
261
+
262
+ class JobInfo(JobId):
263
+ """
264
+ Light-weight representation suitable for 'list jobs' and polling
265
+ when you do *not* need logs or results.
266
+ """
267
+
268
+ name: str = Field(...)
269
+ description: str = Field(...)
270
+ device_id: int = Field(...)
271
+ status: JobStatus = Field(...)
272
+ created_at: AwareDatetime = Field(...)
273
+ updated_at: AwareDatetime | None = None
274
+ completed_at: AwareDatetime | None = None
275
+
276
+ @field_validator("created_at", mode="before")
277
+ def _parse_created_at(cls, v):
278
+ return parsedate_to_datetime(v) if isinstance(v, str) else v
279
+
280
+ @field_validator("updated_at", mode="before")
281
+ def _parse_updated_at(cls, v):
282
+ return parsedate_to_datetime(v) if isinstance(v, str) else v
283
+
284
+ @field_validator("completed_at", mode="before")
285
+ def _parse_completed_at(cls, v):
286
+ return parsedate_to_datetime(v) if isinstance(v, str) else v
287
+
288
+
289
+ class JobDetail(JobInfo):
290
+ """
291
+ Full representation returned by `GET /jobs/{id}` when payload/result/logs
292
+ are requested.
293
+ """
294
+
295
+ payload: ExecutePayload | None = None
296
+ result: ExecuteResult | None = None
297
+ jobType: JobType | None = None
298
+ logs: str | None = None
299
+ error: str | None = None
300
+ error_logs: str | None = None
qilisdk/utils/__init__.py CHANGED
@@ -11,17 +11,3 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
-
15
- from .openqasm2 import from_qasm2, from_qasm2_file, to_qasm2, to_qasm2_file
16
- from .serialization import deserialize, deserialize_from, serialize, serialize_to
17
-
18
- __all__ = [
19
- "deserialize",
20
- "deserialize_from",
21
- "from_qasm2",
22
- "from_qasm2_file",
23
- "serialize",
24
- "serialize_to",
25
- "to_qasm2",
26
- "to_qasm2_file",
27
- ]
@@ -70,7 +70,7 @@ def to_qasm2(circuit: Circuit) -> str:
70
70
  # Format parameter string, if any.
71
71
  param_str = ""
72
72
  if gate.is_parameterized:
73
- parameters = ", ".join(str(p) for p in gate.parameter_values)
73
+ parameters = ", ".join(str(p) for p in gate.get_parameter_values())
74
74
  param_str = f"({parameters})"
75
75
  # Format qubit operands.
76
76
  qubit_str = ", ".join(f"q[{q}]" for q in gate.qubits)
@@ -1,4 +1,4 @@
1
- # Copyright 2023 Qilimanjaro Quantum Tech
1
+ # Copyright 2025 Qilimanjaro Quantum Tech
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -0,0 +1,24 @@
1
+ # Copyright 2025 Qilimanjaro Quantum Tech
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from .style import CircuitStyle, ScheduleStyle
16
+ from .themes import Theme, dark, light
17
+
18
+ __all__ = [
19
+ "CircuitStyle",
20
+ "ScheduleStyle",
21
+ "Theme",
22
+ "dark",
23
+ "light",
24
+ ]