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
@@ -1,11 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qilisdk
3
- Version: 0.1.3
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.
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 :: 1 - Planning
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: numpy>=2.2.4
24
- Requires-Dist: pydantic-settings>=2.8.0
25
- Requires-Dist: pydantic>=2.10.6
26
- Requires-Dist: ruamel-yaml>=0.18.10
27
- Requires-Dist: scipy>=1.15.1
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: cudaq==0.10.0; extra == 'cuda'
30
- Provides-Extra: qaas
31
- Requires-Dist: httpx>=0.28.1; extra == 'qaas'
32
- Requires-Dist: keyring>=25.6.0; extra == 'qaas'
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 Extras
97
+ ### Optional Dependencies
87
98
 
88
99
  QiliSDK supports optional modules for additional functionality:
89
100
 
90
- - **QaaS (Quantum-as-a-Service):**
91
- To interface with Qilimanjaro’s cloud-based quantum services, install the QaaS extra:
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[qaas]
105
+ pip install qilisdk[speqtrum]
95
106
  ```
96
107
 
97
- - **CUDA Acceleration:**
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
- You can also install both optional dependencies using a single command:
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,qaas]
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 QaaS), and using additional utility functions.
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, and execute it with the Qibo backend:
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)) # Apply Hadamard on qubit 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)) # Add a CNOT gate between qubit 0 and 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
- ### Hamiltonian and Analog Operations
155
+ ### Hamiltonians
147
156
 
148
- Utilize the `Hamiltonian` class for Pauli operator arithmetic. Build expressions, iterate through terms, and even round-trip using the parse feature:
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
- # Parse a Hamiltonian from its string representation
162
- parsed_H = Hamiltonian.parse("-2j Y(0)")
163
- assert H_expr == parsed_H, "The Hamiltonian does not match after parsing."
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.common import SciPyOptimizer
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
- result = optimizer.optimize(cost_function, initial_parameters)
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
- ### Quantum-as-a-Service (QaaS)
200
+ ### SpeQtrum
187
201
 
188
- QiliSDK now includes a draft backend for interfacing with Qilimanjaro's QaaS platform. This module supports secure login and a unified interface for both digital circuits and analog evolutions:
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.extras import QaaSBackend
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
- QaaSBackend.login(username="your_username", apikey="your_apikey")
210
+ SpeQtrum.login(username="your_username", apikey="your_apikey")
196
211
 
197
212
  # Instantiate QaaSBackend
198
- qaas_backend = QaaSBackend()
213
+ client = SpeQtrum()
199
214
 
200
- # Execute a pre-built circuit (see Digital Quantum Circuits section)
201
- results = qaas_backend.execute(circuit)
202
- print("QaaS Simulation Results:", results)
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 Simulation
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.extras import CudaBackend
211
- from qilisdk.digital import Circuit, H, M, DigitalSimulationMethod
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
- cuda_backend = CudaBackend(digital_simulation_method=DigitalSimulationMethod.TENSOR_NETWORK)
220
- results = cuda_backend.execute(circuit, nshots=1000)
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 CUDA backend:
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 TimeEvolution, Schedule, tensor, ket, X, Z, Y
231
- from qilisdk.extras import CudaBackend
232
-
233
- T = 10 # Total evolution time
234
- dt = 0.1 # Time-step
235
- steps = np.linspace(0, T, int(T / dt))
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 two Hamiltonians for the simulation
239
- H1 = sum(X(i) for i in range(nqubits))
240
- H2 = sum(Z(i) for i in range(nqubits))
241
-
242
- # Create a schedule for the time evolution
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
- # Prepare an initial state (equal superposition)
254
- state = tensor([(ket(0) + ket(1)).unit() for _ in range(nqubits)]).unit()
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
- # Perform time evolution on the CUDA backend with observables to monitor
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=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
- results = time_evolution.evolve(store_intermediate_results=True)
264
- print("Time Evolution Results:", results)
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 Quantum Eigensolver (VQE)
292
+ ### Variational Programs
293
+
294
+ The `VariationalProgram` allows the user to optimized parameterized functionals, including `Sampling` and `TimeEvolution`.
295
+
268
296
 
269
- The VQE algorithm integrates ansatz design, cost function evaluation, and classical optimization. Below is an illustrative example that sets up a VQE instance using a hardware-efficient ansatz and the SciPy optimizer:
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 numpy as np
273
- from qilisdk.common import SciPyOptimizer
274
- from qilisdk.digital import HardwareEfficientAnsatz, VQE
275
- from qilisdk.extras import CudaBackend
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
- # Define problem parameters
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
- # Initialize a hardware-efficient ansatz
326
+ ## Define the Ansatz:
327
+ nqubits = 3
287
328
  ansatz = HardwareEfficientAnsatz(
288
- n_qubits=nqubits,
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
- # Use a CUDA backend for simulation
296
- backend = CudaBackend()
332
+ ## Define the Optimizer
333
+ optimizer = SciPyOptimizer(method="Powell")
297
334
 
298
- LM = sum(values)
299
-
300
- def cost_function(result):
301
- # Get the most probable outcomes from the digital result
302
- most_probable = result.get_probabilities()
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
- # Initialize and execute the VQE algorithm
318
- vqe = VQE(ansatz, [0.5] * ansatz.nparameters, cost_function)
319
- results = vqe.execute(backend, optimizer, store_intermediate_results=True)
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
- print("Optimal Cost:", results.optimal_cost)
322
- print("Optimal Parameters:", results.optimal_parameters)
323
- print("Intermediate Optimization Steps:")
324
- for intermediate in results.intermediate_results:
325
- print("Cost:", intermediate.cost)
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, hamiltonians, simulation and execution results, and virtually any other class in YAML format using the provided serialization functions:
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, 'circuit.yml')
377
- restored_circuit = deserialize_from('circuit.yml', cls=Circuit)
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 `qibo-backend`, run:
458
+ - To install extra dependencies such as `CudaBackend`, run:
418
459
  ```bash
419
- uv sync --extra qibo-backend -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.extras` module.
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,,