From 0cb5566fc2d5d3071b14f7fcbf227451b2314aa2 Mon Sep 17 00:00:00 2001 From: Marc Davis Date: Thu, 7 Aug 2025 18:13:51 -0400 Subject: [PATCH 1/6] made _handle_cancel more resiliant against changes to _tasks from other threads --- bqskit/runtime/worker.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/bqskit/runtime/worker.py b/bqskit/runtime/worker.py index 7eb925b0c..fefdf5491 100644 --- a/bqskit/runtime/worker.py +++ b/bqskit/runtime/worker.py @@ -371,15 +371,12 @@ def _handle_cancel(self, addr: RuntimeAddress) -> None: self._cancelled_task_ids.add(addr) # Remove all tasks that are children of `addr` from initialized tasks - for key, task in self._tasks.items(): + for key, task in list(self._tasks.items()): if task.is_descendant_of(addr): task.cancel() - for mailbox_id in self._tasks[key].owned_mailboxes: + for mailbox_id in task.owned_mailboxes: self._mailboxes.pop(mailbox_id) - self._tasks = { - a: t for a, t in self._tasks.items() - if not t.is_descendant_of(addr) - } + self._tasks.pop(key, None) # Remove all tasks that are children of `addr` from delayed tasks self._delayed_tasks = [ From 76c618b6a9158009f5f151daa366f9b5c5c08ed1 Mon Sep 17 00:00:00 2001 From: Mihir Putcha <141764341+mihir-putcha@users.noreply.github.com> Date: Fri, 8 Aug 2025 15:39:22 -0700 Subject: [PATCH 2/6] Fix multistart cost comparison for ResidualsFunction - Add check for ResidualsFunction in both multistart methods to ensure the correct cost function is being used - Ensures best parameters are selected based on actual cost values --- bqskit/ir/opt/instantiaters/minimization.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bqskit/ir/opt/instantiaters/minimization.py b/bqskit/ir/opt/instantiaters/minimization.py index be05ef52e..abf3d20f8 100644 --- a/bqskit/ir/opt/instantiaters/minimization.py +++ b/bqskit/ir/opt/instantiaters/minimization.py @@ -9,6 +9,8 @@ from bqskit.ir.gates.parameterized.unitary import VariableUnitaryGate from bqskit.ir.opt.cost.functions import HilbertSchmidtResidualsGenerator +from bqskit.ir.opt.cost.functions import HilbertSchmidtCostGenerator +from bqskit.ir.opt.cost.residual import ResidualsFunction from bqskit.ir.opt.cost.generator import CostFunctionGenerator from bqskit.ir.opt.instantiater import Instantiater from bqskit.ir.opt.minimizer import Minimizer @@ -107,6 +109,8 @@ def multi_start_instantiate_inplace( start_gen = RandomStartGenerator() starts = start_gen.gen_starting_points(num_starts, circuit, target) cost_fn = self.cost_fn_gen.gen_cost(circuit, target) + if isinstance(cost_fn, ResidualsFunction): + cost_fn = HilbertSchmidtCostGenerator().gen_cost(circuit, target) params_list = [self.instantiate(circuit, target, x0) for x0 in starts] params = sorted(params_list, key=lambda x: cost_fn(x))[0] circuit.set_params(params) @@ -127,6 +131,8 @@ async def multi_start_instantiate_async( start_gen = RandomStartGenerator() starts = start_gen.gen_starting_points(num_starts, circuit, target) cost_fn = self.cost_fn_gen.gen_cost(circuit, target) + if isinstance(cost_fn, ResidualsFunction): + cost_fn = HilbertSchmidtCostGenerator().gen_cost(circuit, target) params_list = await get_runtime().map( self.instantiate, [circuit] * num_starts, From 80111503318b18d8a788b445e5f5c16cebf52264 Mon Sep 17 00:00:00 2001 From: Mihir Putcha <141764341+mihir-putcha@users.noreply.github.com> Date: Fri, 8 Aug 2025 16:28:35 -0700 Subject: [PATCH 3/6] ran pre-commit --- bqskit/ir/opt/instantiaters/minimization.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bqskit/ir/opt/instantiaters/minimization.py b/bqskit/ir/opt/instantiaters/minimization.py index abf3d20f8..d4530c13a 100644 --- a/bqskit/ir/opt/instantiaters/minimization.py +++ b/bqskit/ir/opt/instantiaters/minimization.py @@ -8,10 +8,10 @@ import numpy.typing as npt from bqskit.ir.gates.parameterized.unitary import VariableUnitaryGate +from bqskit.ir.opt.cost.functions import HilbertSchmidtCostGenerator from bqskit.ir.opt.cost.functions import HilbertSchmidtResidualsGenerator -from bqskit.ir.opt.cost.functions import HilbertSchmidtCostGenerator -from bqskit.ir.opt.cost.residual import ResidualsFunction from bqskit.ir.opt.cost.generator import CostFunctionGenerator +from bqskit.ir.opt.cost.residual import ResidualsFunction from bqskit.ir.opt.instantiater import Instantiater from bqskit.ir.opt.minimizer import Minimizer from bqskit.ir.opt.minimizers.ceres import CeresMinimizer From 1fd2f8073ee3440aff2d27ceccf17e253d6a46db Mon Sep 17 00:00:00 2001 From: Ed Younis Date: Thu, 7 Aug 2025 08:57:45 -0400 Subject: [PATCH 4/6] Fixed data not being passed to compiler --- bqskit/compiler/compiler.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bqskit/compiler/compiler.py b/bqskit/compiler/compiler.py index e68d5a6d4..df3b44002 100644 --- a/bqskit/compiler/compiler.py +++ b/bqskit/compiler/compiler.py @@ -393,6 +393,7 @@ def compile( request_data, logging_level, max_logging_depth, + data, ) result = self.result(task_id) From eb63281977cac1c22d01b6888d5a53ebd5bf80b7 Mon Sep 17 00:00:00 2001 From: Marc Davis Date: Thu, 28 Aug 2025 12:46:30 -0400 Subject: [PATCH 5/6] tackled some more rare race conditions --- bqskit/runtime/worker.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/bqskit/runtime/worker.py b/bqskit/runtime/worker.py index fefdf5491..e6e255846 100644 --- a/bqskit/runtime/worker.py +++ b/bqskit/runtime/worker.py @@ -463,7 +463,13 @@ def _try_step_next_ready_task(self) -> None: except StopIteration as e: self._process_task_completion(task, e.value) - except Exception: + except Exception as e: + if type(e) is RuntimeError: + # In rare cases, a cancelled task will cause a RuntimeError in step or _process_await + for addr in self._cancelled_task_ids: + if task.is_descendant_of(addr): + return + assert self._active_task is not None # for type checker # Bubble up errors From 4dcfae9980b9af21418ffde271756b0b07aaa7d6 Mon Sep 17 00:00:00 2001 From: Marc Davis Date: Thu, 28 Aug 2025 13:33:11 -0400 Subject: [PATCH 6/6] deleted a comment to satsify the pre-commit --- bqskit/runtime/worker.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bqskit/runtime/worker.py b/bqskit/runtime/worker.py index e6e255846..15e22133c 100644 --- a/bqskit/runtime/worker.py +++ b/bqskit/runtime/worker.py @@ -465,7 +465,6 @@ def _try_step_next_ready_task(self) -> None: except Exception as e: if type(e) is RuntimeError: - # In rare cases, a cancelled task will cause a RuntimeError in step or _process_await for addr in self._cancelled_task_ids: if task.is_descendant_of(addr): return