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.
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 +152 -159
  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.4.dist-info → qilisdk-0.1.5.dist-info}/METADATA +180 -134
  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 -596
  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.4.dist-info/RECORD +0 -51
  82. {qilisdk-0.1.4.dist-info → qilisdk-0.1.5.dist-info}/WHEEL +0 -0
  83. {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
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: cuda-quantum-cu12; 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,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
- 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 Schedule, TimeEvolution, ket, X, Z, Y, tensor_prod
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_prod([(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
279
  schedule=schedule,
259
- initial_state=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
- results = time_evolution.evolve(backend=CudaBackend(), store_intermediate_results=True)
263
- 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)
264
290
  ```
265
291
 
266
- ### Variational Quantum Eigensolver (VQE)
292
+ ### Variational Programs
293
+
294
+ The `VariationalProgram` allows the user to optimized parameterized functionals, including `Sampling` and `TimeEvolution`.
295
+
267
296
 
268
- 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:
269
298
 
270
299
  ```python
271
- import numpy as np
272
- from qilisdk.common import SciPyOptimizer
273
- from qilisdk.digital import HardwareEfficientAnsatz, VQE
274
- 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")
275
321
 
322
+ con = LEQ(sum(b[i] * weights[i] for i in range(len(weights))), max_weight)
276
323
 
277
- # Define problem parameters
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
- # Initialize a hardware-efficient ansatz
326
+ ## Define the Ansatz:
327
+ nqubits = 3
286
328
  ansatz = HardwareEfficientAnsatz(
287
- n_qubits=nqubits,
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
- # Use a CUDA backend for simulation
295
- backend = CudaBackend()
332
+ ## Define the Optimizer
333
+ optimizer = SciPyOptimizer(method="Powell")
296
334
 
297
- LM = sum(values)
298
-
299
- def cost_function(result):
300
- # Get the most probable outcomes from the digital result
301
- most_probable = result.get_probabilities()
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
- # Initialize and execute the VQE algorithm
317
- vqe = VQE(ansatz, [0.5] * ansatz.nparameters, cost_function)
318
- 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)
319
347
 
320
- print("Optimal Cost:", results.optimal_cost)
321
- print("Optimal Parameters:", results.optimal_parameters)
322
- print("Intermediate Optimization Steps:")
323
- for intermediate in results.intermediate_results:
324
- 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())
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, 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:
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, 'circuit.yml')
376
- 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()
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 `qibo-backend`, run:
458
+ - To install extra dependencies such as `CudaBackend`, run:
417
459
  ```bash
418
- uv sync --extra qibo-backend -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.extras` module.
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,,