qoro-divi 0.3.4__py3-none-any.whl → 0.3.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.

Potentially problematic release.


This version of qoro-divi might be problematic. Click here for more details.

@@ -49,14 +49,6 @@ def _sanitize_problem_input(qubo: T) -> tuple[T, BinaryQuadraticModel]:
49
49
  raise ValueError(f"Got an unsupported QUBO input format: {type(qubo)}")
50
50
 
51
51
 
52
- def _run_and_compute_solution(program: QuantumProgram):
53
- program.run()
54
-
55
- final_sol_circuit_count, final_sol_run_time = program.compute_final_solution()
56
-
57
- return final_sol_circuit_count, final_sol_run_time
58
-
59
-
60
52
  class QUBOPartitioningQAOA(ProgramBatch):
61
53
  def __init__(
62
54
  self,
@@ -94,10 +86,10 @@ class QUBOPartitioningQAOA(ProgramBatch):
94
86
  self._partitioning = hybrid.Unwind(decomposer)
95
87
  self._aggregating = hybrid.Reduce(hybrid.Lambda(_merge_substates)) | composer
96
88
 
97
- self._task_fn = _run_and_compute_solution
98
-
99
89
  self.max_iterations = max_iterations
100
90
 
91
+ self.trivial_program_ids = set()
92
+
101
93
  self._constructor = partial(
102
94
  QAOA,
103
95
  optimizer=optimizer if optimizer is not None else MonteCarloOptimizer(),
@@ -140,6 +132,12 @@ class QUBOPartitioningQAOA(ProgramBatch):
140
132
  del partition["problem"]
141
133
 
142
134
  prog_id = (string.ascii_uppercase[i], len(partition.subproblem))
135
+ self.prog_id_to_bqm_subproblem_states[prog_id] = partition
136
+
137
+ if partition.subproblem.num_interactions == 0:
138
+ # Skip creating a full QAOA program for this trivial case.
139
+ self.trivial_program_ids.add(prog_id)
140
+ continue
143
141
 
144
142
  ldata, (irow, icol, qdata), _ = partition.subproblem.to_numpy_vectors(
145
143
  partition.subproblem.variables
@@ -155,18 +153,30 @@ class QUBOPartitioningQAOA(ProgramBatch):
155
153
  ),
156
154
  shape=(len(ldata), len(ldata)),
157
155
  )
158
- self.prog_id_to_bqm_subproblem_states[prog_id] = partition
159
- self.programs[prog_id] = self._constructor(
156
+
157
+ self._programs[prog_id] = self._constructor(
160
158
  job_id=prog_id,
161
159
  problem=coo_mat,
162
- losses=self._manager.list(),
163
- probs=self._manager.dict(),
164
- final_params=self._manager.list(),
165
- solution_bitstring=self._manager.list(),
166
160
  progress_queue=self._queue,
167
161
  )
168
162
 
169
163
  def aggregate_results(self):
164
+ """
165
+ Aggregate results from all QUBO subproblems into a global solution.
166
+
167
+ Collects solutions from each partitioned subproblem (both QAOA-optimized and
168
+ trivial ones) and uses the hybrid framework composer to combine them into
169
+ a final solution for the original QUBO problem.
170
+
171
+ Returns:
172
+ tuple: A tuple containing:
173
+ - solution (np.ndarray): Binary solution vector for the QUBO problem.
174
+ - solution_energy (float): Energy/cost of the solution.
175
+
176
+ Raises:
177
+ RuntimeError: If programs haven't been run or if final probabilities
178
+ haven't been computed.
179
+ """
170
180
  super().aggregate_results()
171
181
 
172
182
  if any(len(program.probs) == 0 for program in self.programs.values()):
@@ -174,14 +184,21 @@ class QUBOPartitioningQAOA(ProgramBatch):
174
184
  "Not all final probabilities computed yet. Please call `run()` first."
175
185
  )
176
186
 
177
- for prog_id, subproblem in self.programs.items():
178
- bqm_subproblem_state = self.prog_id_to_bqm_subproblem_states[prog_id]
187
+ for (
188
+ prog_id,
189
+ bqm_subproblem_state,
190
+ ) in self.prog_id_to_bqm_subproblem_states.items():
191
+
192
+ if prog_id in self.trivial_program_ids:
193
+ # Case 1: Trivial problem. Solve classically.
194
+ # The solution is any bitstring (e.g., all zeros) with energy 0.
195
+ var_to_val = {v: 0 for v in bqm_subproblem_state.subproblem.variables}
196
+ else:
197
+ subproblem = self._programs[prog_id]
198
+ var_to_val = dict(
199
+ zip(bqm_subproblem_state.subproblem.variables, subproblem.solution)
200
+ )
179
201
 
180
- curr_final_solution = subproblem.solution
181
-
182
- var_to_val = dict(
183
- zip(bqm_subproblem_state.subproblem.variables, curr_final_solution)
184
- )
185
202
  sample_set = dimod.SampleSet.from_samples(
186
203
  dimod.as_samples(var_to_val), "BINARY", 0
187
204
  )
@@ -403,7 +403,7 @@ class VQEHyperparameterSweep(ProgramBatch):
403
403
 
404
404
  Parameters
405
405
  ----------
406
- ansatze: Sequence[VQEAnsatz]
406
+ ansatze: Sequence[Ansatz]
407
407
  A sequence of ansatz circuits to test.
408
408
  molecule_transformer: MoleculeTransformer
409
409
  A `MoleculeTransformer` object defining the configuration for
@@ -430,6 +430,15 @@ class VQEHyperparameterSweep(ProgramBatch):
430
430
  )
