def cups(left, right): return rigid.cups( left, right, ar_factory=Tensor, cup_factory=lambda left, right: Tensor(left @ right, Dim(1), Tensor.id(left).array))
def cups(left, right): from discopy.quantum.gates import CX, H, sqrt, Bra, Match def cup_factory(left, right): if left == right == qubit: return CX >> H @ sqrt(2) @ Id(1) >> Bra(0, 0) if left == right == bit: return Match() >> Discard(bit) raise ValueError return rigid.cups( left, right, ar_factory=Circuit, cup_factory=cup_factory)
def cups(left, right): return rigid.cups( left, right, ar_factory=Diagram, cup_factory=lambda *_: Z(2, 0))
def cups(left, right): return rigid.cups(left, right, ar_factory=Diagram, cup_factory=lambda x, _: Spider(2, 0, x[0]))
def cups(left, right): return rigid.cups(left, right, ar_factory=Diagram, cup_factory=lambda x, _: Frobenius(2, 0, x[0]))
def cups(left, right): assert all(x.name == "qubit" for x in left @ right) cup = CX >> H @ sqrt(2) @ Id(1) >> Bra(0, 0) return rigid.cups( left, right, ar_factory=Circuit, cup_factory=lambda *_: cup)