Как реализовать управляемый прием в Cirq/Tensorflow Quantum?

Я пытаюсь реализовать ворота с управляемым вращением в Cirq/Tensorflow Quantum.

В readthedocs.io на https://cirq.readthedocs.io/en/stable/gates.html говорится:

"Шлюз может быть преобразован в управляемую версию с помощью Gate.controlled(). Как правило, это возвращает экземпляр ControlledGate. Однако в некоторых особых случаях, когда управляемая версия шлюза также является известным шлюзом, это возвращает экземпляр этого элемента. Например, cirq.X.controlled() возвращает элемент cirq.CNOT. Операции имеют аналогичную функциональность Operation.controlled_by(), например, cirq.X(q0).controlled_by(q1)."

Я реализовал

cirq.rx(theta_0).on(q[0]).controlled_by(q[3])

Я получаю следующую ошибку:

~/.local/lib/python3.6/site-packages/cirq/google/serializable_gate_set.py in 
serialize_op(self, op, msg, arg_function_language)
    193                         return proto_msg
    194         raise ValueError('Cannot serialize op {!r} of type {}'.format(
--> 195             gate_op, gate_type))
    196 
    197     def deserialize_dict(self,

ValueError: Cannot serialize op cirq.ControlledOperation(controls=(cirq.GridQubit(0, 3),), sub_operation=cirq.rx(sympy.Symbol('theta_0')).on(cirq.GridQubit(0, 0)), control_values=((1,),)) of type <class 'cirq.ops.controlled_gate.ControlledGate'>

У меня есть кубиты и символы, инициализированные как:

q = cirq.GridQubit.rect(1, 4)
symbol_names = x_0, x_1, x_2, x_3, theta_0, theta_1, z_2, z_3

Я действительно повторно использую схемы с различными схемами.

Мой вопрос: как мне правильно реализовать управляемый Rx в Cirq / Tensorflow Quantum?

PS Не могу найти тег для Google Cirq

Продолжение: Как это обобщается на аналогичные ситуации контролируемого Ry и управляемого Rz?

Для Rz я нашел декомпозицию гейта на https://threeplusone.com/pubs/on_gates.pdf, включая H.on(q1), CNOT(q0, q1), H.on(q2), но это еще не CRz с произвольным углом. Могу ли я ввести угол перед буквой H?

Для Ry разложения пока не нашел, ни CRy.

1 ответ

Решение

У вас есть полностью правильная реализация управляемого поворота X в Cirq. Его можно использовать в симуляции и других вещах, напримерcirq.unitary без проблем.

TFQ поддерживает только подмножество шлюзов в Cirq. Напримерcirq.ControlledGate может иметь произвольное количество управляющих кубитов, что в некоторых случаях может затруднить разложение до примитивных вентилей, совместимых с аппаратными платформами NiSQ (вот почему cirq.decompose ничего не делает с ControlledOperations). TFQ поддерживает только эти шлюзы примитивного стиля, для получения полного списка поддерживаемых шлюзов вы можете:

tfq.util.get_supported_gates().keys()

В вашем случае можно придумать более простую реализацию этого гейта. Прежде всего отметим, чтоcirq.rx(some angle) равно cirq.X**(some angle / pi) компенсируется глобальной фазой:

>>> a = cirq.rx(0.3)
>>> b = cirq.X**(0.3 / np.pi)
>>> cirq.equal_up_to_global_phase(cirq.unitary(a), cirq.unitary(b))
True

Теперь перейдем к использованию X. Тогда следующая операция:

>>> qs = cirq.GridQubit.rect(1,2)
>>> a = (cirq.X**0.3)(qs[0]).controlled_by(qs[1])
>>> b = cirq.CNOT(qs[0], qs[1]) ** 0.3
>>> cirq.equal_up_to_global_phase(cirq.unitary(a), cirq.unitary(b))
True

поскольку cirq.CNOTнаходится в шлюзах, поддерживаемых TFQ, он должен быть сериализуемым без каких-либо проблем. Если вы хотите создать символическую версию ворот, вы можете просто заменить 0,3 наsympy.Symbol.

Ответ для продолжения: Если вы хотите выполнить CRz, вы можете сделать то же самое, что и выше, заменив ворота CNOT на ворота CZ. Для CRy это не так просто. Для этого я бы рекомендовал использовать некоторую комбинацию: cirq.Y(0) и cirq.YY(0, 1).

Другие вопросы по тегам