def _decompose_(self, qubits): a, b = qubits yield common_gates.CNOT(a, b) yield common_gates.H(a) yield common_gates.CNOT(b, a) yield common_gates.S(a)**self._exponent yield common_gates.CNOT(b, a) yield common_gates.S(a)**-self._exponent yield common_gates.H(a) yield common_gates.CNOT(a, b)
def _decompose_outside_control( self, control: 'cirq.Qid', near_target: 'cirq.Qid', far_target: 'cirq.Qid' ) -> 'cirq.OP_TREE': """A decomposition assuming one of the targets is in the middle. control: ───T──────@────────@───@────────────@──────────────── │ │ │ │ near: ─X─T──────X─@─T^-1─X─@─X────@─X^0.5─X─@─X^0.5──────── │ │ │ │ │ far: ─@─Y^-0.5─T─X─T──────X─T^-1─X─T^-1────X─S─────X^-0.5─ """ a, b, c = control, near_target, far_target t = common_gates.T sweep_abc = [common_gates.CNOT(a, b), common_gates.CNOT(b, c)] yield common_gates.CNOT(c, b) yield pauli_gates.Y(c) ** -0.5 yield t(a), t(b), t(c) yield sweep_abc yield t(b) ** -1, t(c) yield sweep_abc yield t(c) ** -1 yield sweep_abc yield t(c) ** -1 yield pauli_gates.X(b) ** 0.5 yield sweep_abc yield common_gates.S(c) yield pauli_gates.X(b) ** 0.5 yield pauli_gates.X(c) ** -0.5
def test_valid_powers(self): gcirq = cirq.Circuit() qreg = [cirq.LineQubit(i) for i in range(5)] gcirq.append(g_ops.X(qreg[0])**-3.67) gcirq.append(g_ops.Y(qreg[0])**7.9) gcirq.append(g_ops.Z(qreg[0])**sqrt(5)) gcirq.append(g_ops.S(qreg[0])**-pi) gcirq.append(g_ops.T(qreg[0])**(sqrt(7) - pi)) gcirq.append(g_ops.SWAP(qreg[0], qreg[1])**-0.5) gcirq.append(g_ops.ISWAP(qreg[0], qreg[1])**16.0) result = cirq_to_qlm(gcirq) for i, op in enumerate(result.ops): name, params = extract_syntax(result.gateDic[op.gate], result.gateDic) if i == 0: self.assertEqual(params[0], -3.67 * pi) elif i == 1: self.assertEqual(params[0], 7.9 * pi) elif i == 2: self.assertEqual(params[0], sqrt(5) * pi) elif i == 3: self.assertEqual(params[0], -pi * pi / 2) elif i == 4: self.assertEqual(params[0], (sqrt(7) - pi) * pi / 4) else: continue
def _decompose_inside_control(self, target1: raw_types.QubitId, control: raw_types.QubitId, target2: raw_types.QubitId ) -> op_tree.OP_TREE: """A decomposition assuming the control separates the targets. target1: ─@─X───────T──────@────────@─────────X───@─────X^-0.5─ │ │ │ │ │ │ control: ─X─@─X─────@─T^-1─X─@─T────X─@─X^0.5─@─@─X─@────────── │ │ │ │ │ │ target2: ─────@─H─T─X─T──────X─T^-1───X─T^-1────X───X─H─S^-1─── """ a, b, c = target1, control, target2 yield common_gates.CNOT(a, b) yield common_gates.CNOT(b, a) yield common_gates.CNOT(c, b) yield common_gates.H(c) yield common_gates.T(c) yield common_gates.CNOT(b, c) yield common_gates.T(a) yield common_gates.T(b)**-1 yield common_gates.T(c) yield common_gates.CNOT(a, b) yield common_gates.CNOT(b, c) yield common_gates.T(b) yield common_gates.T(c)**-1 yield common_gates.CNOT(a, b) yield common_gates.CNOT(b, c) yield common_gates.X(b)**0.5 yield common_gates.T(c)**-1 yield common_gates.CNOT(b, a) yield common_gates.CNOT(b, c) yield common_gates.CNOT(a, b) yield common_gates.CNOT(b, c) yield common_gates.H(c) yield common_gates.S(c)**-1 yield common_gates.X(a)**-0.5
def _decompose_inside_control( self, target1: 'cirq.Qid', control: 'cirq.Qid', target2: 'cirq.Qid' ) -> 'cirq.OP_TREE': """A decomposition assuming the control separates the targets. target1: ─@─X───────T──────@────────@─────────X───@─────X^-0.5─ │ │ │ │ │ │ control: ─X─@─X─────@─T^-1─X─@─T────X─@─X^0.5─@─@─X─@────────── │ │ │ │ │ │ target2: ─────@─H─T─X─T──────X─T^-1───X─T^-1────X───X─H─S^-1─── """ a, b, c = target1, control, target2 yield common_gates.CNOT(a, b) yield common_gates.CNOT(b, a) yield common_gates.CNOT(c, b) yield common_gates.H(c) yield common_gates.T(c) yield common_gates.CNOT(b, c) yield common_gates.T(a) yield common_gates.T(b) ** -1 yield common_gates.T(c) yield common_gates.CNOT(a, b) yield common_gates.CNOT(b, c) yield common_gates.T(b) yield common_gates.T(c) ** -1 yield common_gates.CNOT(a, b) yield common_gates.CNOT(b, c) yield pauli_gates.X(b) ** 0.5 yield common_gates.T(c) ** -1 yield common_gates.CNOT(b, a) yield common_gates.CNOT(b, c) yield common_gates.CNOT(a, b) yield common_gates.CNOT(b, c) yield common_gates.H(c) yield common_gates.S(c) ** -1 yield pauli_gates.X(a) ** -0.5