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.
- qilisdk/__init__.py +11 -2
- qilisdk/__init__.pyi +2 -3
- qilisdk/_logging.py +135 -0
- qilisdk/_optionals.py +5 -7
- qilisdk/analog/__init__.py +3 -18
- qilisdk/analog/exceptions.py +2 -4
- qilisdk/analog/hamiltonian.py +455 -110
- qilisdk/analog/linear_schedule.py +118 -0
- qilisdk/analog/schedule.py +272 -79
- qilisdk/backends/__init__.py +45 -0
- qilisdk/{digital/digital_algorithm.py → backends/__init__.pyi} +3 -5
- qilisdk/backends/backend.py +117 -0
- qilisdk/{extras/cuda → backends}/cuda_backend.py +153 -161
- qilisdk/backends/qutip_backend.py +492 -0
- qilisdk/common/__init__.py +48 -2
- qilisdk/common/algorithm.py +2 -1
- qilisdk/{extras/qaas/qaas_settings.py → common/exceptions.py} +12 -6
- qilisdk/common/model.py +1019 -1
- qilisdk/common/parameterizable.py +75 -0
- qilisdk/common/qtensor.py +666 -0
- qilisdk/common/result.py +2 -1
- qilisdk/common/variables.py +1931 -0
- qilisdk/{extras/cuda/cuda_analog_result.py → cost_functions/__init__.py} +3 -4
- qilisdk/cost_functions/cost_function.py +77 -0
- qilisdk/cost_functions/model_cost_function.py +145 -0
- qilisdk/cost_functions/observable_cost_function.py +109 -0
- qilisdk/digital/__init__.py +3 -22
- qilisdk/digital/ansatz.py +203 -160
- qilisdk/digital/circuit.py +81 -9
- qilisdk/digital/exceptions.py +12 -6
- qilisdk/digital/gates.py +228 -85
- qilisdk/{extras/qaas/qaas_analog_result.py → functionals/__init__.py} +14 -5
- qilisdk/functionals/functional.py +39 -0
- qilisdk/{extras/cuda/cuda_digital_result.py → functionals/functional_result.py} +3 -4
- qilisdk/functionals/sampling.py +81 -0
- qilisdk/functionals/sampling_result.py +92 -0
- qilisdk/functionals/time_evolution.py +98 -0
- qilisdk/functionals/time_evolution_result.py +84 -0
- qilisdk/functionals/variational_program.py +80 -0
- qilisdk/functionals/variational_program_result.py +69 -0
- qilisdk/logging_config.yaml +16 -0
- qilisdk/{common/backend.py → optimizers/__init__.py} +2 -1
- qilisdk/optimizers/optimizer.py +39 -0
- qilisdk/{common → optimizers}/optimizer_result.py +3 -12
- qilisdk/{common/optimizer.py → optimizers/scipy_optimizer.py} +10 -28
- qilisdk/settings.py +78 -0
- qilisdk/{extras → speqtrum}/__init__.py +7 -8
- qilisdk/{extras → speqtrum}/__init__.pyi +3 -3
- qilisdk/speqtrum/experiments/__init__.py +25 -0
- qilisdk/speqtrum/experiments/experiment_functional.py +124 -0
- qilisdk/speqtrum/experiments/experiment_result.py +231 -0
- qilisdk/{extras/qaas → speqtrum}/keyring.py +8 -4
- qilisdk/speqtrum/speqtrum.py +432 -0
- qilisdk/speqtrum/speqtrum_models.py +300 -0
- qilisdk/utils/__init__.py +0 -14
- qilisdk/utils/openqasm2.py +1 -1
- qilisdk/utils/serialization.py +1 -1
- qilisdk/utils/visualization/PlusJakartaSans-SemiBold.ttf +0 -0
- qilisdk/utils/visualization/__init__.py +24 -0
- qilisdk/utils/visualization/circuit_renderers.py +781 -0
- qilisdk/utils/visualization/schedule_renderers.py +161 -0
- qilisdk/utils/visualization/style.py +154 -0
- qilisdk/utils/visualization/themes.py +76 -0
- qilisdk/yaml.py +126 -0
- {qilisdk-0.1.3.dist-info → qilisdk-0.1.5.dist-info}/METADATA +180 -135
- qilisdk-0.1.5.dist-info/RECORD +69 -0
- qilisdk/analog/algorithms.py +0 -111
- qilisdk/analog/analog_backend.py +0 -43
- qilisdk/analog/analog_result.py +0 -114
- qilisdk/analog/quantum_objects.py +0 -533
- qilisdk/digital/digital_backend.py +0 -90
- qilisdk/digital/digital_result.py +0 -145
- qilisdk/digital/vqe.py +0 -166
- qilisdk/extras/cuda/__init__.py +0 -13
- qilisdk/extras/qaas/__init__.py +0 -13
- qilisdk/extras/qaas/models.py +0 -132
- qilisdk/extras/qaas/qaas_backend.py +0 -255
- qilisdk/extras/qaas/qaas_digital_result.py +0 -20
- qilisdk/extras/qaas/qaas_time_evolution_result.py +0 -20
- qilisdk/extras/qaas/qaas_vqe_result.py +0 -20
- qilisdk-0.1.3.dist-info/RECORD +0 -51
- {qilisdk-0.1.3.dist-info → qilisdk-0.1.5.dist-info}/WHEEL +0 -0
- {qilisdk-0.1.3.dist-info → qilisdk-0.1.5.dist-info}/licenses/LICENCE +0 -0
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: qilisdk
|
|
3
|
-
Version: 0.1.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 0.1.5
|
|
4
|
+
Summary: QiliSDK is a Python framework for writing digital and analog quantum algorithms and executing them across multiple quantum backends. Its modular design streamlines the development process and enables easy integration with a variety of quantum platforms.
|
|
5
|
+
Project-URL: Homepage, https://github.com/qilimanjaro-tech/qilisdk
|
|
6
|
+
Project-URL: Documentation, https://qilimanjaro-tech.github.io/qilisdk/
|
|
7
|
+
Project-URL: Source, https://github.com/qilimanjaro-tech/qilisdk
|
|
8
|
+
Project-URL: Issues, https://github.com/qilimanjaro-tech/qilisdk/issues
|
|
9
|
+
Project-URL: Changelog, https://github.com/qilimanjaro-tech/qilisdk/blob/main/CHANGELOG.md
|
|
5
10
|
Author-email: Qilimanjaro Quantum Tech <info@qilimanjaro.tech>
|
|
6
11
|
License-File: LICENCE
|
|
7
12
|
Keywords: analog quantum computing,digital quantum computing,qilimanjaro,quantum computing
|
|
8
|
-
Classifier: Development Status ::
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
9
14
|
Classifier: Environment :: Console
|
|
10
15
|
Classifier: Intended Audience :: Developers
|
|
11
16
|
Classifier: Intended Audience :: Science/Research
|
|
@@ -20,16 +25,22 @@ Classifier: Topic :: Scientific/Engineering :: Physics
|
|
|
20
25
|
Classifier: Topic :: Scientific/Engineering :: Quantum Computing
|
|
21
26
|
Requires-Python: >=3.10
|
|
22
27
|
Requires-Dist: dill>=0.3.9
|
|
23
|
-
Requires-Dist:
|
|
24
|
-
Requires-Dist:
|
|
25
|
-
Requires-Dist:
|
|
26
|
-
Requires-Dist:
|
|
27
|
-
Requires-Dist:
|
|
28
|
+
Requires-Dist: loguru>=0.7.3
|
|
29
|
+
Requires-Dist: matplotlib>=3.10.7
|
|
30
|
+
Requires-Dist: numpy>=1.26.4
|
|
31
|
+
Requires-Dist: pydantic-settings>=2.11.0
|
|
32
|
+
Requires-Dist: pydantic>=2.12.2
|
|
33
|
+
Requires-Dist: ruamel-yaml>=0.18.15
|
|
34
|
+
Requires-Dist: scipy>=1.15.3
|
|
28
35
|
Provides-Extra: cuda
|
|
29
|
-
Requires-Dist:
|
|
30
|
-
Provides-Extra:
|
|
31
|
-
Requires-Dist:
|
|
32
|
-
Requires-Dist:
|
|
36
|
+
Requires-Dist: cuda-quantum-cu12==0.12.0; extra == 'cuda'
|
|
37
|
+
Provides-Extra: qutip
|
|
38
|
+
Requires-Dist: qutip-qip>=0.4.1; extra == 'qutip'
|
|
39
|
+
Requires-Dist: qutip>=5.2.1; extra == 'qutip'
|
|
40
|
+
Provides-Extra: speqtrum
|
|
41
|
+
Requires-Dist: httpx>=0.28.1; extra == 'speqtrum'
|
|
42
|
+
Requires-Dist: keyring>=25.6.0; extra == 'speqtrum'
|
|
43
|
+
Requires-Dist: keyrings-alt>=5.0.2; extra == 'speqtrum'
|
|
33
44
|
Description-Content-Type: text/markdown
|
|
34
45
|
|
|
35
46
|
# QiliSDK
|
|
@@ -83,39 +94,46 @@ Install the core QiliSDK package using pip:
|
|
|
83
94
|
pip install qilisdk
|
|
84
95
|
```
|
|
85
96
|
|
|
86
|
-
### Optional
|
|
97
|
+
### Optional Dependencies
|
|
87
98
|
|
|
88
99
|
QiliSDK supports optional modules for additional functionality:
|
|
89
100
|
|
|
90
|
-
- **
|
|
91
|
-
To interface with Qilimanjaro’s cloud-based quantum services, install the
|
|
101
|
+
- **SpeQtrum:**
|
|
102
|
+
To interface with Qilimanjaro’s cloud-based quantum services, install the Speqtrum optional dependency:
|
|
92
103
|
|
|
93
104
|
```bash
|
|
94
|
-
pip install qilisdk[
|
|
105
|
+
pip install qilisdk[speqtrum]
|
|
95
106
|
```
|
|
96
107
|
|
|
97
|
-
- **CUDA
|
|
108
|
+
- **CUDA Accelerated Simulator Backend:**
|
|
98
109
|
For GPU-accelerated quantum simulation using NVIDIA GPUs, install the CUDA extra:
|
|
99
110
|
|
|
100
111
|
```bash
|
|
101
112
|
pip install qilisdk[cuda]
|
|
102
113
|
```
|
|
103
114
|
|
|
104
|
-
|
|
115
|
+
- **Qutip Simulator Backend:**
|
|
116
|
+
For GPU-accelerated quantum simulation using NVIDIA GPUs, install the CUDA extra:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
pip install qilisdk[qutip]
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Note:** You can also install both optional dependencies using a single command:
|
|
105
123
|
|
|
106
124
|
```bash
|
|
107
|
-
pip install qilisdk[cuda,
|
|
125
|
+
pip install qilisdk[cuda,qutip,speqtrum]
|
|
108
126
|
```
|
|
109
127
|
|
|
110
128
|
---
|
|
111
129
|
|
|
112
130
|
## Usage
|
|
113
131
|
|
|
114
|
-
QiliSDK is designed to simplify both digital and analog quantum computing workflows. This guide provides example code snippets for creating quantum circuits, performing Hamiltonian arithmetic, optimization, simulation on various backends (including CUDA and cloud-based
|
|
132
|
+
QiliSDK is designed to simplify both digital and analog quantum computing workflows. This guide provides example code snippets for creating quantum circuits, performing Hamiltonian arithmetic, optimization, simulation on various backends (including CUDA and cloud-based using Speqtrum), and using additional utility functions.
|
|
115
133
|
|
|
116
134
|
### Digital Quantum Circuits
|
|
117
135
|
|
|
118
|
-
Create and simulate quantum circuits with a flexible gate framework. The following example demonstrates how to assemble a circuit, adjust gate parameters
|
|
136
|
+
Create and simulate quantum circuits with a flexible gate framework. The following example demonstrates how to assemble a circuit, adjust gate parameters:
|
|
119
137
|
|
|
120
138
|
```python
|
|
121
139
|
import numpy as np
|
|
@@ -123,29 +141,20 @@ from qilisdk.digital import Circuit, H, RX, CNOT, M
|
|
|
123
141
|
|
|
124
142
|
# Create a circuit with 2 qubits
|
|
125
143
|
circuit = Circuit(2)
|
|
126
|
-
circuit.add(H(0))
|
|
144
|
+
circuit.add(H(0)) # Apply Hadamard on qubit 0
|
|
127
145
|
circuit.add(RX(0, theta=np.pi)) # Apply RX rotation on qubit 0
|
|
128
|
-
circuit.add(CNOT(0, 1))
|
|
146
|
+
circuit.add(CNOT(0, 1)) # Add a CNOT gate between qubit 0 and 1
|
|
129
147
|
|
|
130
148
|
# Retrieve the current gate parameters
|
|
131
149
|
print("Initial parameters:", circuit.get_parameter_values())
|
|
132
150
|
|
|
133
151
|
# Update circuit parameters (e.g., update RX rotation angle)
|
|
134
152
|
circuit.set_parameter_values([2 * np.pi])
|
|
135
|
-
|
|
136
|
-
# Execute the circuit simulation using CudaBackend
|
|
137
|
-
backend = CudaBackend()
|
|
138
|
-
results = backend.execute(circuit)
|
|
139
|
-
|
|
140
|
-
# Display the simulation output and measurement probabilities
|
|
141
|
-
print("Simulation Results:")
|
|
142
|
-
print(results)
|
|
143
|
-
print("Probabilities:", results.probabilities)
|
|
144
153
|
```
|
|
145
154
|
|
|
146
|
-
###
|
|
155
|
+
### Hamiltonians
|
|
147
156
|
|
|
148
|
-
Utilize the `Hamiltonian` class for Pauli operator arithmetic. Build expressions, iterate through terms
|
|
157
|
+
Utilize the `Hamiltonian` class for Pauli operator arithmetic. Build expressions, iterate through terms:
|
|
149
158
|
|
|
150
159
|
```python
|
|
151
160
|
from qilisdk.analog import Hamiltonian, X, Y, Z, I
|
|
@@ -158,57 +167,66 @@ print("Hamiltonian Expression:", H_expr)
|
|
|
158
167
|
for coeff, ops in H_expr:
|
|
159
168
|
print("Coefficient:", coeff, "Operators:", ops)
|
|
160
169
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
170
|
+
print("-"*10)
|
|
171
|
+
# export hamiltonians to matrices
|
|
172
|
+
print("Sparse Matrix from Hamiltonian: \n", H_expr.to_matrix()) # sparse matrix
|
|
173
|
+
# the returned matrix is sparse by default to get the dense representation call .toarray()
|
|
164
174
|
```
|
|
165
175
|
|
|
176
|
+
|
|
166
177
|
### Optimizers
|
|
167
178
|
|
|
168
179
|
Run optimization routines using the `SciPyOptimizer` and integrate them with a variational algorithm (VQE). In the example below, a simple quadratic cost function is minimized:
|
|
169
180
|
|
|
170
181
|
```python
|
|
171
|
-
from qilisdk.
|
|
182
|
+
from qilisdk.optimizers import SciPyOptimizer
|
|
183
|
+
|
|
172
184
|
|
|
173
185
|
def cost_function(params):
|
|
174
186
|
# A simple quadratic cost: minimum at [1, 1, 1]
|
|
175
187
|
return sum((p - 1) ** 2 for p in params)
|
|
176
188
|
|
|
189
|
+
|
|
177
190
|
# Initialize the optimizer with the BFGS method
|
|
178
191
|
optimizer = SciPyOptimizer(method="BFGS")
|
|
179
192
|
initial_parameters = [0, 0, 0]
|
|
180
|
-
|
|
193
|
+
parameter_bounds = [(0, 1), (0, 1), (0, 1)]
|
|
194
|
+
result = optimizer.optimize(cost_function, initial_parameters, parameter_bounds)
|
|
181
195
|
|
|
182
196
|
print("Optimal cost:", result.optimal_cost)
|
|
183
197
|
print("Optimal Parameters:", result.optimal_parameters)
|
|
184
198
|
```
|
|
185
199
|
|
|
186
|
-
###
|
|
200
|
+
### SpeQtrum
|
|
187
201
|
|
|
188
|
-
QiliSDK
|
|
202
|
+
QiliSDK includes a client for interacting with Qilimanjaro's SpeQtrum platform. This module supports secure login and a unified interface for both digital circuits and analog evolutions:
|
|
189
203
|
|
|
190
204
|
```python
|
|
191
|
-
from qilisdk.
|
|
205
|
+
from qilisdk.speqtrum import SpeQtrum
|
|
206
|
+
from qilisdk.functionals import Sampling
|
|
192
207
|
|
|
193
208
|
# Login to QaaSBackend with credentials (or use environment variables)
|
|
194
209
|
# This only needs to be run once.
|
|
195
|
-
|
|
210
|
+
SpeQtrum.login(username="your_username", apikey="your_apikey")
|
|
196
211
|
|
|
197
212
|
# Instantiate QaaSBackend
|
|
198
|
-
|
|
213
|
+
client = SpeQtrum()
|
|
199
214
|
|
|
200
|
-
# Execute a pre-built circuit (see Digital Quantum Circuits section)
|
|
201
|
-
|
|
202
|
-
print("
|
|
215
|
+
# # Execute a pre-built circuit (see Digital Quantum Circuits section)
|
|
216
|
+
job_id = client.submit(Sampling(circuit, 1000), device="cuda_state_vector")
|
|
217
|
+
print("job id:", job_id)
|
|
218
|
+
print("job status:", client.get_job_details(job_id).status)
|
|
219
|
+
print("job result:", client.get_job_details(job_id).result)
|
|
203
220
|
```
|
|
204
221
|
|
|
205
|
-
### CUDA-Accelerated
|
|
222
|
+
### Sample a quantum Circuit Using a CUDA-Accelerated Simulator
|
|
206
223
|
|
|
207
224
|
For users with NVIDIA GPUs, the `CudaBackend` provides GPU-accelerated simulation using several simulation methods. For example, using the TENSOR_NETWORK method:
|
|
208
225
|
|
|
209
226
|
```python
|
|
210
|
-
from qilisdk.
|
|
211
|
-
from qilisdk.digital import Circuit, H, M
|
|
227
|
+
from qilisdk.backends import CudaBackend, CudaSamplingMethod
|
|
228
|
+
from qilisdk.digital import Circuit, H, M
|
|
229
|
+
from qilisdk.functionals import Sampling
|
|
212
230
|
|
|
213
231
|
# Build a single-qubit circuit
|
|
214
232
|
circuit = Circuit(nqubits=1)
|
|
@@ -216,113 +234,123 @@ circuit.add(H(0))
|
|
|
216
234
|
circuit.add(M(0))
|
|
217
235
|
|
|
218
236
|
# Initialize CudaBackend with the TENSOR_NETWORK simulation method
|
|
219
|
-
|
|
220
|
-
results =
|
|
237
|
+
backend = CudaBackend(sampling_method=CudaSamplingMethod.TENSOR_NETWORK)
|
|
238
|
+
results = backend.execute(Sampling(circuit))
|
|
221
239
|
print("CUDA Backend Results:", results)
|
|
222
240
|
```
|
|
223
241
|
|
|
224
|
-
### Time Evolution
|
|
242
|
+
### Time Evolution using Qutip
|
|
225
243
|
|
|
226
|
-
For analog simulations, the new `TimeEvolution` and `Schedule` classes allow you to simulate time-dependent quantum dynamics. The following example uses a linear schedule to interpolate between two Hamiltonians on a
|
|
244
|
+
For analog simulations, the new `TimeEvolution` and `Schedule` classes allow you to simulate time-dependent quantum dynamics. The following example uses a linear schedule to interpolate between two Hamiltonians on a Qutip backend:
|
|
227
245
|
|
|
228
246
|
```python
|
|
229
247
|
import numpy as np
|
|
230
|
-
from qilisdk.analog import
|
|
231
|
-
from qilisdk.
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
248
|
+
from qilisdk.analog import Schedule, X, Z, Y
|
|
249
|
+
from qilisdk.common import ket, tensor_prod
|
|
250
|
+
from qilisdk.backends import QutipBackend
|
|
251
|
+
from qilisdk.functionals import TimeEvolution
|
|
252
|
+
|
|
253
|
+
# Define total time and timestep
|
|
254
|
+
T = 100
|
|
255
|
+
steps = np.linspace(0, T, T)
|
|
236
256
|
nqubits = 1
|
|
237
257
|
|
|
238
|
-
# Define
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
#
|
|
243
|
-
schedule = Schedule(
|
|
244
|
-
T,
|
|
245
|
-
dt,
|
|
246
|
-
hamiltonians={"h1": H1, "h2": H2},
|
|
247
|
-
schedule={
|
|
248
|
-
t: {"h1": 1 - steps[t] / T, "h2": steps[t] / T}
|
|
249
|
-
for t in range(len(steps))
|
|
250
|
-
},
|
|
251
|
-
)
|
|
258
|
+
# Define Hamiltonians
|
|
259
|
+
Hx = sum(X(i) for i in range(nqubits))
|
|
260
|
+
Hz = sum(Z(i) for i in range(nqubits))
|
|
261
|
+
|
|
262
|
+
# Build a time‑dependent schedule
|
|
263
|
+
schedule = Schedule(T)
|
|
252
264
|
|
|
253
|
-
#
|
|
254
|
-
|
|
265
|
+
# Add hx with a time‐dependent coefficient function
|
|
266
|
+
schedule.add_hamiltonian(label="hx", hamiltonian=Hx, schedule=lambda t: 1 - steps[t] / T)
|
|
255
267
|
|
|
256
|
-
#
|
|
268
|
+
# Add hz similarly
|
|
269
|
+
schedule.add_hamiltonian(label="hz", hamiltonian=Hz, schedule=lambda t: steps[t] / T)
|
|
270
|
+
|
|
271
|
+
# draw the schedule
|
|
272
|
+
schedule.draw()
|
|
273
|
+
|
|
274
|
+
# Prepare an equal superposition initial state
|
|
275
|
+
initial_state = tensor_prod([(ket(0) - ket(1)).unit() for _ in range(nqubits)]).unit()
|
|
276
|
+
|
|
277
|
+
# Create the TimeEvolution functional
|
|
257
278
|
time_evolution = TimeEvolution(
|
|
258
|
-
backend=CudaBackend(),
|
|
259
279
|
schedule=schedule,
|
|
260
|
-
initial_state=
|
|
280
|
+
initial_state=initial_state,
|
|
261
281
|
observables=[Z(0), X(0), Y(0)],
|
|
282
|
+
nshots=100,
|
|
283
|
+
store_intermediate_results=False,
|
|
262
284
|
)
|
|
263
|
-
|
|
264
|
-
|
|
285
|
+
|
|
286
|
+
# Execute on Qutip backend and inspect results
|
|
287
|
+
backend = QutipBackend()
|
|
288
|
+
results = backend.execute(time_evolution)
|
|
289
|
+
print(results)
|
|
265
290
|
```
|
|
266
291
|
|
|
267
|
-
### Variational
|
|
292
|
+
### Variational Programs
|
|
293
|
+
|
|
294
|
+
The `VariationalProgram` allows the user to optimized parameterized functionals, including `Sampling` and `TimeEvolution`.
|
|
295
|
+
|
|
268
296
|
|
|
269
|
-
|
|
297
|
+
Here you find an example of building a Variational Quantum Eigensolver (VQE). To do this we need a circuit ansatz, cost function to optimize, and classical optimizer. Below is an illustrative example that sets up a VQE instance using a hardware-efficient ansatz and the SciPy optimizer:
|
|
270
298
|
|
|
271
299
|
```python
|
|
272
|
-
import
|
|
273
|
-
from qilisdk.
|
|
274
|
-
from qilisdk.
|
|
275
|
-
from qilisdk.
|
|
300
|
+
from qilisdk.digital.gates import U2, CNOT
|
|
301
|
+
from qilisdk.optimizers import SciPyOptimizer
|
|
302
|
+
from qilisdk.common.model import Model
|
|
303
|
+
from qilisdk.common.variables import LEQ, BinaryVariable
|
|
304
|
+
from qilisdk.digital.ansatz import HardwareEfficientAnsatz
|
|
305
|
+
from qilisdk.functionals import VariationalProgram, Sampling
|
|
306
|
+
from qilisdk.backends import CudaBackend
|
|
307
|
+
from qilisdk.cost_functions import ModelCostFunction
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
## Define the model
|
|
311
|
+
|
|
312
|
+
model = Model("Knapsack")
|
|
313
|
+
|
|
314
|
+
values = [2, 3, 7]
|
|
315
|
+
weights = [1, 3, 3]
|
|
316
|
+
max_weight = 4
|
|
317
|
+
b = [BinaryVariable(f"b{i}") for i in range(len(values))]
|
|
318
|
+
|
|
319
|
+
obj = sum(b[i] * values[i] for i in range(len(values)))
|
|
320
|
+
model.set_objective(obj, "obj")
|
|
276
321
|
|
|
322
|
+
con = LEQ(sum(b[i] * weights[i] for i in range(len(weights))), max_weight)
|
|
277
323
|
|
|
278
|
-
|
|
279
|
-
n_items = 4
|
|
280
|
-
weights = [np.random.randint(1, 5) for _ in range(n_items)]
|
|
281
|
-
values = [np.random.randint(1, 10) for _ in range(n_items)]
|
|
282
|
-
max_weight_perc = 0.6
|
|
283
|
-
max_w = int(max_weight_perc * sum(weights))
|
|
284
|
-
nqubits = n_items
|
|
324
|
+
model.add_constraint("max_weight", con)
|
|
285
325
|
|
|
286
|
-
|
|
326
|
+
## Define the Ansatz:
|
|
327
|
+
nqubits = 3
|
|
287
328
|
ansatz = HardwareEfficientAnsatz(
|
|
288
|
-
|
|
289
|
-
connectivity="Full",
|
|
290
|
-
layers=1,
|
|
291
|
-
one_qubit_gate="U3",
|
|
292
|
-
two_qubit_gate="CNOT"
|
|
329
|
+
nqubits=nqubits, layers=2, connectivity="Linear", structure="grouped", one_qubit_gate=U2, two_qubit_gate=CNOT
|
|
293
330
|
)
|
|
294
331
|
|
|
295
|
-
|
|
296
|
-
|
|
332
|
+
## Define the Optimizer
|
|
333
|
+
optimizer = SciPyOptimizer(method="Powell")
|
|
297
334
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
final_cost = 0
|
|
304
|
-
for bitstring, prob in most_probable:
|
|
305
|
-
x_n = [int(bit) for bit in bitstring]
|
|
306
|
-
total_weight = sum(weights[i] * x_n[i] for i in range(n_items))
|
|
307
|
-
penalty = (total_weight - max_w) if total_weight > max_w else 0
|
|
308
|
-
reward = -sum(values[i] * x_n[i] for i in range(n_items))
|
|
309
|
-
final_cost += prob * (LM * penalty + reward)
|
|
310
|
-
return final_cost
|
|
311
|
-
|
|
312
|
-
optimizer = SciPyOptimizer(
|
|
313
|
-
method="Powell",
|
|
314
|
-
bounds=[(0, np.pi)] * ansatz.nparameters
|
|
335
|
+
## Build the VQE object
|
|
336
|
+
vqe = VariationalProgram(
|
|
337
|
+
functional=Sampling(ansatz),
|
|
338
|
+
optimizer=optimizer,
|
|
339
|
+
cost_function=ModelCostFunction(model),
|
|
315
340
|
)
|
|
316
341
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
342
|
+
## Define the Backend
|
|
343
|
+
backend = CudaBackend()
|
|
344
|
+
|
|
345
|
+
## Execute the VQE to find the optimal parameters
|
|
346
|
+
result = backend.execute(vqe)
|
|
320
347
|
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
348
|
+
## Sample the circuit using the optimal parameters
|
|
349
|
+
ansatz.set_parameter_values(result.optimal_parameters)
|
|
350
|
+
results = backend.execute(Sampling(ansatz))
|
|
351
|
+
|
|
352
|
+
## Print the probabilities
|
|
353
|
+
print(results.get_probabilities())
|
|
326
354
|
```
|
|
327
355
|
|
|
328
356
|
### Open QASM Serialization
|
|
@@ -331,7 +359,7 @@ Serialize and deserialize quantum circuits using Open QASM 2.0 grammar. The util
|
|
|
331
359
|
|
|
332
360
|
```python
|
|
333
361
|
from qilisdk.digital import Circuit, CNOT, RX, H, M
|
|
334
|
-
from qilisdk.utils import to_qasm2, from_qasm2, to_qasm2_file, from_qasm2_file
|
|
362
|
+
from qilisdk.utils.openqasm2 import to_qasm2, from_qasm2, to_qasm2_file, from_qasm2_file
|
|
335
363
|
|
|
336
364
|
# Create a sample circuit
|
|
337
365
|
circuit = Circuit(3)
|
|
@@ -340,6 +368,8 @@ circuit.add(CNOT(0, 1))
|
|
|
340
368
|
circuit.add(RX(2, theta=3.1415))
|
|
341
369
|
circuit.add(M(0, 1, 2))
|
|
342
370
|
|
|
371
|
+
print("Initial Circuit:")
|
|
372
|
+
circuit.draw()
|
|
343
373
|
# Serialize to QASM string
|
|
344
374
|
qasm_code = to_qasm2(circuit)
|
|
345
375
|
print("Generated QASM:")
|
|
@@ -351,21 +381,29 @@ reconstructed_circuit = from_qasm2(qasm_code)
|
|
|
351
381
|
# Save to and load from a file
|
|
352
382
|
to_qasm2_file(circuit, "circuit.qasm")
|
|
353
383
|
reconstructed_circuit = from_qasm2_file("circuit.qasm")
|
|
384
|
+
print()
|
|
385
|
+
print("Reconstructed Circuit:")
|
|
386
|
+
reconstructed_circuit.draw()
|
|
387
|
+
|
|
388
|
+
|
|
354
389
|
```
|
|
355
390
|
|
|
356
391
|
### YAML Serialization
|
|
357
392
|
|
|
358
|
-
Easily save and restore circuits,
|
|
393
|
+
Easily save and restore circuits, Hamiltonians, simulation and execution results, and virtually any other class in YAML format using the provided serialization functions:
|
|
359
394
|
|
|
360
395
|
```python
|
|
361
396
|
from qilisdk.digital import Circuit, H, CNOT, M
|
|
362
|
-
from qilisdk.utils import serialize, deserialize, serialize_to, deserialize_from
|
|
397
|
+
from qilisdk.utils.serialization import serialize, deserialize, serialize_to, deserialize_from
|
|
363
398
|
|
|
364
399
|
circuit = Circuit(2)
|
|
365
400
|
circuit.add(H(0))
|
|
366
401
|
circuit.add(CNOT(0, 1))
|
|
367
402
|
circuit.add(M(0, 1))
|
|
368
403
|
|
|
404
|
+
print("Initial Circuit:")
|
|
405
|
+
circuit.draw()
|
|
406
|
+
|
|
369
407
|
# Serialize a circuit to a YAML string
|
|
370
408
|
yaml_string = serialize(circuit)
|
|
371
409
|
|
|
@@ -373,8 +411,11 @@ yaml_string = serialize(circuit)
|
|
|
373
411
|
restored_circuit = deserialize(yaml_string, cls=Circuit)
|
|
374
412
|
|
|
375
413
|
# Alternatively, work with files:
|
|
376
|
-
serialize_to(circuit,
|
|
377
|
-
restored_circuit = deserialize_from(
|
|
414
|
+
serialize_to(circuit, "circuit.yml")
|
|
415
|
+
restored_circuit = deserialize_from("circuit.yml", cls=Circuit)
|
|
416
|
+
print()
|
|
417
|
+
print("Reconstructed Circuit:")
|
|
418
|
+
restored_circuit.draw()
|
|
378
419
|
```
|
|
379
420
|
|
|
380
421
|
---
|
|
@@ -414,11 +455,15 @@ This section covers how to set up a local development environment for qilisdk, r
|
|
|
414
455
|
uv sync
|
|
415
456
|
```
|
|
416
457
|
This sets up a virtual environment and installs all pinned dependencies (including `ruff`, `mypy`, `towncrier`, etc.).
|
|
417
|
-
- To install extra dependencies such as `
|
|
458
|
+
- To install extra dependencies such as `CudaBackend`, run:
|
|
418
459
|
```bash
|
|
419
|
-
uv sync --extra
|
|
460
|
+
uv sync --extra cuda -extra ...
|
|
420
461
|
```
|
|
421
462
|
This sets up a virtual environment and installs all pinned dependencies (previous), plus the specified extras.
|
|
463
|
+
you can also install all the optional dependencies and groups by running;
|
|
464
|
+
```bash
|
|
465
|
+
uv sync --all-extras --all-groups
|
|
466
|
+
```
|
|
422
467
|
|
|
423
468
|
4. **Activate the virtual environment**:
|
|
424
469
|
- uv typically creates and manages its own environment, e.g., `.venv/`.
|
|
@@ -488,7 +533,7 @@ changes/123.feature.rst
|
|
|
488
533
|
```
|
|
489
534
|
Inside this file, you briefly describe the new feature:
|
|
490
535
|
```rst
|
|
491
|
-
Added a new `cool_feature` in the `qilisdk.
|
|
536
|
+
Added a new `cool_feature` in the `qilisdk.backend` module.
|
|
492
537
|
```
|
|
493
538
|
Instead of manually creating the file, you can run:
|
|
494
539
|
```bash
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
qilisdk/__init__.py,sha256=ewlADDRquvUClgPp1fDx5gfsPsmUHl3LF42ROLqeI5g,824
|
|
2
|
+
qilisdk/__init__.pyi,sha256=7O8kvYmk9hl0OKHgXJkemmYp-x_zppNRuN_WAZeHjbo,630
|
|
3
|
+
qilisdk/_logging.py,sha256=vCKCClIwAY9KptzieYbldU6MVs-HYZ4P1imG2oXkumM,4063
|
|
4
|
+
qilisdk/_optionals.py,sha256=WkYAtoE4RcPtgl7l4OJNGeXwJc0xc8M_UQCpVHS1lmo,3459
|
|
5
|
+
qilisdk/logging_config.yaml,sha256=DxsAJBPr1o54pjtYRnzMHuDbrr8hv4ruym8rLRmUKEk,381
|
|
6
|
+
qilisdk/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
|
+
qilisdk/settings.py,sha256=PtiO3iInoBIBLTO_t6D5iWN5a3FuqO4DXyPKmpnph-A,2827
|
|
8
|
+
qilisdk/yaml.py,sha256=UcildGIQq1vMmjKLgFAbd-tN5nwYHlAUi6cs_8r8_As,8050
|
|
9
|
+
qilisdk/analog/__init__.py,sha256=HZecq1CdbZ9ilgxeXcuNQDYv0qYUqi-Mvta-WZPoGT4,862
|
|
10
|
+
qilisdk/analog/exceptions.py,sha256=oYRJD00ICs9M6hezXPv7C7Ug6amcbbGDeP-1o1GkECc,717
|
|
11
|
+
qilisdk/analog/hamiltonian.py,sha256=UbjPmgGZtAO0O99RTJWuCS4M19XFSr2VsL2utszI9eo,39994
|
|
12
|
+
qilisdk/analog/linear_schedule.py,sha256=lVjSvvOxRHBqfCezWEqa4ndQTj4ffSN0FeFLHKAS2Zw,4775
|
|
13
|
+
qilisdk/analog/schedule.py,sha256=gzyAjjTbiCtlPvQxV8wRfLFXetiyp4_fVhW01rE_nsc,22760
|
|
14
|
+
qilisdk/backends/__init__.py,sha256=QHJ99ub4WPMmSMEs_Zdx3yF6d7K9uBapKp0FgvZ12L8,1666
|
|
15
|
+
qilisdk/backends/__init__.pyi,sha256=JP6QY7BqO0LuN7NPAWU0ebBwfcKEJ5w5p4xHa5GNKhA,752
|
|
16
|
+
qilisdk/backends/backend.py,sha256=G0duQuO6Cf9en36eiFunLpmWNKmtQJzN4RuMxV8sp6w,5241
|
|
17
|
+
qilisdk/backends/cuda_backend.py,sha256=1OnkodWH7u2cDlJ9SuIxBtBjCx-bsTkJYEnyqz4KiqQ,17084
|
|
18
|
+
qilisdk/backends/qutip_backend.py,sha256=LgOMNFGzYHtxeOk9PnBDWRUacT1z_LuqTpae0l-aALU,19585
|
|
19
|
+
qilisdk/common/__init__.py,sha256=etcRx1P5YrIAEqkfRuZ8RuF0AFxLFgwM6VTUcBiev9o,1405
|
|
20
|
+
qilisdk/common/algorithm.py,sha256=RgXo5rhl0yON6M77hRI82fmtflwkwUS7ADZPUZw_pQE,682
|
|
21
|
+
qilisdk/common/exceptions.py,sha256=f72N4SRj-oUkHVKVV_Drj6oinTJODNM0LxdFn6AHuBE,1034
|
|
22
|
+
qilisdk/common/model.py,sha256=FAw_YksZnqrfPUKO7mkOrKYthWYKgOgiz-CVZaym2JY,41583
|
|
23
|
+
qilisdk/common/parameterizable.py,sha256=hdibs--MFKn7Sy3CuFbn7Bk2ozPe0206jAuXfyMQdNY,2575
|
|
24
|
+
qilisdk/common/qtensor.py,sha256=gyPcYpi5fumyFctlniZfjGhDvQZ8LjSFodKxXQSK43w,26016
|
|
25
|
+
qilisdk/common/result.py,sha256=EUCWebtdeBwGjhVCBgStuEVmx-U1WR0ZOX7ALAnLrmI,700
|
|
26
|
+
qilisdk/common/variables.py,sha256=f98valt1445iysG7CXEpPaiqTeLuYwcoPYBAL952_GA,71826
|
|
27
|
+
qilisdk/cost_functions/__init__.py,sha256=tKoEm4eVb8oTGGhj25nM2YQE73CRXaLgLyfipa2I70s,760
|
|
28
|
+
qilisdk/cost_functions/cost_function.py,sha256=NyUy-2pp5A_KMjFZ5vIvl0pw5aGD024i-2X2AUKasDo,2852
|
|
29
|
+
qilisdk/cost_functions/model_cost_function.py,sha256=gU2-nRlPCv_Dwkt2GSWRtAtjkMOyTppMX4uD_cp9Uno,5715
|
|
30
|
+
qilisdk/cost_functions/observable_cost_function.py,sha256=lPYrnQr9Tf6VD7YbDY4l8q9VY-xF_o0rLtbefku3C0M,4188
|
|
31
|
+
qilisdk/digital/__init__.py,sha256=qmE0VTKdD9ILlx6ClhBjvOXbpD0nr3uavG-l3VSh69c,989
|
|
32
|
+
qilisdk/digital/ansatz.py,sha256=HJLhC5o5sh8aw4itLnYoZ6cUZMunFIC0FFFBjYT0OJQ,8074
|
|
33
|
+
qilisdk/digital/circuit.py,sha256=3oSkStK91wPG_ozjEGDoDder6PFs5yV5xp6InonoPPo,6911
|
|
34
|
+
qilisdk/digital/exceptions.py,sha256=dtMN9yjX_qRWJ5iFfNTHWVwKB7BrrSecvjB4D0KeoEA,1292
|
|
35
|
+
qilisdk/digital/gates.py,sha256=3on8XI0zZd7WFF15Rr7KNV-se7AOZSf5FBKgX60w1Tk,33651
|
|
36
|
+
qilisdk/functionals/__init__.py,sha256=1Yrk8SyJ98yNYm658HeyaPFaNdMBH96PPlv6oEGGwpM,1037
|
|
37
|
+
qilisdk/functionals/functional.py,sha256=z0KrJ6CPD_FawpYYereXnaiFnX1TyfEmK5pf9HzY_ew,1449
|
|
38
|
+
qilisdk/functionals/functional_result.py,sha256=jEtMEoJcezFgIa1AsJDNg0nm5HSJJOEXkr5eVo2u4bI,743
|
|
39
|
+
qilisdk/functionals/sampling.py,sha256=LkZJW2oHqDcGiARmKJPp3qwNmUEd0ygJfIUAjigKlnY,3266
|
|
40
|
+
qilisdk/functionals/sampling_result.py,sha256=tUXOHJOtznGyWsHK4MLtP1bTSdD6zppbT2K2lcQFkyo,3411
|
|
41
|
+
qilisdk/functionals/time_evolution.py,sha256=ixSTvtd5zckhTmyZsylpEUxTdPYx9siag_l5NfIy6CU,4155
|
|
42
|
+
qilisdk/functionals/time_evolution_result.py,sha256=kwagAEZdumaWcJzRL0t25wXYIqH9hIax7jL4i0KEDV8,3495
|
|
43
|
+
qilisdk/functionals/variational_program.py,sha256=wD5oHYBMUGRNCn-SFjTHE6r0oqd5y3KxQ8dkgbANS94,3029
|
|
44
|
+
qilisdk/functionals/variational_program_result.py,sha256=Dii9D1BnUpfsBfgN60eFVp7Qhsr2mIFSbUtM5Q4KZeI,2657
|
|
45
|
+
qilisdk/optimizers/__init__.py,sha256=v3pLS__wnVRCiz83y8-gUjRuW-BoAGXFpd6HUmLodgY,663
|
|
46
|
+
qilisdk/optimizers/optimizer.py,sha256=GT9ziwPJ2ZjckOeeoyc07O3XyaVsRmUnVxN0UXNaO7Y,1570
|
|
47
|
+
qilisdk/optimizers/optimizer_result.py,sha256=OjwgED_tAKkp4rqqnq0ordaLp09B2lbN5Yfjed9qUak,3477
|
|
48
|
+
qilisdk/optimizers/scipy_optimizer.py,sha256=JquRPvpWJ6ccpzxlo9HKV66cz4kYwEXEPe3jNeT8_sE,5020
|
|
49
|
+
qilisdk/speqtrum/__init__.py,sha256=7fvKWdhNrfhRFNJuCNg-VKZ-mr0VlPlfbbLWYUBdqqM,1537
|
|
50
|
+
qilisdk/speqtrum/__init__.pyi,sha256=2_3FiMTnJe0rUuK-arKd4JuIt3tJ9ci-a8ipgMdOSSo,728
|
|
51
|
+
qilisdk/speqtrum/keyring.py,sha256=zPYSAqq9A0hfjWdchTCy9oZi72HPFvtxDoblHDvpjhA,1898
|
|
52
|
+
qilisdk/speqtrum/speqtrum.py,sha256=Je-Euanqa2yANhLaeRZ59OMpsCQatPq6MRBjJANS9E4,17387
|
|
53
|
+
qilisdk/speqtrum/speqtrum_models.py,sha256=eI5xg3flP6N-UObffI75BhNcSmNp511N3WoGSw-yCHU,9952
|
|
54
|
+
qilisdk/speqtrum/experiments/__init__.py,sha256=FlXV-8SR8VMRKMxbgj3sa8kHcueTsw6NT9j0zm6Tk_U,955
|
|
55
|
+
qilisdk/speqtrum/experiments/experiment_functional.py,sha256=0yuuDZJzI2OaHsKmbQrkXeK4Ih2PQilKLuwqdXZxdC4,4363
|
|
56
|
+
qilisdk/speqtrum/experiments/experiment_result.py,sha256=O398vInFShp4n8YvUSfit1kgNCnlSZ9F07xHipxRHkc,8201
|
|
57
|
+
qilisdk/utils/__init__.py,sha256=LDSTo7NstSbHMvvqvx7ZLxh0HFTEXg1O_B76SyEEHk8,588
|
|
58
|
+
qilisdk/utils/openqasm2.py,sha256=IMHT3BRbpS4giKg5JCZ4tt6BpD7eDEJMALrW7w1RvPw,8322
|
|
59
|
+
qilisdk/utils/serialization.py,sha256=_SmxxbshMtSozCHdzi_Y_3YZ7-KNjsrlfgkBtJ3mAjw,3870
|
|
60
|
+
qilisdk/utils/visualization/PlusJakartaSans-SemiBold.ttf,sha256=kcACUvAhK3AgdI7-50kwPyG0xdtAodY9-UhPbw2NtTk,94844
|
|
61
|
+
qilisdk/utils/visualization/__init__.py,sha256=p3OTMwM2eF5_LZW0-kYU8IqcEyQySxjDKnqDfCw3dpg,769
|
|
62
|
+
qilisdk/utils/visualization/circuit_renderers.py,sha256=20X--lgQdwmu08pvuekdebOI01hRHknl0Z8ct4OVWOU,29908
|
|
63
|
+
qilisdk/utils/visualization/schedule_renderers.py,sha256=RhigVpXgZF_iHg2W8EOdvwL_g2j_mCw-gIgFvgJcjLM,6005
|
|
64
|
+
qilisdk/utils/visualization/style.py,sha256=l50u4UGCbU0r_BBuij35M4sTrmYh_e0m1IgRY-DjfH8,7288
|
|
65
|
+
qilisdk/utils/visualization/themes.py,sha256=uganZjDx742bmGVG73UU6Lde5XXjlDNfVNEa9y_icBw,2346
|
|
66
|
+
qilisdk-0.1.5.dist-info/METADATA,sha256=Yclcu1KkOs4WMosRTkCT_lT6mLNsvMQqeOoP4UIhQuw,19301
|
|
67
|
+
qilisdk-0.1.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
68
|
+
qilisdk-0.1.5.dist-info/licenses/LICENCE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
69
|
+
qilisdk-0.1.5.dist-info/RECORD,,
|