qilisdk 0.1.4__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 +152 -159
- 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.4.dist-info → qilisdk-0.1.5.dist-info}/METADATA +180 -134
- 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 -596
- 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.4.dist-info/RECORD +0 -51
- {qilisdk-0.1.4.dist-info → qilisdk-0.1.5.dist-info}/WHEEL +0 -0
- {qilisdk-0.1.4.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: cuda-quantum-cu12; extra == 'cuda'
|
|
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,112 +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 Schedule,
|
|
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
279
|
schedule=schedule,
|
|
259
|
-
initial_state=
|
|
280
|
+
initial_state=initial_state,
|
|
260
281
|
observables=[Z(0), X(0), Y(0)],
|
|
282
|
+
nshots=100,
|
|
283
|
+
store_intermediate_results=False,
|
|
261
284
|
)
|
|
262
|
-
|
|
263
|
-
|
|
285
|
+
|
|
286
|
+
# Execute on Qutip backend and inspect results
|
|
287
|
+
backend = QutipBackend()
|
|
288
|
+
results = backend.execute(time_evolution)
|
|
289
|
+
print(results)
|
|
264
290
|
```
|
|
265
291
|
|
|
266
|
-
### Variational
|
|
292
|
+
### Variational Programs
|
|
293
|
+
|
|
294
|
+
The `VariationalProgram` allows the user to optimized parameterized functionals, including `Sampling` and `TimeEvolution`.
|
|
295
|
+
|
|
267
296
|
|
|
268
|
-
|
|
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:
|
|
269
298
|
|
|
270
299
|
```python
|
|
271
|
-
import
|
|
272
|
-
from qilisdk.
|
|
273
|
-
from qilisdk.
|
|
274
|
-
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")
|
|
275
321
|
|
|
322
|
+
con = LEQ(sum(b[i] * weights[i] for i in range(len(weights))), max_weight)
|
|
276
323
|
|
|
277
|
-
|
|
278
|
-
n_items = 4
|
|
279
|
-
weights = [np.random.randint(1, 5) for _ in range(n_items)]
|
|
280
|
-
values = [np.random.randint(1, 10) for _ in range(n_items)]
|
|
281
|
-
max_weight_perc = 0.6
|
|
282
|
-
max_w = int(max_weight_perc * sum(weights))
|
|
283
|
-
nqubits = n_items
|
|
324
|
+
model.add_constraint("max_weight", con)
|
|
284
325
|
|
|
285
|
-
|
|
326
|
+
## Define the Ansatz:
|
|
327
|
+
nqubits = 3
|
|
286
328
|
ansatz = HardwareEfficientAnsatz(
|
|
287
|
-
|
|
288
|
-
connectivity="Full",
|
|
289
|
-
layers=1,
|
|
290
|
-
one_qubit_gate="U3",
|
|
291
|
-
two_qubit_gate="CNOT"
|
|
329
|
+
nqubits=nqubits, layers=2, connectivity="Linear", structure="grouped", one_qubit_gate=U2, two_qubit_gate=CNOT
|
|
292
330
|
)
|
|
293
331
|
|
|
294
|
-
|
|
295
|
-
|
|
332
|
+
## Define the Optimizer
|
|
333
|
+
optimizer = SciPyOptimizer(method="Powell")
|
|
296
334
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
final_cost = 0
|
|
303
|
-
for bitstring, prob in most_probable:
|
|
304
|
-
x_n = [int(bit) for bit in bitstring]
|
|
305
|
-
total_weight = sum(weights[i] * x_n[i] for i in range(n_items))
|
|
306
|
-
penalty = (total_weight - max_w) if total_weight > max_w else 0
|
|
307
|
-
reward = -sum(values[i] * x_n[i] for i in range(n_items))
|
|
308
|
-
final_cost += prob * (LM * penalty + reward)
|
|
309
|
-
return final_cost
|
|
310
|
-
|
|
311
|
-
optimizer = SciPyOptimizer(
|
|
312
|
-
method="Powell",
|
|
313
|
-
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),
|
|
314
340
|
)
|
|
315
341
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
342
|
+
## Define the Backend
|
|
343
|
+
backend = CudaBackend()
|
|
344
|
+
|
|
345
|
+
## Execute the VQE to find the optimal parameters
|
|
346
|
+
result = backend.execute(vqe)
|
|
319
347
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
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())
|
|
325
354
|
```
|
|
326
355
|
|
|
327
356
|
### Open QASM Serialization
|
|
@@ -330,7 +359,7 @@ Serialize and deserialize quantum circuits using Open QASM 2.0 grammar. The util
|
|
|
330
359
|
|
|
331
360
|
```python
|
|
332
361
|
from qilisdk.digital import Circuit, CNOT, RX, H, M
|
|
333
|
-
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
|
|
334
363
|
|
|
335
364
|
# Create a sample circuit
|
|
336
365
|
circuit = Circuit(3)
|
|
@@ -339,6 +368,8 @@ circuit.add(CNOT(0, 1))
|
|
|
339
368
|
circuit.add(RX(2, theta=3.1415))
|
|
340
369
|
circuit.add(M(0, 1, 2))
|
|
341
370
|
|
|
371
|
+
print("Initial Circuit:")
|
|
372
|
+
circuit.draw()
|
|
342
373
|
# Serialize to QASM string
|
|
343
374
|
qasm_code = to_qasm2(circuit)
|
|
344
375
|
print("Generated QASM:")
|
|
@@ -350,21 +381,29 @@ reconstructed_circuit = from_qasm2(qasm_code)
|
|
|
350
381
|
# Save to and load from a file
|
|
351
382
|
to_qasm2_file(circuit, "circuit.qasm")
|
|
352
383
|
reconstructed_circuit = from_qasm2_file("circuit.qasm")
|
|
384
|
+
print()
|
|
385
|
+
print("Reconstructed Circuit:")
|
|
386
|
+
reconstructed_circuit.draw()
|
|
387
|
+
|
|
388
|
+
|
|
353
389
|
```
|
|
354
390
|
|
|
355
391
|
### YAML Serialization
|
|
356
392
|
|
|
357
|
-
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:
|
|
358
394
|
|
|
359
395
|
```python
|
|
360
396
|
from qilisdk.digital import Circuit, H, CNOT, M
|
|
361
|
-
from qilisdk.utils import serialize, deserialize, serialize_to, deserialize_from
|
|
397
|
+
from qilisdk.utils.serialization import serialize, deserialize, serialize_to, deserialize_from
|
|
362
398
|
|
|
363
399
|
circuit = Circuit(2)
|
|
364
400
|
circuit.add(H(0))
|
|
365
401
|
circuit.add(CNOT(0, 1))
|
|
366
402
|
circuit.add(M(0, 1))
|
|
367
403
|
|
|
404
|
+
print("Initial Circuit:")
|
|
405
|
+
circuit.draw()
|
|
406
|
+
|
|
368
407
|
# Serialize a circuit to a YAML string
|
|
369
408
|
yaml_string = serialize(circuit)
|
|
370
409
|
|
|
@@ -372,8 +411,11 @@ yaml_string = serialize(circuit)
|
|
|
372
411
|
restored_circuit = deserialize(yaml_string, cls=Circuit)
|
|
373
412
|
|
|
374
413
|
# Alternatively, work with files:
|
|
375
|
-
serialize_to(circuit,
|
|
376
|
-
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()
|
|
377
419
|
```
|
|
378
420
|
|
|
379
421
|
---
|
|
@@ -413,11 +455,15 @@ This section covers how to set up a local development environment for qilisdk, r
|
|
|
413
455
|
uv sync
|
|
414
456
|
```
|
|
415
457
|
This sets up a virtual environment and installs all pinned dependencies (including `ruff`, `mypy`, `towncrier`, etc.).
|
|
416
|
-
- To install extra dependencies such as `
|
|
458
|
+
- To install extra dependencies such as `CudaBackend`, run:
|
|
417
459
|
```bash
|
|
418
|
-
uv sync --extra
|
|
460
|
+
uv sync --extra cuda -extra ...
|
|
419
461
|
```
|
|
420
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
|
+
```
|
|
421
467
|
|
|
422
468
|
4. **Activate the virtual environment**:
|
|
423
469
|
- uv typically creates and manages its own environment, e.g., `.venv/`.
|
|
@@ -487,7 +533,7 @@ changes/123.feature.rst
|
|
|
487
533
|
```
|
|
488
534
|
Inside this file, you briefly describe the new feature:
|
|
489
535
|
```rst
|
|
490
|
-
Added a new `cool_feature` in the `qilisdk.
|
|
536
|
+
Added a new `cool_feature` in the `qilisdk.backend` module.
|
|
491
537
|
```
|
|
492
538
|
Instead of manually creating the file, you can run:
|
|
493
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,,
|