431
431
 
432
432
  def create_programs(self):
433
+ """
434
+ Create VQE programs for all combinations of ansatze and molecule variants.
435
+
436
+ Generates molecule variants using the configured MoleculeTransformer, then
437
+ creates a VQE program for each (ansatz, molecule_variant) pair.
438
+
439
+ Note:
440
+ Program IDs are tuples of (ansatz_name, bond_modifier_value).
441
+ """
433
442
  super().create_programs()
434
443
 
435
444
  self.molecule_variants = self.molecule_transformer.generate()
@@ -437,17 +446,29 @@ class VQEHyperparameterSweep(ProgramBatch):
437
446
  for ansatz, (modifier, molecule) in product(
438
447
  self.ansatze, self.molecule_variants.items()
439
448
  ):
440
- _job_id = (ansatz, modifier)
441
- self.programs[_job_id] = self._constructor(
449
+ _job_id = (ansatz.name, modifier)
450
+ self._programs[_job_id] = self._constructor(
442
451
  job_id=_job_id,
443
452
  molecule=molecule,
444
453
  ansatz=ansatz,
445
- losses=self._manager.list(),
446
- final_params=self._manager.list(),
447
454
  progress_queue=self._queue,
448
455
  )
449
456
 
450
457
  def aggregate_results(self):
458
+ """
459
+ Find the best ansatz and bond configuration from all VQE runs.
460
+
461
+ Compares the final energies across all ansatz/molecule combinations
462
+ and returns the configuration that achieved the lowest ground state energy.
463
+
464
+ Returns:
465
+ tuple: A tuple containing:
466
+ - best_config (tuple): (ansatz_name, bond_modifier) of the best result.
467
+ - best_energy (float): The lowest energy achieved.
468
+
469
+ Raises:
470
+ RuntimeError: If programs haven't been run or have empty losses.
471
+ """
451
472
  super().aggregate_results()
452
473
 
453
474
  all_energies = {key: prog.losses[-1] for key, prog in self.programs.items()}
@@ -485,10 +506,10 @@ class VQEHyperparameterSweep(ProgramBatch):
485
506
  modifiers = []
486
507
  min_energies = []
487
508
  for modifier in self.molecule_transformer.bond_modifiers:
488
- program_key = (ansatz, modifier)
489
- if program_key in self.programs:
509
+ program_key = (ansatz.name, modifier)
510
+ if program_key in self._programs:
490
511
  modifiers.append(modifier)
491
- curr_energies = self.programs[program_key].losses[-1]
512
+ curr_energies = self._programs[program_key].losses[-1]
492
513
  min_energies.append(min(curr_energies.values()))
493
514
 
494
515
  # Use the new .name property for the label and the color_map
@@ -504,7 +525,7 @@ class VQEHyperparameterSweep(ProgramBatch):
504
525
  energies = []
505
526
  for modifier in self.molecule_transformer.bond_modifiers:
506
527
  energies.append(
507
- min(self.programs[(ansatz, modifier)].losses[-1].values())
528
+ min(self._programs[(ansatz.name, modifier)].losses[-1].values())
508
529
  )
509
530
 
510
531
  plt.plot(
divi/reporting/_pbar.py CHANGED
@@ -9,11 +9,26 @@ from rich.progress import (
9
9
  ProgressColumn,
10
10
  SpinnerColumn,
11
11
  TextColumn,
12
+ TimeElapsedColumn,
12
13
  )
13
14
  from rich.text import Text
14
15
 
15
16
 
17
+ class _UnfinishedTaskWrapper:
18
+ """Wrapper that forces a task to appear unfinished for spinner animation."""
19
+
20
+ def __init__(self, task):
21
+ self._task = task
22
+
23
+ def __getattr__(self, name):
24
+ if name == "finished":
25
+ return False
26
+ return getattr(self._task, name)
27
+
28
+
16
29
  class ConditionalSpinnerColumn(ProgressColumn):
30
+ _FINAL_STATUSES = ("Success", "Failed", "Cancelled", "Aborted")
31
+
17
32
  def __init__(self):
18
33
  super().__init__()
19
34
  self.spinner = SpinnerColumn("point")
@@ -21,10 +36,11 @@ class ConditionalSpinnerColumn(ProgressColumn):
21
36
  def render(self, task):
22
37
  status = task.fields.get("final_status")
23
38
 
24
- if status in ("Success", "Failed"):
39
+ if status in self._FINAL_STATUSES:
25
40
  return Text("")
26
41
 
27
- return self.spinner.render(task)
42
+ # Force the task to appear unfinished for spinner animation
43
+ return self.spinner.render(_UnfinishedTaskWrapper(task))
28
44
 
29
45
 
30
46
  class PhaseStatusColumn(ProgressColumn):
@@ -38,29 +54,55 @@ class PhaseStatusColumn(ProgressColumn):
38
54
  return Text("• Success! ✅", style="bold green")
39
55
  elif final_status == "Failed":
40
56
  return Text("• Failed! ❌", style="bold red")
57
+ elif final_status == "Cancelled":
58
+ return Text("• Cancelled ⏹️", style="bold yellow")
59
+ elif final_status == "Aborted":
60
+ return Text("• Aborted ⚠️", style="dim magenta")
41
61
 
42
62
  message = task.fields.get("message")
43
63
 
44
- poll_attempt = task.fields.get("poll_attempt")
64
+ poll_attempt = task.fields.get("poll_attempt", 0)
45
65
  polling_str = ""
46
- service_job_id = ""
47
- if poll_attempt > 0:
48
- max_retries = task.fields.get("max_retries")
49
- service_job_id = task.fields.get("service_job_id").split("-")[0]
66
+ service_job_id = task.fields.get("service_job_id")
67
+
68
+ if service_job_id:
69
+ split_job_id = service_job_id.split("-")[0]
50
70
  job_status = task.fields.get("job_status")
51
- polling_str = f" [Job {service_job_id} is {job_status}. Polling attempt {poll_attempt} / {max_retries}]"
71
+
72
+ if job_status == "COMPLETED":
73
+ polling_str = f" [Job {split_job_id} is complete.]"
74
+ elif poll_attempt > 0:
75
+ max_retries = task.fields.get("max_retries")
76
+ polling_str = f" [Job {split_job_id} is {job_status}. Polling attempt {poll_attempt} / {max_retries}]"
52
77
 
53
78
  final_text = Text(f"[{message}]{polling_str}")
54
- final_text.highlight_words([service_job_id], "blue")
79
+ if service_job_id:
80
+ final_text.highlight_words([split_job_id], "blue")
55
81
 
56
82
  return final_text
57
83
 
58
84
 
59
85
  def make_progress_bar(is_jupyter: bool = False) -> Progress:
86
+ """
87
+ Create a customized Rich progress bar for tracking quantum program execution.
88
+
89
+ Builds a progress bar with custom columns including job name, completion status,
90
+ elapsed time, spinner, and phase status indicators. Automatically adapts refresh
91
+ behavior for Jupyter notebook environments.
92
+
93
+ Args:
94
+ is_jupyter (bool, optional): Whether the progress bar is being displayed in
95
+ a Jupyter notebook environment. Affects refresh behavior. Defaults to False.
96
+
97
+ Returns:
98
+ Progress: A configured Rich Progress instance with custom columns for
99
+ quantum program tracking.
100
+ """
60
101
  return Progress(
61
102
  TextColumn("[bold blue]{task.fields[job_name]}"),
62
103
  BarColumn(),
63
104
  MofNCompleteColumn(),
105
+ TimeElapsedColumn(),
64
106
  ConditionalSpinnerColumn(),
65
107
  PhaseStatusColumn(),
66
108
  # For jupyter notebooks, refresh manually instead
@@ -30,6 +30,18 @@ def _is_jupyter():
30
30
  return False # IPython is not installed
31
31
 
32
32
 
33
+ class CustomFormatter(logging.Formatter):
34
+ """
35
+ A custom log formatter that removes '._reporter' from the logger name.
36
+ """
37
+
38
+ def format(self, record):
39
+ # Modify the record's name attribute in place
40
+ if record.name.endswith("._reporter"):
41
+ record.name = record.name.removesuffix("._reporter")
42
+ return super().format(record)
43
+
44
+
33
45
  class OverwriteStreamHandler(logging.StreamHandler):
34
46
  def __init__(self, stream=None):
35
47
  super().__init__(stream)
@@ -100,9 +112,24 @@ class OverwriteStreamHandler(logging.StreamHandler):
100
112
 
101
113
 
102
114
  def enable_logging(level=logging.INFO):
115
+ """
116
+ Enable logging for the divi package with custom formatting.
117
+
118
+ Sets up a custom logger with an OverwriteStreamHandler that supports
119
+ message overwriting (for progress updates) and removes the '._reporter'
120
+ suffix from logger names.
121
+
122
+ Args:
123
+ level (int, optional): Logging level to set (e.g., logging.INFO,
124
+ logging.DEBUG). Defaults to logging.INFO.
125
+
126
+ Note:
127
+ This function clears any existing handlers and sets up a new handler
128
+ with custom formatting.
129
+ """
103
130
  root_logger = logging.getLogger(__name__.split(".")[0])
104
131
 
105
- formatter = logging.Formatter(
132
+ formatter = CustomFormatter(
106
133
  "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
107
134
  datefmt="%Y-%m-%d %H:%M:%S",
108
135
  )
@@ -116,6 +143,13 @@ def enable_logging(level=logging.INFO):
116
143
 
117
144
 
118
145
  def disable_logging():
146
+ """
147
+ Disable all logging for the divi package.
148
+
149
+ Removes all handlers and sets the logging level to above CRITICAL,
150
+ effectively suppressing all log messages. This is useful when using
151
+ progress bars that provide visual feedback.
152
+ """
119
153
  root_logger = logging.getLogger(__name__.split(".")[0])
120
154
  root_logger.handlers.clear()
121
155
  root_logger.setLevel(logging.CRITICAL + 1)
@@ -29,12 +29,9 @@ class ProgressReporter(ABC):
29
29
  class QueueProgressReporter(ProgressReporter):
30
30
  """Reports progress by putting structured dictionaries onto a Queue."""
31
31
 
32
- def __init__(
33
- self, job_id: str, progress_queue: Queue, has_final_computation: bool = False
34
- ):
32
+ def __init__(self, job_id: str, progress_queue: Queue):
35
33
  self._job_id = job_id
36
34
  self._queue = progress_queue
37
- self.has_final_computation = has_final_computation
38
35
 
39
36
  def update(self, **kwargs):
40
37
  payload = {"job_id": self._job_id, "progress": 1}
@@ -43,20 +40,19 @@ class QueueProgressReporter(ProgressReporter):
43
40
  def info(self, message: str, **kwargs):
44
41
  payload = {"job_id": self._job_id, "progress": 0, "message": message}
45
42
 
46
- # Determine if this message indicates the job is truly finished.
47
- is_final_step = "Computed Final Solution" in message or (
48
- "Finished Optimization" in message and not self.has_final_computation
49
- )
50
-
51
- if is_final_step:
43
+ if "Finished successfully!" in message:
52
44
  payload["final_status"] = "Success"
53
- elif "poll_attempt" in kwargs:
45
+
46
+ if "poll_attempt" in kwargs:
54
47
  # For polling, remove the message key so the last message persists.
55
48
  del payload["message"]
56
49
  payload["poll_attempt"] = kwargs["poll_attempt"]
57
50
  payload["max_retries"] = kwargs["max_retries"]
58
51
  payload["service_job_id"] = kwargs["service_job_id"]
59
52
  payload["job_status"] = kwargs["job_status"]
53
+ else:
54
+ # For any other message, explicitly reset the polling attempt counter.
55
+ payload["poll_attempt"] = 0
60
56
 
61
57
  self._queue.put(payload)
62
58
 
@@ -82,9 +78,7 @@ class LoggingProgressReporter(ProgressReporter):
82
78
  return
83
79
 
84
80
  if "iteration" in kwargs:
85
- logger.info(
86
- f"Running Iteration #{kwargs['iteration'] + 1} circuits: {message}\r"
87
- )
81
+ logger.info(f"Iteration #{kwargs['iteration'] + 1}: {message}\r")
88
82
  return
89
83
 
90
84
  logger.info(message)
divi/utils.py CHANGED
@@ -13,8 +13,20 @@ import scipy.sparse as sps
13
13
  def _is_sanitized(
14
14
  qubo_matrix: np.ndarray | sps.spmatrix,
15
15
  ) -> np.ndarray | sps.spmatrix:
16
- # Sanitize the QUBO matrix to ensure it is either symmetric or upper triangular.
16
+ """
17
+ Check if a QUBO matrix is either symmetric or upper triangular.
18
+
19
+ This function validates that the input QUBO matrix is in a proper format
20
+ for conversion to an Ising Hamiltonian. The matrix should be either
21
+ symmetric (equal to its transpose) or upper triangular.
22
+
23
+ Args:
24
+ qubo_matrix (np.ndarray | sps.spmatrix): The QUBO matrix to validate.
25
+ Can be a dense NumPy array or a sparse SciPy matrix.
17
26
 
27
+ Returns:
28
+ bool: True if the matrix is symmetric or upper triangular, False otherwise.
29
+ """
18
30
  is_sparse = sps.issparse(qubo_matrix)
19
31
 
20
32
  return (
@@ -33,18 +45,37 @@ def _is_sanitized(
33
45
  def convert_qubo_matrix_to_pennylane_ising(
34
46
  qubo_matrix: np.ndarray | sps.spmatrix,
35
47
  ) -> tuple[qml.operation.Operator, float]:
36
- """Convert QUBO matrix to Ising Hamiltonian in Pennylane.
48
+ """
49
+ Convert a QUBO matrix to an Ising Hamiltonian in PennyLane format.
37
50
 
38
51
  The conversion follows the mapping from QUBO variables x_i ∈ {0,1} to
39
52
  Ising variables σ_i ∈ {-1,1} via the transformation x_i = (1 - σ_i)/2. This
40
53
  transforms a QUBO minimization problem into an equivalent Ising minimization
41
54
  problem.
42
55
 
56
+ The function handles both dense NumPy arrays and sparse SciPy matrices efficiently.
57
+ If the input matrix is neither symmetric nor upper triangular, it will be
58
+ symmetrized automatically with a warning.
59
+
43
60
  Args:
44
- qubo_matrix: The QUBO matrix Q where the objective is to minimize x^T Q x
61
+ qubo_matrix (np.ndarray | sps.spmatrix): The QUBO matrix Q where the
62
+ objective is to minimize x^T Q x. Can be a dense NumPy array or a
63
+ sparse SciPy matrix (any format). Should be square and either
64
+ symmetric or upper triangular.
45
65
 
46
66
  Returns:
47
- A tuple of (Ising Hamiltonian as a PennyLane operator, constant term)
67
+ tuple[qml.operation.Operator, float]: A tuple containing:
68
+ - Ising Hamiltonian as a PennyLane operator (sum of Pauli Z terms)
69
+ - Constant offset term to be added to energy calculations
70
+
71
+ Raises:
72
+ UserWarning: If the QUBO matrix is neither symmetric nor upper triangular.
73
+
74
+ Example:
75
+ >>> import numpy as np
76
+ >>> qubo = np.array([[1, 2], [0, 3]])
77
+ >>> hamiltonian, offset = convert_qubo_matrix_to_pennylane_ising(qubo)
78
+ >>> print(f"Offset: {offset}")
48
79
  """
49
80
 
50
81
  if not _is_sanitized(qubo_matrix):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: qoro-divi
3
- Version: 0.3.4
3
+ Version: 0.3.5
4
4
  Summary: A Python library to automate generating, parallelizing, and executing quantum programs.
5
5
  Author: Ahmed Darwish
6
6
  Author-email: ahmed@qoroquantum.de
@@ -17,6 +17,7 @@ Requires-Dist: networkx (>=3.5,<4.0)
17
17
  Requires-Dist: pennylane (>=0.42.3,<0.43.0)
18
18
  Requires-Dist: ply (>=3.11,<4.0)
19
19
  Requires-Dist: pymetis (>=2025.1.1,<2026.0.0)
20
+ Requires-Dist: pymoo (>=0.6.1.5,<0.7.0.0)
20
21
  Requires-Dist: python-dotenv (>=1.1.1,<2.0.0)
21
22
  Requires-Dist: qiskit (<2.0)
22
23
  Requires-Dist: qiskit-aer (>=0.17.1,<0.18.0)
@@ -1,12 +1,12 @@
1
1
  divi/__init__.py,sha256=SyBWflbDS6qGEtHg-AfzD1TRNgfXoW2H5qTYGJ-W3XQ,167
2
2
  divi/backends/__init__.py,sha256=1S3EJH5XXou2s7EnZowhfI4b3u3zLUG05x7etj4W-IM,264
3
- divi/backends/_circuit_runner.py,sha256=P-8lekQIGwbhHv4ewfMFtKYIjmQHu7nmscwAmxsx72U,594
4
- divi/backends/_parallel_simulator.py,sha256=jHt6C2-H65cYIMA0zc-gkSt69tNgaM98eXSRZqmI4UI,8979
5
- divi/backends/_qoro_service.py,sha256=_x5CSkmcP_LFiqRdDax5vBcEJ7XRjtY6ZOfyPuwPn6U,14057
3
+ divi/backends/_circuit_runner.py,sha256=RlVEPQtn_Oyb2jIhz3y4HwNb7d1bDpgKUx8ZliS2POk,1387
4
+ divi/backends/_parallel_simulator.py,sha256=PMu2fsdXw9y_OwJBa5xWrnlfjhb4m7DZ_x4N1yZvVbE,13195
5
+ divi/backends/_qoro_service.py,sha256=nL69tjPtXubA1-ElEyO77pv-2p32kH9tjOXGB-7GVj4,17795
6
6
  divi/backends/_qpu_system.py,sha256=teVeG18ukyzMFgbPSr4BLx4MJUHVK382RqZMOy2voFk,374
7
7
  divi/circuits/__init__.py,sha256=Wl4BF0_TwG1Ol4oaftCD5lpkgS9us9EW7F4hu6r_eXM,151
8
- divi/circuits/_core.py,sha256=TsCa7n1Gwd8thxn5JYF2rcKVnHFDXOD_8ZEwG749az4,4022
9
- divi/circuits/qasm.py,sha256=5z_o4mY_eK24AXToFSugf74gTT_3iQuJddBZ7m5mvFU,7396
8
+ divi/circuits/_core.py,sha256=fBXRspBDCXB0M1PgHwibMDGTdRR441jp73lwh1_NvkQ,8393
9
+ divi/circuits/qasm.py,sha256=iq2hLjx9KBqgG_wKb7CRfNSXTOHZttD4tgBBp-pUnQQ,8161
10
10
  divi/circuits/qem.py,sha256=o6rMPUcxLuCBitBb8-QcxveUiKZVsP3HMamxyVFLi6M,6805
11
11
  divi/extern/cirq/__init__.py,sha256=6NjP3TlQn_oNkg8VrKvEIoYQxB5Bx0mLLFOT3SXReTc,371
12
12
  divi/extern/cirq/_lexer.py,sha256=x5UArrnN_JEyiq7E02ikq0wdmqZ2vEQ3_FADL1LIhQI,3187
@@ -45,24 +45,25 @@ divi/extern/scipy/pyprima/common/redrho.py,sha256=J6rJILcOoCeo942LUAXxpUvKLarUGN
45
45
  divi/extern/scipy/pyprima/common/selectx.py,sha256=mXVS2L6AuTmbOhpp1KlXwOBR54ttnbjwagYfnXhezJY,14713
46
46
  divi/qprog/__init__.py,sha256=3X7MK7PjXI-rCZQ9OYq314w14npmasCNSBECq23DW7U,622
47
47
  divi/qprog/algorithms/__init__.py,sha256=KLGD3zRk3z4nJQDqBjejTGgJ5m0n02jyBVHLJihMMws,355
48
- divi/qprog/algorithms/_ansatze.py,sha256=ATep35g7CD_t7wrmW62g5a8_XbXkbwwjU8Y4Poux4qA,7933
49
- divi/qprog/algorithms/_qaoa.py,sha256=cGYE0xkO7sBfqVyO5HxJNWi9-Vu84eTjJEGcIfbwweg,15951
50
- divi/qprog/algorithms/_vqe.py,sha256=FE0lnX_WKgKJnARdMvzehlLgmXgfBwGapf-fGCiIqMI,6499
51
- divi/qprog/batch.py,sha256=F_s83FDqnbm7UAYeTizKQqNysE6bACTorwtv8hmcJm4,10036
52
- divi/qprog/optimizers.py,sha256=SYWknntCl_QI4icoVdFvunxY5rZ2S0GGBVvtIWypk30,6433
53
- divi/qprog/quantum_program.py,sha256=2q4SDZ9TwTu_HdqNr3EWRNXBLlFEGSSWdHoUyAljT_c,14978
48
+ divi/qprog/algorithms/_ansatze.py,sha256=CGW6bh6BQreAhcWbKgPX2MMTTTytHO51gizZh9tRFZ4,11199
49
+ divi/qprog/algorithms/_qaoa.py,sha256=5mbsY4enLRAemVuUaw5iGmVI4_YBKdI7ITkV5dAultg,16608
50
+ divi/qprog/algorithms/_vqe.py,sha256=iP0rKbnQys0mIGn7lcFDLVr9tdYVbfs6Wt6vUdsAuLY,8121
51
+ divi/qprog/batch.py,sha256=SO1jxySGAddqzoTYX-Zq_f6HWoEf67wJ70fA3UDWxRw,17011
52
+ divi/qprog/exceptions.py,sha256=2VvUf8qgNBw60Q4wyt_2nbE4JHHMmZiT2JaGmWChp2o,231
53
+ divi/qprog/optimizers.py,sha256=GWaO07PylyLtI-oYXgJmqYUzVzeXHVSqdVFCTiGeNTU,13402
54
+ divi/qprog/quantum_program.py,sha256=c8bEZvtcmQMlrILl5j9PkyvUUb_aO1M_Zwv30NfH1cU,26858
54
55
  divi/qprog/workflows/__init__.py,sha256=_GAFsZsgj9p61E1xUXasa1aspwcOWp4s8i6hA6mQ9eg,320
55
- divi/qprog/workflows/_graph_partitioning.py,sha256=Y_LpQy9djbeXplVmyfr2E2aWjmwkM0GY7xU2N8hJhYY,23675
56
- divi/qprog/workflows/_qubo_partitioning.py,sha256=3IFD_N2vjwaFuK155fg26rbrGyYqEjzEnkxlw2BqRF0,7473
57
- divi/qprog/workflows/_vqe_sweep.py,sha256=eoontmK1z0KTdkEW2TbfCs9UKI4ThlFYXAivpO9GWK4,17974
56
+ divi/qprog/workflows/_graph_partitioning.py,sha256=EpDsU0WG4dXKaCqox96LxxupI5lts4TeLgehTg8cUno,22702
57
+ divi/qprog/workflows/_qubo_partitioning.py,sha256=HDFOlQhDH_ax_CV0FtgcoUtCErnDE_Xfv0RVL6O8_WI,8243
58
+ divi/qprog/workflows/_vqe_sweep.py,sha256=V8CpLEXmOqiMM2MXveTOWKIHbdP5fzJJOVzZ0Nmvxzg,18808
58
59
  divi/reporting/__init__.py,sha256=gaBUZrhNxR53VHojZxfjvQRDl-eDHo901vLE8I95kIw,290
59
- divi/reporting/_pbar.py,sha256=I8AWI93mpcJXIXTIvsa3JghazO65Pmrq-bW2bJTf2Ik,2131
60
- divi/reporting/_qlogger.py,sha256=hZ6hELP5Z41P1KpJV9xZ0TuHeI0ztswpcZrJ4yHKdAg,3860
61
- divi/reporting/_reporter.py,sha256=AgB2Mno1sIXF-VhOi8i-LGuWG5FMG1HelMw5cMc84HM,2977
62
- divi/utils.py,sha256=txdkb2y_z99-ysxdmC3Rl3tw0hkJsvRltLybCXb89bA,3816
63
- qoro_divi-0.3.4.dist-info/LICENSE,sha256=NS4JlQrgNwg1bvB3kE5shE-P4cJgnntgl-kClbOpG_Q,10760
64
- qoro_divi-0.3.4.dist-info/LICENSES/.license-header,sha256=2jN_xtJscqP8LG-NaveY2KHUkfRCC543Y_XjOyKEfWY,105
65
- qoro_divi-0.3.4.dist-info/LICENSES/Apache-2.0.txt,sha256=yoILHpvVuguUBpk8UwMnzJbcHUUyst9iGNNuEwUtWVc,10270
66
- qoro_divi-0.3.4.dist-info/METADATA,sha256=Or34jlJGk7jDChjEGjpE__8zaX58jlxCF9-MjBHpK-w,2428
67
- qoro_divi-0.3.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
68
- qoro_divi-0.3.4.dist-info/RECORD,,
60
+ divi/reporting/_pbar.py,sha256=I5UcriPLMKdTf_wusFCbxVH4MlA1Etui2GcYxRPC9Is,3686
61
+ divi/reporting/_qlogger.py,sha256=moFF9k_KECdhEmbsUTZHFXwVh30CuRCcChil_LBQUXM,5000
62
+ divi/reporting/_reporter.py,sha256=sMOpDPeTSlFh-soX4BseQkW5XiqgIjcqNgZHPH1SccI,2746
63
+ divi/utils.py,sha256=Avc0Lg0AbkhXAh73Ye4NZOsqZ8U5ImHVF4_kz6hTJNA,5138
64
+ qoro_divi-0.3.5.dist-info/LICENSE,sha256=NS4JlQrgNwg1bvB3kE5shE-P4cJgnntgl-kClbOpG_Q,10760
65
+ qoro_divi-0.3.5.dist-info/LICENSES/.license-header,sha256=2jN_xtJscqP8LG-NaveY2KHUkfRCC543Y_XjOyKEfWY,105
66
+ qoro_divi-0.3.5.dist-info/LICENSES/Apache-2.0.txt,sha256=yoILHpvVuguUBpk8UwMnzJbcHUUyst9iGNNuEwUtWVc,10270
67
+ qoro_divi-0.3.5.dist-info/METADATA,sha256=2EpuPs1up06jPpmbgSalH_VRkzdGUMXToMsNyrOXdsw,2470
68
+ qoro_divi-0.3.5.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
69
+ qoro_divi-0.3.5.dist-info/RECORD,,