Как реализовать управляемый прием в 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).