3

I am working on Cirq and need to perform certain unitary operations on qubits. For that, I am using the MatrixGate() function in Cirq. Unlike Qiskit, I could not find any function like decompose or transpile to simplify the Unitary operation into basic U3 and CNOT gates.

For instance, if I want to act the following Unitary Operator,

Unitary Operator

To do this I use this code in Qiskit. Looking for something equivalent in Cirq.

qc=QuantumCircuit(2)
qc.unitary(U,[0,1])
qc=transpile(qc,basis_gates=['cx','u3'])
qc.draw(output='mpl')

Unitary Gate

After using Transpile function in Qiskit

Transpiled Unitary Gate

I even tried to work up the Cosine-Sine Decomposition Algorithm which Qiskit uses to decompose these Unitary Operations. As mentioned in the paper, Quantum Circuits for Isometries, but they do not trivially yield the required decomposition. Please help by either suggesting :

  1. Some code in Cirq to decompose circuits or
  2. A workaround to export Qiksit circuits to Cirq or
  3. A simpler algorithm to decompose Unitary Operations.
Adam Zalcman
  • 26,643
  • 4
  • 71
  • 92
  • Just wondering, why are you needing to go to cirq? – met927 May 16 '20 at 11:25
  • @met927 I am working on Tensor-flow Quantum which uses cirq backend to create a quantum circuit. TFQ does not accept MatrixGate() and hence I wanted to decompose it into simpler gates. – Vinit Singh May 17 '20 at 05:08

1 Answers1

4

An example of such a method is cirq.two_qubit_matrix_to_operations. It uses the kak decomposition (cartan decomposition) to determine how to translate a unitary matrix into a series of operations with minimal number of CZ gates.

import cirq

desired_matrix = cirq.testing.random_unitary(dim=4)

synthesized_operations = cirq.two_qubit_matrix_to_operations(
    cirq.LineQubit(0),
    cirq.LineQubit(1),
    desired_matrix,
    allow_partial_czs=False,
)
circuit = cirq.Circuit(synthesized_operations)

synthesized_matrix = cirq.unitary(circuit)

cirq.testing.assert_allclose_up_to_global_phase(
    desired_matrix,
    synthesized_matrix,
    atol=1e-4
)

print(desired_matrix.round(3))
print(circuit)

Prints (for example):

[[ 0.234-0.169j -0.81 +0.038j -0.327+0.138j -0.364-0.029j]
 [-0.503-0.407j  0.221-0.206j  0.063+0.144j -0.629-0.264j]
 [ 0.271+0.338j  0.337-0.128j -0.343+0.731j -0.165+0.052j]
 [ 0.504+0.236j  0.222+0.269j  0.244-0.371j -0.608-0.043j]]
0: ───PhX(-0.283)^0.631───@───PhX(0.673)^0.5────@───PhX(-0.375)^0.5───@───PhX(0.827)^0.147───Z^-0.269───
                          │                     │                     │
1: ───PhX(0.508)^0.338────@───PhX(0.65)^(5/6)───@───PhX(0.65)^0.995───@───PhX(0.302)^0.512───Z^-0.516───
Craig Gidney
  • 17,763
  • 5
  • 68
  • 136