Skip to content

Commit 8be25c6

Browse files
anurudhpmpharrigan
andauthored
Raise DecomposeTypeError for symbolic register shapes (#1375)
* raise `DecomposeTypeError` for symbolic register shapes * add test --------- Co-authored-by: Matthew Harrigan <mpharrigan@google.com>
1 parent abd7ffb commit 8be25c6

3 files changed

Lines changed: 27 additions & 1 deletion

File tree

qualtran/_infra/composite_bloq.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -846,6 +846,8 @@ def add_register_from_dtype(
846846
initial, left-dangling soquets for the register. Otherwise, this is a RIGHT register
847847
and will be used for error checking in `finalize()` and nothing is returned.
848848
"""
849+
from qualtran.symbolics import is_symbolic
850+
849851
if not self.add_register_allowed:
850852
raise ValueError(
851853
"This BloqBuilder was constructed from pre-specified registers. "
@@ -864,6 +866,11 @@ def add_register_from_dtype(
864866
)
865867
reg = Register(name=reg, dtype=dtype)
866868

869+
if is_symbolic(*reg.shape_symbolic):
870+
raise DecomposeTypeError(
871+
f"cannot add register with symbolic shape {reg.shape_symbolic}"
872+
)
873+
867874
self._regs.append(reg)
868875
if reg.side & Side.LEFT:
869876
return _reg_to_soq(LeftDangle, reg, available=self._available)

qualtran/_infra/composite_bloq_test.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import networkx as nx
2121
import numpy as np
2222
import pytest
23+
import sympy
2324
from numpy.typing import NDArray
2425

2526
import qualtran.testing as qlt_testing
@@ -30,6 +31,7 @@
3031
BloqInstance,
3132
CompositeBloq,
3233
Connection,
34+
DecomposeTypeError,
3335
LeftDangle,
3436
Register,
3537
RightDangle,
@@ -45,6 +47,7 @@
4547
from qualtran.bloqs.for_testing.atom import TestAtom, TestTwoBitOp
4648
from qualtran.bloqs.for_testing.many_registers import TestMultiTypedRegister, TestQFxp
4749
from qualtran.bloqs.for_testing.with_decomposition import TestParallelCombo, TestSerialCombo
50+
from qualtran.symbolics import SymbolicInt
4851

4952

5053
def _manually_make_test_cbloq_cxns():
@@ -597,6 +600,22 @@ def test_add_and_partition():
597600
assert len(cbloq.bloq_instances) == 1
598601

599602

603+
@attrs.frozen
604+
class TestSymbolicRegisterShape(Bloq):
605+
n: 'SymbolicInt'
606+
607+
@property
608+
def signature(self) -> 'Signature':
609+
return Signature([Register('q', QBit(), shape=(self.n,))])
610+
611+
612+
def test_decompose_symbolic_register_shape_raises():
613+
n = sympy.Symbol("n")
614+
bloq = TestSymbolicRegisterShape(n)
615+
with pytest.raises(DecomposeTypeError):
616+
bloq.decompose_bloq()
617+
618+
600619
@pytest.mark.notebook
601620
def test_notebook():
602621
qlt_testing.execute_notebook('composite_bloq')

qualtran/cirq_interop/_cirq_to_bloq.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,7 @@ def decompose_from_registers(
585585
yields the cirq-style decomposition.
586586
"""
587587
if any(
588-
cirq.is_parameterized(reg.bitsize) or cirq.is_parameterized(reg.side)
588+
cirq.is_parameterized(reg.bitsize) or cirq.is_parameterized(reg.side) or reg.is_symbolic()
589589
for reg in bloq.signature
590590
):
591591
# pylint: disable=raise-missing-from

0 commit comments

Comments
 (0)