From 4708ff950ec916bf911046238fa11809721a4f84 Mon Sep 17 00:00:00 2001 From: tachard Date: Fri, 12 Dec 2025 15:40:59 +0100 Subject: [PATCH 1/2] Fixed Identity ctrl_adder --- qualtran/bloqs/basic_gates/identity.py | 15 +++++++++++---- qualtran/bloqs/basic_gates/identity_test.py | 14 +++++++++++++- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/qualtran/bloqs/basic_gates/identity.py b/qualtran/bloqs/basic_gates/identity.py index 379717e0ec..b23865bea3 100644 --- a/qualtran/bloqs/basic_gates/identity.py +++ b/qualtran/bloqs/basic_gates/identity.py @@ -34,6 +34,7 @@ ) from qualtran.drawing import Text, TextBox, WireSymbol from qualtran.symbolics import is_symbolic, SymbolicInt +from qualtran.bloqs.bookkeeping import Partition if TYPE_CHECKING: import cirq @@ -116,11 +117,17 @@ def ctrl_adder( bb: 'BloqBuilder', ctrl_soqs: Sequence['SoquetT'], in_soqs: Dict[str, 'SoquetT'] ) -> Tuple[Iterable['SoquetT'], Iterable['SoquetT']]: parts = [ - (Register(f'ctrl_{i}', dtype=dtype, shape=shape), 'q') + Register(f"ctrl_{i}", dtype=dtype, shape=shape) for i, (dtype, shape) in enumerate(ctrl_spec.activation_function_dtypes()) - ] + [(reg, 'q') for reg in self.signature] - all_soqs = in_soqs | {f'ctrl_{i}': ctrl_soq for i, ctrl_soq in enumerate(ctrl_soqs)} - out_soqs = bb.add_and_partition(ctrl_I, partitions=parts, left_only=False, **all_soqs) + ] + [reg for reg in self.signature] + + all_soqs = in_soqs | {f"ctrl_{i}": ctrl_soq for i, ctrl_soq in enumerate(ctrl_soqs)} + + pratition = Partition(ctrl_I.signature.n_qubits(), regs=parts) + q = bb.add(pratition.adjoint(), **all_soqs) + q = bb.add(ctrl_I, q=q) + out_soqs = bb.add(pratition, x=q) + return out_soqs[:-1], out_soqs[-1:] return ctrl_I, ctrl_adder diff --git a/qualtran/bloqs/basic_gates/identity_test.py b/qualtran/bloqs/basic_gates/identity_test.py index 341670cc8a..712b1af22a 100644 --- a/qualtran/bloqs/basic_gates/identity_test.py +++ b/qualtran/bloqs/basic_gates/identity_test.py @@ -16,7 +16,7 @@ import pytest import sympy -from qualtran import BloqBuilder +from qualtran import BloqBuilder, CtrlSpec, Register, QBit from qualtran.bloqs.basic_gates import OneState from qualtran.bloqs.basic_gates.identity import _identity, _identity_n, _identity_symb, Identity from qualtran.simulation.classical_sim import ( @@ -106,6 +106,18 @@ def test_identity_controlled(): assert Identity(n).controlled() == Identity(n + 1) +def test_identity_ctrl_adder(): + + ctrl_I, ctrl_adder = Identity(1).get_ctrl_system(CtrlSpec()) + + bb = BloqBuilder() + ctrl_soqs = [bb.add_register(Register("ctrl_0", QBit()))] + in_soqs = {"q": bb.add_register(Register("q", QBit()))} + [ctrl_out], (out_reg,) = ctrl_adder(bb, ctrl_soqs=ctrl_soqs, in_soqs=in_soqs) + composite = bb.finalize(ctrl_0=ctrl_out, q=out_reg) + composite.flatten() + + @pytest.mark.notebook def test_notebook(): execute_notebook('identity') From 33bb2e9ec5831fe346eaa5d012e47948d540fb96 Mon Sep 17 00:00:00 2001 From: tachard Date: Thu, 8 Jan 2026 14:19:00 +0100 Subject: [PATCH 2/2] fix: format and type checking --- qualtran/bloqs/basic_gates/identity.py | 2 +- qualtran/bloqs/basic_gates/identity_test.py | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/qualtran/bloqs/basic_gates/identity.py b/qualtran/bloqs/basic_gates/identity.py index b23865bea3..a78c6c7d91 100644 --- a/qualtran/bloqs/basic_gates/identity.py +++ b/qualtran/bloqs/basic_gates/identity.py @@ -32,9 +32,9 @@ Signature, SoquetT, ) +from qualtran.bloqs.bookkeeping import Partition from qualtran.drawing import Text, TextBox, WireSymbol from qualtran.symbolics import is_symbolic, SymbolicInt -from qualtran.bloqs.bookkeeping import Partition if TYPE_CHECKING: import cirq diff --git a/qualtran/bloqs/basic_gates/identity_test.py b/qualtran/bloqs/basic_gates/identity_test.py index 712b1af22a..23e70493c4 100644 --- a/qualtran/bloqs/basic_gates/identity_test.py +++ b/qualtran/bloqs/basic_gates/identity_test.py @@ -16,7 +16,7 @@ import pytest import sympy -from qualtran import BloqBuilder, CtrlSpec, Register, QBit +from qualtran import BloqBuilder, CtrlSpec, QBit, Register from qualtran.bloqs.basic_gates import OneState from qualtran.bloqs.basic_gates.identity import _identity, _identity_n, _identity_symb, Identity from qualtran.simulation.classical_sim import ( @@ -111,9 +111,10 @@ def test_identity_ctrl_adder(): ctrl_I, ctrl_adder = Identity(1).get_ctrl_system(CtrlSpec()) bb = BloqBuilder() - ctrl_soqs = [bb.add_register(Register("ctrl_0", QBit()))] - in_soqs = {"q": bb.add_register(Register("q", QBit()))} - [ctrl_out], (out_reg,) = ctrl_adder(bb, ctrl_soqs=ctrl_soqs, in_soqs=in_soqs) + ctrl0 = bb.add_register(Register("ctrl_0", QBit())) + q = bb.add_register(Register("q", QBit())) + assert ctrl0 is not None and q is not None + [ctrl_out], (out_reg,) = ctrl_adder(bb, ctrl_soqs=[ctrl0], in_soqs={"q": q}) composite = bb.finalize(ctrl_0=ctrl_out, q=out_reg) composite.flatten()