Esempio n. 1
0
def your_circuit(oracle):
    # Phase kickback
    yield cirq.X(q2), cirq.H(q2)

    # Superposition over input bits
    yield cirq.H(q0), cirq.H(q1)

    # Query the function
    yield oracle

    # Interference to get result,
    # put last qubit in to |1> state
    yield cirq.H(q0), cirq.H(q1), cirq.H(q2)

    # A final OR gate to put the result
    # in to the final qubit
    yield cirq.X(q0), cirq.X(q1), cirq.CCX(q0, q1, q2)

    # Perform measurement
    yield cirq.measure(q2)
Esempio n. 2
0
def test_assert_same_circuits():
    a, b = cirq.LineQubit.range(2)

    cirq.testing.assert_same_circuits(cirq.Circuit(cirq.H(a)),
                                      cirq.Circuit(cirq.H(a)))

    with pytest.raises(AssertionError) as exc_info:
        cirq.testing.assert_same_circuits(cirq.Circuit(cirq.H(a)),
                                          cirq.Circuit())
    assert 'differing moment:\n0\n' in exc_info.value.args[0]

    with pytest.raises(AssertionError) as exc_info:
        cirq.testing.assert_same_circuits(
            cirq.Circuit(cirq.H(a), cirq.H(a)),
            cirq.Circuit(cirq.H(a), cirq.CZ(a, b)))
    assert 'differing moment:\n1\n' in exc_info.value.args[0]

    with pytest.raises(AssertionError):
        cirq.testing.assert_same_circuits(
            cirq.Circuit(cirq.CNOT(a, b)),
            cirq.Circuit(cirq.ControlledGate(cirq.X).on(a, b)))
Esempio n. 3
0
 def test_basic_inputs(self):
     """Test that State layer outputs work end to end."""
     simple_circuit = cirq.Circuit(cirq.H(cirq.GridQubit(0, 0)))
     cirq_u = cirq.unitary(simple_circuit)
     tfq_u = unitary.Unitary()(simple_circuit)
     self.assertAllClose(tfq_u, [cirq_u])
Esempio n. 4
0
    def correct(self, qubits: List[cirq.Qid],
                ancillas: List[cirq.Qid]) -> cirq.Circuit:
        """Corrects the code word.

        Creates a correction circuit by computing the syndrome on the ancillas, and then using this
        syndrome to correct the qubits.

        Args:
            qubits: a vector of self.n qubits that contains (potentially corrupted) code words
            ancillas: a vector of self.n - self.k qubits that are set to zero and will contain the
                syndrome once the circuit is applied.

        Returns:
            The circuit that both computes the syndrome and uses this syndrome to correct errors.
        """
        circuit = cirq.Circuit()

        gate_dict = {'X': cirq.X, 'Y': cirq.Y, 'Z': cirq.Z}

        # We set the ancillas so that measuring them directly would be the same
        # as measuring the qubits with Pauli strings. In other words, we store
        # the syndrome inside the ancillas.
        for r in range(self.n - self.k):
            for n in range(self.n):
                if self.M[r][n] == 'Z':
                    circuit.append(
                        cirq.ControlledOperation([qubits[n]],
                                                 cirq.X(ancillas[r])))
                elif self.M[r][n] == 'X':
                    circuit.append(cirq.H(qubits[n]))
                    circuit.append(
                        cirq.ControlledOperation([qubits[n]],
                                                 cirq.X(ancillas[r])))
                    circuit.append(cirq.H(qubits[n]))
                elif self.M[r][n] == 'Y':
                    circuit.append(cirq.S(qubits[n])**-1)
                    circuit.append(cirq.H(qubits[n]))
                    circuit.append(
                        cirq.ControlledOperation([qubits[n]],
                                                 cirq.X(ancillas[r])))
                    circuit.append(cirq.H(qubits[n]))
                    circuit.append(cirq.S(qubits[n]))

        # At this stage, the ancillas are equal to the syndrome. Now, we apply
        # the errors back to correct the code.

        for syndrome, correction in self.syndromes_to_corrections.items():
            op = gate_dict[correction[0]]
            n = correction[1]

            # We do a Boolean operation on the ancillas (i.e. syndrome).
            for r in range(self.n - self.k):
                if syndrome[r] == 1:
                    circuit.append(cirq.X(ancillas[r]))

            circuit.append(cirq.ControlledOperation(ancillas, op(qubits[n])))

            for r in range(self.n - self.k):
                if syndrome[r] == 1:
                    circuit.append(cirq.X(ancillas[r]))

        return circuit
Esempio n. 5
0
def get_circuit():
    """Gets circuit."""
    q = cirq.LineQubit.range(12)

    circuit = cirq.Circuit.from_ops(*[
        [cirq.X(q[0])**0.5,
         cirq.H(q[0])**0.5,
         cirq.X(q[0])**-0.5],
        [cirq.X(q[1])**0.5,
         cirq.H(q[1])**0.5,
         cirq.X(q[1])**-0.5],
        [cirq.X(q[2])**0.5,
         cirq.H(q[2])**0.5,
         cirq.X(q[2])**-0.5],
        cirq.Y(q[3])**0.5,
        [cirq.X(q[4])**0.5,
         cirq.H(q[4])**0.5,
         cirq.X(q[4])**-0.5],
        cirq.Y(q[5])**0.5,
        cirq.X(q[6])**0.5,
        cirq.X(q[7])**0.5,
        cirq.X(q[8])**0.5,
        cirq.X(q[9])**0.5,
        cirq.Y(q[10])**0.5,
        [cirq.X(q[11])**0.5,
         cirq.H(q[11])**0.5,
         cirq.X(q[11])**-0.5],
        cirq.Rz(rads=0.2767373377033284 * np.pi).on(q[1]),
        cirq.Rz(rads=-0.18492941569567625 * np.pi).on(q[2]),
        cirq.Rz(rads=-1.00125113388313 * np.pi).on(q[5]),
        cirq.Rz(rads=1.1224546746752684 * np.pi).on(q[6]),
        cirq.Rz(rads=-0.33113463396189063 * np.pi).on(q[9]),
        cirq.Rz(rads=0.40440704518468423 * np.pi).on(q[10]),
        [
            cirq.ISWAP(q[1], q[2])**-1.009868884178167,
            cirq.CZ(q[1], q[2])**-0.16552586798219657,
        ],
        [
            cirq.ISWAP(q[5], q[6])**-0.9733750299685556,
            cirq.CZ(q[5], q[6])**-0.16091330726740966,
        ],
        [
            cirq.ISWAP(q[9], q[10])**-0.9769678680475263,
            cirq.CZ(q[9], q[10])**-0.16332605888196952,
        ],
        cirq.Rz(rads=-0.6722145774944012 * np.pi).on(q[1]),
        cirq.Rz(rads=0.7640224995020534 * np.pi).on(q[2]),
        cirq.Rz(rads=0.7990757781248072 * np.pi).on(q[5]),
        cirq.Rz(rads=-0.6778722373326689 * np.pi).on(q[6]),
        cirq.Rz(rads=0.049341949396894985 * np.pi).on(q[9]),
        cirq.Rz(rads=0.02393046182589869 * np.pi).on(q[10]),
        cirq.Y(q[0])**0.5,
        cirq.X(q[1])**0.5,
        cirq.Y(q[2])**0.5,
        [cirq.X(q[3])**0.5,
         cirq.H(q[3])**0.5,
         cirq.X(q[3])**-0.5],
        cirq.Y(q[4])**0.5,
        [cirq.X(q[5])**0.5,
         cirq.H(q[5])**0.5,
         cirq.X(q[5])**-0.5],
        cirq.Y(q[6])**0.5,
        cirq.Y(q[7])**0.5,
        cirq.Y(q[8])**0.5,
        [cirq.X(q[9])**0.5,
         cirq.H(q[9])**0.5,
         cirq.X(q[9])**-0.5],
        [cirq.X(q[10])**0.5,
         cirq.H(q[10])**0.5,
         cirq.X(q[10])**-0.5],
        cirq.Y(q[11])**0.5,
        cirq.Rz(rads=2.5333591271878086 * np.pi).on(q[0]),
        cirq.Rz(rads=-2.4748096263683066 * np.pi).on(q[1]),
        cirq.Rz(rads=-4.480708067260001 * np.pi).on(q[2]),
        cirq.Rz(rads=4.525888267898699 * np.pi).on(q[3]),
        cirq.Rz(rads=2.135954522972214 * np.pi).on(q[4]),
        cirq.Rz(rads=-2.1822665205802965 * np.pi).on(q[5]),
        cirq.Rz(rads=-3.7780476633662574 * np.pi).on(q[6]),
        cirq.Rz(rads=3.817335880513747 * np.pi).on(q[7]),
        cirq.Rz(rads=0.7811374803446167 * np.pi).on(q[8]),
        cirq.Rz(rads=-0.6780279413275597 * np.pi).on(q[9]),
        cirq.Rz(rads=1.863573798571082 * np.pi).on(q[10]),
        cirq.Rz(rads=-2.150412392135508 * np.pi).on(q[11]),
        [
            cirq.ISWAP(q[0], q[1])**-0.8242343706275942,
            cirq.CZ(q[0], q[1])**-0.15468164635790926,
        ],
        [
            cirq.ISWAP(q[2], q[3])**-0.981653050634976,
            cirq.CZ(q[2], q[3])**-0.1933349989832593,
        ],
        [
            cirq.ISWAP(q[4], q[5])**-0.9637565510028211,
            cirq.CZ(q[4], q[5])**-0.15186761578643612,
        ],
        [
            cirq.ISWAP(q[6], q[7])**-1.0089894642925605,
            cirq.CZ(q[6], q[7])**-0.17298943435986638,
        ],
        [
            cirq.ISWAP(q[8], q[9])**-0.980271915828302,
            cirq.CZ(q[8], q[9])**-0.16470994863165317,
        ],
        [
            cirq.ISWAP(q[10], q[11])**-0.9290392306402181,
            cirq.CZ(q[10], q[11])**-0.1664963204791881,
        ],
        cirq.Rz(rads=-2.346072351850546 * np.pi).on(q[0]),
        cirq.Rz(rads=2.404621852670048 * np.pi).on(q[1]),
        cirq.Rz(rads=5.048199817882042 * np.pi).on(q[2]),
        cirq.Rz(rads=-5.0030196172433445 * np.pi).on(q[3]),
        cirq.Rz(rads=-2.6543362735839113 * np.pi).on(q[4]),
        cirq.Rz(rads=2.6080242759758283 * np.pi).on(q[5]),
        cirq.Rz(rads=3.9045088495271663 * np.pi).on(q[6]),
        cirq.Rz(rads=-3.8652206323796765 * np.pi).on(q[7]),
        cirq.Rz(rads=-1.5516585295358842 * np.pi).on(q[8]),
        cirq.Rz(rads=1.6547680685529413 * np.pi).on(q[9]),
        cirq.Rz(rads=-1.8933072151541963 * np.pi).on(q[10]),
        cirq.Rz(rads=1.6064686215897703 * np.pi).on(q[11]),
        cirq.X(q[0])**0.5,
        cirq.Y(q[1])**0.5,
        cirq.X(q[2])**0.5,
        cirq.Y(q[3])**0.5,
        cirq.X(q[4])**0.5,
        cirq.X(q[5])**0.5,
        cirq.X(q[6])**0.5,
        [cirq.X(q[7])**0.5,
         cirq.H(q[7])**0.5,
         cirq.X(q[7])**-0.5],
        cirq.X(q[8])**0.5,
        cirq.X(q[9])**0.5,
        cirq.X(q[10])**0.5,
        cirq.X(q[11])**0.5,
        cirq.Rz(rads=-3.2786928385561493 * np.pi).on(q[4]),
        cirq.Rz(rads=3.339006443218924 * np.pi).on(q[8]),
        cirq.Rz(rads=-5.390755870544794 * np.pi).on(q[5]),
        cirq.Rz(rads=5.4172568990486605 * np.pi).on(q[9]),
        cirq.Rz(rads=-5.620144773112766 * np.pi).on(q[6]),
        cirq.Rz(rads=5.630469153514815 * np.pi).on(q[10]),
        cirq.Rz(rads=4.367652291347506 * np.pi).on(q[7]),
        cirq.Rz(rads=-3.9105776028384707 * np.pi).on(q[11]),
        [
            cirq.ISWAP(q[4], q[8])**-1.0121115249769066,
            cirq.CZ(q[4], q[8])**-0.16059979031178617,
        ],
        [
            cirq.ISWAP(q[5], q[9])**-0.985003985982119,
            cirq.CZ(q[5], q[9])**-0.16606010863938203,
        ],
        [
            cirq.ISWAP(q[6], q[10])**-0.9628319095031052,
            cirq.CZ(q[6], q[10])**-0.16339300450568622,
        ],
        [
            cirq.ISWAP(q[7], q[11])**-0.9999941453695372,
            cirq.CZ(q[7], q[11])**-0.16477879415124544,
        ],
        cirq.Rz(rads=2.9425087256630427 * np.pi).on(q[4]),
        cirq.Rz(rads=-2.882195121000268 * np.pi).on(q[8]),
        cirq.Rz(rads=4.466531408750767 * np.pi).on(q[5]),
        cirq.Rz(rads=-4.440030380246901 * np.pi).on(q[9]),
        cirq.Rz(rads=4.486471496440378 * np.pi).on(q[6]),
        cirq.Rz(rads=-4.476147116038329 * np.pi).on(q[10]),
        cirq.Rz(rads=-4.89701654221443 * np.pi).on(q[7]),
        cirq.Rz(rads=5.354091230723465 * np.pi).on(q[11]),
        [cirq.X(q[0])**0.5,
         cirq.H(q[0])**0.5,
         cirq.X(q[0])**-0.5],
        [cirq.X(q[1])**0.5,
         cirq.H(q[1])**0.5,
         cirq.X(q[1])**-0.5],
        [cirq.X(q[2])**0.5,
         cirq.H(q[2])**0.5,
         cirq.X(q[2])**-0.5],
        [cirq.X(q[3])**0.5,
         cirq.H(q[3])**0.5,
         cirq.X(q[3])**-0.5],
        [cirq.X(q[4])**0.5,
         cirq.H(q[4])**0.5,
         cirq.X(q[4])**-0.5],
        [cirq.X(q[5])**0.5,
         cirq.H(q[5])**0.5,
         cirq.X(q[5])**-0.5],
        cirq.Y(q[6])**0.5,
        cirq.Y(q[7])**0.5,
        [cirq.X(q[8])**0.5,
         cirq.H(q[8])**0.5,
         cirq.X(q[8])**-0.5],
        [cirq.X(q[9])**0.5,
         cirq.H(q[9])**0.5,
         cirq.X(q[9])**-0.5],
        cirq.Y(q[10])**0.5,
        [cirq.X(q[11])**0.5,
         cirq.H(q[11])**0.5,
         cirq.X(q[11])**-0.5],
        cirq.Rz(rads=12.703597923836748 * np.pi).on(q[0]),
        cirq.Rz(rads=-12.7869629079138 * np.pi).on(q[4]),
        cirq.Rz(rads=12.184253063938954 * np.pi).on(q[1]),
        cirq.Rz(rads=-12.108584830758572 * np.pi).on(q[5]),
        cirq.Rz(rads=3.782562501914174 * np.pi).on(q[2]),
        cirq.Rz(rads=-3.873596611893716 * np.pi).on(q[6]),
        cirq.Rz(rads=4.772639843256901 * np.pi).on(q[3]),
        cirq.Rz(rads=-4.771314675186062 * np.pi).on(q[7]),
        [
            cirq.ISWAP(q[0], q[4])**-0.933831313649303,
            cirq.CZ(q[0], q[4])**-0.1583933739924931,
        ],
        [
            cirq.ISWAP(q[1], q[5])**-0.9390847780661252,
            cirq.CZ(q[1], q[5])**-0.17144555428591543,
        ],
        [
            cirq.ISWAP(q[2], q[6])**-1.0209160715892363,
            cirq.CZ(q[2], q[6])**-0.14849009270439747,
        ],
        [
            cirq.ISWAP(q[3], q[7])**-1.0287988330229174,
            cirq.CZ(q[3], q[7])**-0.1385888562342036,
        ],
        cirq.Rz(rads=-12.477250219528523 * np.pi).on(q[0]),
        cirq.Rz(rads=12.39388523545147 * np.pi).on(q[4]),
        cirq.Rz(rads=-11.31088974563283 * np.pi).on(q[1]),
        cirq.Rz(rads=11.386557978813212 * np.pi).on(q[5]),
        cirq.Rz(rads=-5.4898636407973544 * np.pi).on(q[2]),
        cirq.Rz(rads=5.398829530817813 * np.pi).on(q[6]),
        cirq.Rz(rads=-5.863871460773714 * np.pi).on(q[3]),
        cirq.Rz(rads=5.8651966288445525 * np.pi).on(q[7]),
        cirq.X(q[0])**0.5,
        cirq.X(q[1])**0.5,
        cirq.Y(q[2])**0.5,
        cirq.X(q[3])**0.5,
        cirq.X(q[4])**0.5,
        cirq.X(q[5])**0.5,
        [cirq.X(q[6])**0.5,
         cirq.H(q[6])**0.5,
         cirq.X(q[6])**-0.5],
        [cirq.X(q[7])**0.5,
         cirq.H(q[7])**0.5,
         cirq.X(q[7])**-0.5],
        cirq.Y(q[8])**0.5,
        cirq.X(q[9])**0.5,
        cirq.X(q[10])**0.5,
        cirq.Y(q[11])**0.5,
        cirq.Rz(rads=5.16073733770325 * np.pi).on(q[1]),
        cirq.Rz(rads=-5.068929415695599 * np.pi).on(q[2]),
        cirq.Rz(rads=-4.701251133883051 * np.pi).on(q[5]),
        cirq.Rz(rads=4.82245467467519 * np.pi).on(q[6]),
        cirq.Rz(rads=-3.587134633961795 * np.pi).on(q[9]),
        cirq.Rz(rads=3.6604070451845887 * np.pi).on(q[10]),
        [
            cirq.ISWAP(q[1], q[2])**-1.009868884178167,
            cirq.CZ(q[1], q[2])**-0.16552586798219657,
        ],
        [
            cirq.ISWAP(q[5], q[6])**-0.9733750299685556,
            cirq.CZ(q[5], q[6])**-0.16091330726740966,
        ],
        [
            cirq.ISWAP(q[9], q[10])**-0.9769678680475263,
            cirq.CZ(q[9], q[10])**-0.16332605888196952,
        ],
        cirq.Rz(rads=-5.556214577494324 * np.pi).on(q[1]),
        cirq.Rz(rads=5.648022499501975 * np.pi).on(q[2]),
        cirq.Rz(rads=4.499075778124728 * np.pi).on(q[5]),
        cirq.Rz(rads=-4.37787223733259 * np.pi).on(q[6]),
        cirq.Rz(rads=3.305341949396799 * np.pi).on(q[9]),
        cirq.Rz(rads=-3.232069538174005 * np.pi).on(q[10]),
        [cirq.X(q[0])**0.5,
         cirq.H(q[0])**0.5,
         cirq.X(q[0])**-0.5],
        [cirq.X(q[1])**0.5,
         cirq.H(q[1])**0.5,
         cirq.X(q[1])**-0.5],
        cirq.X(q[2])**0.5,
        cirq.Y(q[3])**0.5,
        cirq.Y(q[4])**0.5,
        cirq.Y(q[5])**0.5,
        cirq.Y(q[6])**0.5,
        cirq.X(q[7])**0.5,
        [cirq.X(q[8])**0.5,
         cirq.H(q[8])**0.5,
         cirq.X(q[8])**-0.5],
        cirq.Y(q[9])**0.5,
        cirq.Y(q[10])**0.5,
        [cirq.X(q[11])**0.5,
         cirq.H(q[11])**0.5,
         cirq.X(q[11])**-0.5],
        cirq.Rz(rads=7.565359127187911 * np.pi).on(q[0]),
        cirq.Rz(rads=-7.506809626368408 * np.pi).on(q[1]),
        cirq.Rz(rads=-15.28470806725993 * np.pi).on(q[2]),
        cirq.Rz(rads=15.329888267898626 * np.pi).on(q[3]),
        cirq.Rz(rads=7.019954522972137 * np.pi).on(q[4]),
        cirq.Rz(rads=-7.066266520580219 * np.pi).on(q[5]),
        cirq.Rz(rads=-13.842047663366333 * np.pi).on(q[6]),
        cirq.Rz(rads=13.881335880513822 * np.pi).on(q[7]),
        cirq.Rz(rads=3.001137480344569 * np.pi).on(q[8]),
        cirq.Rz(rads=-2.8980279413275123 * np.pi).on(q[9]),
        cirq.Rz(rads=5.563573798571002 * np.pi).on(q[10]),
        cirq.Rz(rads=-5.8504123921354285 * np.pi).on(q[11]),
        [
            cirq.ISWAP(q[0], q[1])**-0.8242343706275942,
            cirq.CZ(q[0], q[1])**-0.15468164635790926,
        ],
        [
            cirq.ISWAP(q[2], q[3])**-0.981653050634976,
            cirq.CZ(q[2], q[3])**-0.1933349989832593,
        ],
        [
            cirq.ISWAP(q[4], q[5])**-0.9637565510028211,
            cirq.CZ(q[4], q[5])**-0.15186761578643612,
        ],
        [
            cirq.ISWAP(q[6], q[7])**-1.0089894642925605,
            cirq.CZ(q[6], q[7])**-0.17298943435986638,
        ],
        [
            cirq.ISWAP(q[8], q[9])**-0.980271915828302,
            cirq.CZ(q[8], q[9])**-0.16470994863165317,
        ],
        [
            cirq.ISWAP(q[10], q[11])**-0.9290392306402181,
            cirq.CZ(q[10], q[11])**-0.1664963204791881,
        ],
        cirq.Rz(rads=-7.378072351850649 * np.pi).on(q[0]),
        cirq.Rz(rads=7.436621852670151 * np.pi).on(q[1]),
        cirq.Rz(rads=15.852199817881967 * np.pi).on(q[2]),
        cirq.Rz(rads=-15.80701961724327 * np.pi).on(q[3]),
        cirq.Rz(rads=-7.538336273583833 * np.pi).on(q[4]),
        cirq.Rz(rads=7.492024275975751 * np.pi).on(q[5]),
        cirq.Rz(rads=13.968508849527241 * np.pi).on(q[6]),
        cirq.Rz(rads=-13.929220632379753 * np.pi).on(q[7]),
        cirq.Rz(rads=-3.771658529535837 * np.pi).on(q[8]),
        cirq.Rz(rads=3.874768068552894 * np.pi).on(q[9]),
        cirq.Rz(rads=-5.593307215154117 * np.pi).on(q[10]),
        cirq.Rz(rads=5.30646862158969 * np.pi).on(q[11]),
        cirq.X(q[0])**0.5,
        cirq.X(q[1])**0.5,
        [cirq.X(q[2])**0.5,
         cirq.H(q[2])**0.5,
         cirq.X(q[2])**-0.5],
        cirq.X(q[3])**0.5,
        cirq.X(q[4])**0.5,
        [cirq.X(q[5])**0.5,
         cirq.H(q[5])**0.5,
         cirq.X(q[5])**-0.5],
        cirq.X(q[6])**0.5,
        cirq.Y(q[7])**0.5,
        cirq.X(q[8])**0.5,
        cirq.X(q[9])**0.5,
        [cirq.X(q[10])**0.5,
         cirq.H(q[10])**0.5,
         cirq.X(q[10])**-0.5],
        cirq.X(q[11])**0.5,
        cirq.Rz(rads=-8.162692838556204 * np.pi).on(q[4]),
        cirq.Rz(rads=8.223006443218978 * np.pi).on(q[8]),
        cirq.Rz(rads=-12.938755870544817 * np.pi).on(q[5]),
        cirq.Rz(rads=12.965256899048683 * np.pi).on(q[9]),
        cirq.Rz(rads=-12.724144773112773 * np.pi).on(q[6]),
        cirq.Rz(rads=12.73446915351482 * np.pi).on(q[10]),
        cirq.Rz(rads=11.027652291347495 * np.pi).on(q[7]),
        cirq.Rz(rads=-10.570577602838458 * np.pi).on(q[11]),
        [
            cirq.ISWAP(q[4], q[8])**-1.0121115249769066,
            cirq.CZ(q[4], q[8])**-0.16059979031178617,
        ],
        [
            cirq.ISWAP(q[5], q[9])**-0.985003985982119,
            cirq.CZ(q[5], q[9])**-0.16606010863938203,
        ],
        [
            cirq.ISWAP(q[6], q[10])**-0.9628319095031052,
            cirq.CZ(q[6], q[10])**-0.16339300450568622,
        ],
        [
            cirq.ISWAP(q[7], q[11])**-0.9999941453695372,
            cirq.CZ(q[7], q[11])**-0.16477879415124544,
        ],
        cirq.Rz(rads=7.826508725663096 * np.pi).on(q[4]),
        cirq.Rz(rads=-7.7661951210003215 * np.pi).on(q[8]),
        cirq.Rz(rads=12.014531408750791 * np.pi).on(q[5]),
        cirq.Rz(rads=-11.988030380246926 * np.pi).on(q[9]),
        cirq.Rz(rads=11.590471496440383 * np.pi).on(q[6]),
        cirq.Rz(rads=-11.580147116038336 * np.pi).on(q[10]),
        cirq.Rz(rads=-11.55701654221442 * np.pi).on(q[7]),
        cirq.Rz(rads=12.014091230723457 * np.pi).on(q[11]),
        [cirq.X(q[0])**0.5,
         cirq.H(q[0])**0.5,
         cirq.X(q[0])**-0.5],
        [cirq.X(q[1])**0.5,
         cirq.H(q[1])**0.5,
         cirq.X(q[1])**-0.5],
        cirq.Y(q[2])**0.5,
        [cirq.X(q[3])**0.5,
         cirq.H(q[3])**0.5,
         cirq.X(q[3])**-0.5],
        [cirq.X(q[4])**0.5,
         cirq.H(q[4])**0.5,
         cirq.X(q[4])**-0.5],
        cirq.X(q[5])**0.5,
        cirq.Y(q[6])**0.5,
        cirq.X(q[7])**0.5,
        cirq.Y(q[8])**0.5,
        [cirq.X(q[9])**0.5,
         cirq.H(q[9])**0.5,
         cirq.X(q[9])**-0.5],
        cirq.X(q[10])**0.5,
        [cirq.X(q[11])**0.5,
         cirq.H(q[11])**0.5,
         cirq.X(q[11])**-0.5],
        cirq.Rz(rads=26.023597923836856 * np.pi).on(q[0]),
        cirq.Rz(rads=-26.106962907913907 * np.pi).on(q[4]),
        cirq.Rz(rads=25.356253063938887 * np.pi).on(q[1]),
        cirq.Rz(rads=-25.2805848307585 * np.pi).on(q[5]),
        cirq.Rz(rads=8.370562501914259 * np.pi).on(q[2]),
        cirq.Rz(rads=-8.461596611893802 * np.pi).on(q[6]),
        cirq.Rz(rads=10.100639843256841 * np.pi).on(q[3]),
        cirq.Rz(rads=-10.099314675186001 * np.pi).on(q[7]),
        [
            cirq.ISWAP(q[0], q[4])**-0.933831313649303,
            cirq.CZ(q[0], q[4])**-0.1583933739924931,
        ],
        [
            cirq.ISWAP(q[1], q[5])**-0.9390847780661252,
            cirq.CZ(q[1], q[5])**-0.17144555428591543,
        ],
        [
            cirq.ISWAP(q[2], q[6])**-1.0209160715892363,
            cirq.CZ(q[2], q[6])**-0.14849009270439747,
        ],
        [
            cirq.ISWAP(q[3], q[7])**-1.0287988330229174,
            cirq.CZ(q[3], q[7])**-0.1385888562342036,
        ],
        cirq.Rz(rads=-25.79725021952863 * np.pi).on(q[0]),
        cirq.Rz(rads=25.713885235451578 * np.pi).on(q[4]),
        cirq.Rz(rads=-24.48288974563276 * np.pi).on(q[1]),
        cirq.Rz(rads=24.55855797881315 * np.pi).on(q[5]),
        cirq.Rz(rads=-10.07786364079744 * np.pi).on(q[2]),
        cirq.Rz(rads=9.986829530817898 * np.pi).on(q[6]),
        cirq.Rz(rads=-11.191871460773655 * np.pi).on(q[3]),
        cirq.Rz(rads=11.193196628844492 * np.pi).on(q[7]),
        cirq.X(q[0])**0.5,
        cirq.X(q[1])**0.5,
        cirq.X(q[2])**0.5,
        cirq.Y(q[3])**0.5,
        cirq.Y(q[4])**0.5,
        [cirq.X(q[5])**0.5,
         cirq.H(q[5])**0.5,
         cirq.X(q[5])**-0.5],
        [cirq.X(q[6])**0.5,
         cirq.H(q[6])**0.5,
         cirq.X(q[6])**-0.5],
        [cirq.X(q[7])**0.5,
         cirq.H(q[7])**0.5,
         cirq.X(q[7])**-0.5],
        [cirq.X(q[8])**0.5,
         cirq.H(q[8])**0.5,
         cirq.X(q[8])**-0.5],
        cirq.X(q[9])**0.5,
        [cirq.X(q[10])**0.5,
         cirq.H(q[10])**0.5,
         cirq.X(q[10])**-0.5],
        cirq.Y(q[11])**0.5,
        cirq.Rz(rads=10.044737337703173 * np.pi).on(q[1]),
        cirq.Rz(rads=-9.952929415695523 * np.pi).on(q[2]),
        cirq.Rz(rads=-8.401251133882973 * np.pi).on(q[5]),
        cirq.Rz(rads=8.52245467467511 * np.pi).on(q[6]),
        cirq.Rz(rads=-6.843134633961698 * np.pi).on(q[9]),
        cirq.Rz(rads=6.916407045184491 * np.pi).on(q[10]),
        [
            cirq.ISWAP(q[1], q[2])**-1.009868884178167,
            cirq.CZ(q[1], q[2])**-0.16552586798219657,
        ],
        [
            cirq.ISWAP(q[5], q[6])**-0.9733750299685556,
            cirq.CZ(q[5], q[6])**-0.16091330726740966,
        ],
        [
            cirq.ISWAP(q[9], q[10])**-0.9769678680475263,
            cirq.CZ(q[9], q[10])**-0.16332605888196952,
        ],
        cirq.Rz(rads=-10.440214577494247 * np.pi).on(q[1]),
        cirq.Rz(rads=10.5320224995019 * np.pi).on(q[2]),
        cirq.Rz(rads=8.199075778124648 * np.pi).on(q[5]),
        cirq.Rz(rads=-8.07787223733251 * np.pi).on(q[6]),
        cirq.Rz(rads=6.561341949396702 * np.pi).on(q[9]),
        cirq.Rz(rads=-6.48806953817391 * np.pi).on(q[10]),
        cirq.Y(q[0])**0.5,
        cirq.Y(q[1])**0.5,
        cirq.Y(q[2])**0.5,
        cirq.X(q[3])**0.5,
        cirq.X(q[4])**0.5,
        cirq.Y(q[5])**0.5,
        cirq.Y(q[6])**0.5,
        cirq.X(q[7])**0.5,
        cirq.X(q[8])**0.5,
        [cirq.X(q[9])**0.5,
         cirq.H(q[9])**0.5,
         cirq.X(q[9])**-0.5],
        cirq.Y(q[10])**0.5,
        [cirq.X(q[11])**0.5,
         cirq.H(q[11])**0.5,
         cirq.X(q[11])**-0.5],
        cirq.Rz(rads=12.597359127188014 * np.pi).on(q[0]),
        cirq.Rz(rads=-12.538809626368511 * np.pi).on(q[1]),
        cirq.Rz(rads=-26.08870806725985 * np.pi).on(q[2]),
        cirq.Rz(rads=26.13388826789855 * np.pi).on(q[3]),
        cirq.Rz(rads=11.90395452297206 * np.pi).on(q[4]),
        cirq.Rz(rads=-11.950266520580142 * np.pi).on(q[5]),
        cirq.Rz(rads=-23.906047663366408 * np.pi).on(q[6]),
        cirq.Rz(rads=23.945335880513902 * np.pi).on(q[7]),
        cirq.Rz(rads=5.221137480344522 * np.pi).on(q[8]),
        cirq.Rz(rads=-5.118027941327464 * np.pi).on(q[9]),
        cirq.Rz(rads=9.263573798570924 * np.pi).on(q[10]),
        cirq.Rz(rads=-9.55041239213535 * np.pi).on(q[11]),
        [
            cirq.ISWAP(q[0], q[1])**-0.8242343706275942,
            cirq.CZ(q[0], q[1])**-0.15468164635790926,
        ],
        [
            cirq.ISWAP(q[2], q[3])**-0.981653050634976,
            cirq.CZ(q[2], q[3])**-0.1933349989832593,
        ],
        [
            cirq.ISWAP(q[4], q[5])**-0.9637565510028211,
            cirq.CZ(q[4], q[5])**-0.15186761578643612,
        ],
        [
            cirq.ISWAP(q[6], q[7])**-1.0089894642925605,
            cirq.CZ(q[6], q[7])**-0.17298943435986638,
        ],
        [
            cirq.ISWAP(q[8], q[9])**-0.980271915828302,
            cirq.CZ(q[8], q[9])**-0.16470994863165317,
        ],
        [
            cirq.ISWAP(q[10], q[11])**-0.9290392306402181,
            cirq.CZ(q[10], q[11])**-0.1664963204791881,
        ],
        cirq.Rz(rads=-12.410072351850753 * np.pi).on(q[0]),
        cirq.Rz(rads=12.468621852670255 * np.pi).on(q[1]),
        cirq.Rz(rads=26.656199817881895 * np.pi).on(q[2]),
        cirq.Rz(rads=-26.611019617243198 * np.pi).on(q[3]),
        cirq.Rz(rads=-12.422336273583753 * np.pi).on(q[4]),
        cirq.Rz(rads=12.376024275975672 * np.pi).on(q[5]),
        cirq.Rz(rads=24.032508849527318 * np.pi).on(q[6]),
        cirq.Rz(rads=-23.993220632379824 * np.pi).on(q[7]),
        cirq.Rz(rads=-5.991658529535789 * np.pi).on(q[8]),
        cirq.Rz(rads=6.094768068552847 * np.pi).on(q[9]),
        cirq.Rz(rads=-9.293307215154037 * np.pi).on(q[10]),
        cirq.Rz(rads=9.006468621589612 * np.pi).on(q[11]),
        [cirq.X(q[0])**0.5,
         cirq.H(q[0])**0.5,
         cirq.X(q[0])**-0.5],
        cirq.X(q[1])**0.5,
        cirq.X(q[2])**0.5,
        [cirq.X(q[3])**0.5,
         cirq.H(q[3])**0.5,
         cirq.X(q[3])**-0.5],
        [cirq.X(q[4])**0.5,
         cirq.H(q[4])**0.5,
         cirq.X(q[4])**-0.5],
        cirq.X(q[5])**0.5,
        cirq.X(q[6])**0.5,
        [cirq.X(q[7])**0.5,
         cirq.H(q[7])**0.5,
         cirq.X(q[7])**-0.5],
        cirq.Y(q[8])**0.5,
        cirq.Y(q[9])**0.5,
        cirq.X(q[10])**0.5,
        cirq.X(q[11])**0.5,
        cirq.Rz(rads=-13.046692838556257 * np.pi).on(q[4]),
        cirq.Rz(rads=13.107006443219033 * np.pi).on(q[8]),
        cirq.Rz(rads=-20.486755870544844 * np.pi).on(q[5]),
        cirq.Rz(rads=20.51325689904871 * np.pi).on(q[9]),
        cirq.Rz(rads=-19.82814477311278 * np.pi).on(q[6]),
        cirq.Rz(rads=19.838469153514826 * np.pi).on(q[10]),
        cirq.Rz(rads=17.687652291347487 * np.pi).on(q[7]),
        cirq.Rz(rads=-17.230577602838448 * np.pi).on(q[11]),
        [
            cirq.ISWAP(q[4], q[8])**-1.0121115249769066,
            cirq.CZ(q[4], q[8])**-0.16059979031178617,
        ],
        [
            cirq.ISWAP(q[5], q[9])**-0.985003985982119,
            cirq.CZ(q[5], q[9])**-0.16606010863938203,
        ],
        [
            cirq.ISWAP(q[6], q[10])**-0.9628319095031052,
            cirq.CZ(q[6], q[10])**-0.16339300450568622,
        ],
        [
            cirq.ISWAP(q[7], q[11])**-0.9999941453695372,
            cirq.CZ(q[7], q[11])**-0.16477879415124544,
        ],
        cirq.Rz(rads=12.71050872566315 * np.pi).on(q[4]),
        cirq.Rz(rads=-12.650195121000372 * np.pi).on(q[8]),
        cirq.Rz(rads=19.562531408750814 * np.pi).on(q[5]),
        cirq.Rz(rads=-19.53603038024695 * np.pi).on(q[9]),
        cirq.Rz(rads=18.69447149644039 * np.pi).on(q[6]),
        cirq.Rz(rads=-18.684147116038343 * np.pi).on(q[10]),
        cirq.Rz(rads=-18.21701654221441 * np.pi).on(q[7]),
        cirq.Rz(rads=18.674091230723448 * np.pi).on(q[11]),
        cirq.Y(q[0])**0.5,
        cirq.Y(q[1])**0.5,
        cirq.Y(q[2])**0.5,
        cirq.Y(q[3])**0.5,
        cirq.X(q[4])**0.5,
        cirq.Y(q[5])**0.5,
        [cirq.X(q[6])**0.5,
         cirq.H(q[6])**0.5,
         cirq.X(q[6])**-0.5],
        cirq.Y(q[7])**0.5,
        cirq.X(q[8])**0.5,
        [cirq.X(q[9])**0.5,
         cirq.H(q[9])**0.5,
         cirq.X(q[9])**-0.5],
        cirq.Y(q[10])**0.5,
        cirq.Y(q[11])**0.5,
        cirq.Rz(rads=39.34359792383697 * np.pi).on(q[0]),
        cirq.Rz(rads=-39.42696290791402 * np.pi).on(q[4]),
        cirq.Rz(rads=38.52825306393881 * np.pi).on(q[1]),
        cirq.Rz(rads=-38.452584830758425 * np.pi).on(q[5]),
        cirq.Rz(rads=12.958562501914345 * np.pi).on(q[2]),
        cirq.Rz(rads=-13.049596611893888 * np.pi).on(q[6]),
        cirq.Rz(rads=15.428639843256777 * np.pi).on(q[3]),
        cirq.Rz(rads=-15.42731467518594 * np.pi).on(q[7]),
        [
            cirq.ISWAP(q[0], q[4])**-0.933831313649303,
            cirq.CZ(q[0], q[4])**-0.1583933739924931,
        ],
        [
            cirq.ISWAP(q[1], q[5])**-0.9390847780661252,
            cirq.CZ(q[1], q[5])**-0.17144555428591543,
        ],
        [
            cirq.ISWAP(q[2], q[6])**-1.0209160715892363,
            cirq.CZ(q[2], q[6])**-0.14849009270439747,
        ],
        [
            cirq.ISWAP(q[3], q[7])**-1.0287988330229174,
            cirq.CZ(q[3], q[7])**-0.1385888562342036,
        ],
        cirq.Rz(rads=-39.11725021952874 * np.pi).on(q[0]),
        cirq.Rz(rads=39.03388523545169 * np.pi).on(q[4]),
        cirq.Rz(rads=-37.65488974563269 * np.pi).on(q[1]),
        cirq.Rz(rads=37.730557978813074 * np.pi).on(q[5]),
        cirq.Rz(rads=-14.665863640797525 * np.pi).on(q[2]),
        cirq.Rz(rads=14.574829530817984 * np.pi).on(q[6]),
        cirq.Rz(rads=-16.519871460773594 * np.pi).on(q[3]),
        cirq.Rz(rads=16.52119662884443 * np.pi).on(q[7]),
        cirq.X(q[0])**0.5,
        cirq.X(q[1])**0.5,
        [cirq.X(q[2])**0.5,
         cirq.H(q[2])**0.5,
         cirq.X(q[2])**-0.5],
        cirq.X(q[3])**0.5,
        [cirq.X(q[4])**0.5,
         cirq.H(q[4])**0.5,
         cirq.X(q[4])**-0.5],
        cirq.X(q[5])**0.5,
        cirq.X(q[6])**0.5,
        cirq.X(q[7])**0.5,
        cirq.Y(q[8])**0.5,
        cirq.Y(q[9])**0.5,
        [cirq.X(q[10])**0.5,
         cirq.H(q[10])**0.5,
         cirq.X(q[10])**-0.5],
        cirq.X(q[11])**0.5,
        cirq.Rz(rads=14.928737337703097 * np.pi).on(q[1]),
        cirq.Rz(rads=-14.836929415695444 * np.pi).on(q[2]),
        cirq.Rz(rads=-12.10125113388289 * np.pi).on(q[5]),
        cirq.Rz(rads=12.22245467467503 * np.pi).on(q[6]),
        cirq.Rz(rads=-10.099134633961603 * np.pi).on(q[9]),
        cirq.Rz(rads=10.172407045184396 * np.pi).on(q[10]),
        [
            cirq.ISWAP(q[1], q[2])**-1.009868884178167,
            cirq.CZ(q[1], q[2])**-0.16552586798219657,
        ],
        [
            cirq.ISWAP(q[5], q[6])**-0.9733750299685556,
            cirq.CZ(q[5], q[6])**-0.16091330726740966,
        ],
        [
            cirq.ISWAP(q[9], q[10])**-0.9769678680475263,
            cirq.CZ(q[9], q[10])**-0.16332605888196952,
        ],
        cirq.Rz(rads=-15.32421457749417 * np.pi).on(q[1]),
        cirq.Rz(rads=15.416022499501823 * np.pi).on(q[2]),
        cirq.Rz(rads=11.899075778124569 * np.pi).on(q[5]),
        cirq.Rz(rads=-11.777872237332431 * np.pi).on(q[6]),
        cirq.Rz(rads=9.817341949396608 * np.pi).on(q[9]),
        cirq.Rz(rads=-9.744069538173814 * np.pi).on(q[10]),
        cirq.Y(q[0])**0.5,
        cirq.Y(q[1])**0.5,
        cirq.Y(q[2])**0.5,
        [cirq.X(q[3])**0.5,
         cirq.H(q[3])**0.5,
         cirq.X(q[3])**-0.5],
        cirq.Y(q[4])**0.5,
        cirq.Y(q[5])**0.5,
        [cirq.X(q[6])**0.5,
         cirq.H(q[6])**0.5,
         cirq.X(q[6])**-0.5],
        [cirq.X(q[7])**0.5,
         cirq.H(q[7])**0.5,
         cirq.X(q[7])**-0.5],
        cirq.X(q[8])**0.5,
        [cirq.X(q[9])**0.5,
         cirq.H(q[9])**0.5,
         cirq.X(q[9])**-0.5],
        cirq.Y(q[10])**0.5,
        cirq.Y(q[11])**0.5,
        cirq.Rz(rads=17.629359127188117 * np.pi).on(q[0]),
        cirq.Rz(rads=-17.570809626368614 * np.pi).on(q[1]),
        cirq.Rz(rads=-36.89270806725978 * np.pi).on(q[2]),
        cirq.Rz(rads=36.93788826789848 * np.pi).on(q[3]),
        cirq.Rz(rads=16.787954522971983 * np.pi).on(q[4]),
        cirq.Rz(rads=-16.834266520580062 * np.pi).on(q[5]),
        cirq.Rz(rads=-33.970047663366486 * np.pi).on(q[6]),
        cirq.Rz(rads=34.00933588051398 * np.pi).on(q[7]),
        cirq.Rz(rads=7.441137480344476 * np.pi).on(q[8]),
        cirq.Rz(rads=-7.338027941327417 * np.pi).on(q[9]),
        cirq.Rz(rads=12.963573798570843 * np.pi).on(q[10]),
        cirq.Rz(rads=-13.250412392135269 * np.pi).on(q[11]),
        [
            cirq.ISWAP(q[0], q[1])**-0.8242343706275942,
            cirq.CZ(q[0], q[1])**-0.15468164635790926,
        ],
        [
            cirq.ISWAP(q[2], q[3])**-0.981653050634976,
            cirq.CZ(q[2], q[3])**-0.1933349989832593,
        ],
        [
            cirq.ISWAP(q[4], q[5])**-0.9637565510028211,
            cirq.CZ(q[4], q[5])**-0.15186761578643612,
        ],
        [
            cirq.ISWAP(q[6], q[7])**-1.0089894642925605,
            cirq.CZ(q[6], q[7])**-0.17298943435986638,
        ],
        [
            cirq.ISWAP(q[8], q[9])**-0.980271915828302,
            cirq.CZ(q[8], q[9])**-0.16470994863165317,
        ],
        [
            cirq.ISWAP(q[10], q[11])**-0.9290392306402181,
            cirq.CZ(q[10], q[11])**-0.1664963204791881,
        ],
        cirq.Rz(rads=-17.442072351850854 * np.pi).on(q[0]),
        cirq.Rz(rads=17.500621852670356 * np.pi).on(q[1]),
        cirq.Rz(rads=37.46019981788182 * np.pi).on(q[2]),
        cirq.Rz(rads=-37.415019617243125 * np.pi).on(q[3]),
        cirq.Rz(rads=-17.306336273583675 * np.pi).on(q[4]),
        cirq.Rz(rads=17.260024275975592 * np.pi).on(q[5]),
        cirq.Rz(rads=34.09650884952739 * np.pi).on(q[6]),
        cirq.Rz(rads=-34.057220632379895 * np.pi).on(q[7]),
        cirq.Rz(rads=-8.211658529535743 * np.pi).on(q[8]),
        cirq.Rz(rads=8.3147680685528 * np.pi).on(q[9]),
        cirq.Rz(rads=-12.993307215153958 * np.pi).on(q[10]),
        cirq.Rz(rads=12.706468621589535 * np.pi).on(q[11]),
        [cirq.X(q[0])**0.5,
         cirq.H(q[0])**0.5,
         cirq.X(q[0])**-0.5],
        cirq.X(q[1])**0.5,
        cirq.X(q[2])**0.5,
        cirq.X(q[3])**0.5,
        cirq.X(q[4])**0.5,
        [cirq.X(q[5])**0.5,
         cirq.H(q[5])**0.5,
         cirq.X(q[5])**-0.5],
        cirq.X(q[6])**0.5,
        cirq.Y(q[7])**0.5,
        cirq.Y(q[8])**0.5,
        cirq.Y(q[9])**0.5,
        [cirq.X(q[10])**0.5,
         cirq.H(q[10])**0.5,
         cirq.X(q[10])**-0.5],
        cirq.X(q[11])**0.5,
    ],
                                    strategy=cirq.InsertStrategy.EARLIEST)
    return circuit
Esempio n. 6
0
    def test_cirq_qsim_global_shift(self):
        q0 = cirq.GridQubit(1, 1)
        q1 = cirq.GridQubit(1, 0)
        q2 = cirq.GridQubit(0, 1)
        q3 = cirq.GridQubit(0, 0)

        circuit = cirq.Circuit(
            cirq.Moment([
                cirq.H(q0),
                cirq.H(q1),
                cirq.H(q2),
                cirq.H(q3),
            ]),
            cirq.Moment([
                cirq.CXPowGate(exponent=1, global_shift=0.7)(q0, q1),
                cirq.CZPowGate(exponent=1, global_shift=0.9)(q2, q3),
            ]),
            cirq.Moment([
                cirq.XPowGate(exponent=1, global_shift=1.1)(q0),
                cirq.YPowGate(exponent=1, global_shift=1)(q1),
                cirq.ZPowGate(exponent=1, global_shift=0.9)(q2),
                cirq.HPowGate(exponent=1, global_shift=0.8)(q3),
            ]),
            cirq.Moment([
                cirq.XXPowGate(exponent=1, global_shift=0.2)(q0, q1),
                cirq.YYPowGate(exponent=1, global_shift=0.3)(q2, q3),
            ]),
            cirq.Moment([
                cirq.ZPowGate(exponent=0.25, global_shift=0.4)(q0),
                cirq.ZPowGate(exponent=0.5, global_shift=0.5)(q1),
                cirq.YPowGate(exponent=1, global_shift=0.2)(q2),
                cirq.ZPowGate(exponent=1, global_shift=0.3)(q3),
            ]),
            cirq.Moment([
                cirq.ZZPowGate(exponent=1, global_shift=0.2)(q0, q1),
                cirq.SwapPowGate(exponent=1, global_shift=0.3)(q2, q3),
            ]),
            cirq.Moment([
                cirq.XPowGate(exponent=1, global_shift=0)(q0),
                cirq.YPowGate(exponent=1, global_shift=0)(q1),
                cirq.ZPowGate(exponent=1, global_shift=0)(q2),
                cirq.HPowGate(exponent=1, global_shift=0)(q3),
            ]),
            cirq.Moment([
                cirq.ISwapPowGate(exponent=1, global_shift=0.3)(q0, q1),
                cirq.ZZPowGate(exponent=1, global_shift=0.5)(q2, q3),
            ]),
            cirq.Moment([
                cirq.ZPowGate(exponent=0.5, global_shift=0)(q0),
                cirq.ZPowGate(exponent=0.25, global_shift=0)(q1),
                cirq.XPowGate(exponent=0.9, global_shift=0)(q2),
                cirq.YPowGate(exponent=0.8, global_shift=0)(q3),
            ]),
            cirq.Moment([
                cirq.CZPowGate(exponent=0.3, global_shift=0)(q0, q1),
                cirq.CXPowGate(exponent=0.4, global_shift=0)(q2, q3),
            ]),
            cirq.Moment([
                cirq.ZPowGate(exponent=1.3, global_shift=0)(q0),
                cirq.HPowGate(exponent=0.8, global_shift=0)(q1),
                cirq.XPowGate(exponent=0.9, global_shift=0)(q2),
                cirq.YPowGate(exponent=0.4, global_shift=0)(q3),
            ]),
            cirq.Moment([
                cirq.XXPowGate(exponent=0.8, global_shift=0)(q0, q1),
                cirq.YYPowGate(exponent=0.6, global_shift=0)(q2, q3),
            ]),
            cirq.Moment([
                cirq.HPowGate(exponent=0.7, global_shift=0)(q0),
                cirq.ZPowGate(exponent=0.2, global_shift=0)(q1),
                cirq.YPowGate(exponent=0.3, global_shift=0)(q2),
                cirq.XPowGate(exponent=0.7, global_shift=0)(q3),
            ]),
            cirq.Moment([
                cirq.ZZPowGate(exponent=0.1, global_shift=0)(q0, q1),
                cirq.SwapPowGate(exponent=0.6, global_shift=0)(q2, q3),
            ]),
            cirq.Moment([
                cirq.XPowGate(exponent=0.4, global_shift=0)(q0),
                cirq.YPowGate(exponent=0.3, global_shift=0)(q1),
                cirq.ZPowGate(exponent=0.2, global_shift=0)(q2),
                cirq.HPowGate(exponent=0.1, global_shift=0)(q3),
            ]),
            cirq.Moment([
                cirq.ISwapPowGate(exponent=1.3, global_shift=0)(q0, q1),
                cirq.CXPowGate(exponent=0.5, global_shift=0)(q2, q3),
            ]),
            cirq.Moment([
                cirq.H(q0),
                cirq.H(q1),
                cirq.H(q2),
                cirq.H(q3),
            ]),
        )

        simulator = cirq.Simulator()
        cirq_result = simulator.simulate(circuit)

        qsim_simulator = qsimcirq.QSimSimulator()
        qsim_result = qsim_simulator.simulate(circuit)

        assert cirq.linalg.allclose_up_to_global_phase(
            qsim_result.state_vector(), cirq_result.state_vector())
Esempio n. 7
0
def test_decay_noise_after_moment():
    program = cirq.Circuit()
    qubits = cirq.LineQubit.range(3)
    program.append([
        cirq.H(qubits[0]),
        cirq.CNOT(qubits[0], qubits[1]),
        cirq.CNOT(qubits[1], qubits[2])
    ])
    program.append(
        [
            cirq.measure(qubits[0], key='q0'),
            cirq.measure(qubits[1], key='q1'),
            cirq.measure(qubits[2], key='q2'),
        ],
        strategy=cirq.InsertStrategy.NEW_THEN_INLINE,
    )

    # Use noise model to generate circuit
    depol_noise = ccn.DepolarizingNoiseModel(depol_prob=0.01)
    readout_noise = ccn.ReadoutNoiseModel(bitflip_prob=0.05)
    damping_noise = ccn.DampedReadoutNoiseModel(decay_prob=0.02)
    noisy_circuit = cirq.Circuit(depol_noise.noisy_moments(program, qubits))
    noisy_circuit = cirq.Circuit(
        damping_noise.noisy_moments(noisy_circuit, qubits))
    noisy_circuit = cirq.Circuit(
        readout_noise.noisy_moments(noisy_circuit, qubits))

    # Insert channels explicitly
    true_noisy_program = cirq.Circuit()
    true_noisy_program.append([cirq.H(qubits[0])])
    true_noisy_program.append(
        [
            cirq.DepolarizingChannel(0.01).on(q).with_tags(ops.VirtualTag())
            for q in qubits
        ],
        strategy=cirq.InsertStrategy.NEW_THEN_INLINE,
    )
    true_noisy_program.append([cirq.CNOT(qubits[0], qubits[1])])
    true_noisy_program.append(
        [
            cirq.DepolarizingChannel(0.01).on(q).with_tags(ops.VirtualTag())
            for q in qubits
        ],
        strategy=cirq.InsertStrategy.NEW_THEN_INLINE,
    )
    true_noisy_program.append([cirq.CNOT(qubits[1], qubits[2])])
    true_noisy_program.append(
        [
            cirq.DepolarizingChannel(0.01).on(q).with_tags(ops.VirtualTag())
            for q in qubits
        ],
        strategy=cirq.InsertStrategy.NEW_THEN_INLINE,
    )
    true_noisy_program.append([
        cirq.AmplitudeDampingChannel(0.02).on(q).with_tags(ops.VirtualTag())
        for q in qubits
    ])
    true_noisy_program.append([
        cirq.BitFlipChannel(0.05).on(q).with_tags(ops.VirtualTag())
        for q in qubits
    ])
    true_noisy_program.append([
        cirq.measure(qubits[0], key='q0'),
        cirq.measure(qubits[1], key='q1'),
        cirq.measure(qubits[2], key='q2'),
    ])
    assert_equivalent_op_tree(true_noisy_program, noisy_circuit)
Esempio n. 8
0
import cirq

circuit = cirq.Circuit()

# define two qubits
(q0, q1) = cirq.LineQubit.range(2)

# perform quantum gates on the qubits
qlist = circuit.append([cirq.H(q0), cirq.CNOT(q0, q1)])

# measure the the circuit bits
clist = circuit.append([cirq.measure(q0), cirq.measure(q1)])

# perform simulation of the circuit
sim = cirq.Simulator()
results = sim.run(circuit, repetitions=10)

# print("quantum circuit: {}".format(qlist))
# print("classical circuit: {}".format(clist))

# draw circuit
print(circuit)
print(results)
    def test_static_cases(self):
        """Run inputs through in complex cases."""

        bit = cirq.GridQubit(0, 0)
        symbol = sympy.Symbol('alpha')
        test_pstring = cirq.Z(bit)
        test_psum = cirq.PauliSum.from_pauli_strings([test_pstring])
        symb_circuit = cirq.Circuit(cirq.H(bit)**symbol)
        reg_circuit = cirq.Circuit(cirq.H(bit))

        # Passing a 2d operators input requires a 1d circuit input.
        sampled_expectation.SampledExpectation()(
            [reg_circuit, reg_circuit],
            operators=[[test_psum, test_psum], [test_psum, test_psum]],
            repetitions=1)

        # Passing 2d operators along with other inputs.
        sampled_expectation.SampledExpectation()(
            [symb_circuit, symb_circuit],
            symbol_names=[symbol],
            operators=[[test_psum, test_psum], [test_psum, test_psum]],
            repetitions=1)
        sampled_expectation.SampledExpectation()(
            [symb_circuit, symb_circuit],
            symbol_names=[symbol],
            symbol_values=[[0.5], [0.8]],
            operators=[[test_psum, test_psum], [test_psum, test_psum]],
            repetitions=1)

        # Ensure tiling up of circuits works as expected.
        sampled_expectation.SampledExpectation()(reg_circuit,
                                                 operators=test_psum,
                                                 repetitions=1)
        sampled_expectation.SampledExpectation()(
            reg_circuit, operators=[test_psum, test_psum], repetitions=1)

        # Ensure tiling up of symbol_values works as expected.
        sampled_expectation.SampledExpectation()(symb_circuit,
                                                 symbol_names=[symbol],
                                                 symbol_values=[[0.5], [0.8]],
                                                 operators=test_psum,
                                                 repetitions=1)
        sampled_expectation.SampledExpectation()(symb_circuit,
                                                 symbol_names=[symbol],
                                                 symbol_values=[[0.5]],
                                                 operators=test_psum,
                                                 repetitions=1)

        # Test multiple operators with integer valued repetition.
        sampled_expectation.SampledExpectation()(
            symb_circuit,
            symbol_names=[symbol],
            symbol_values=[[0.5]],
            operators=[-1.0 * cirq.Z(bit),
                       cirq.X(bit) + 2.0 * cirq.Z(bit)],
            repetitions=1)
        sampled_expectation.SampledExpectation()(
            symb_circuit,
            symbol_names=[symbol],
            symbol_values=[[0.5]],
            operators=[-1.0 * cirq.Z(bit),
                       cirq.X(bit) + 2.0 * cirq.Z(bit)],
            repetitions=[5, 1])
    def test_sampled_expectation_op_error(self):
        """Test that expectation errors within underlying ops correctly."""
        # Note the expected_regex is left blank here since there is a
        # discrepancy between the error strings provided between backends.
        bit = cirq.GridQubit(0, 0)
        symbol = sympy.Symbol('alpha')
        test_pstring = cirq.Z(bit)
        test_psum = cirq.PauliSum.from_pauli_strings([test_pstring])
        symb_circuit = cirq.Circuit(cirq.H(bit)**symbol)
        reg_circuit = cirq.Circuit(cirq.H(bit))

        with self.assertRaisesRegex(Exception, expected_regex="pauli_sums"):
            # Operators has wrong rank. Parse error.
            sampled_expectation.SampledExpectation()(
                [reg_circuit],
                operators=util.convert_to_tensor([test_psum]),
                repetitions=1)

        with self.assertRaisesRegex(Exception, expected_regex="symbol_values"):
            # symbol_values has wrong rank.
            sampled_expectation.SampledExpectation()([symb_circuit],
                                                     symbol_names=[symbol],
                                                     symbol_values=[0.5],
                                                     operators=test_psum,
                                                     repetitions=1)

        with self.assertRaisesRegex(
                Exception,
                expected_regex="Number of circuits and PauliSums do not match"
        ):
            # Wrong batch size for pauli operators.
            sampled_expectation.SampledExpectation()(symb_circuit,
                                                     symbol_names=[symbol],
                                                     operators=[[test_psum],
                                                                [test_psum]],
                                                     repetitions=1)

        with self.assertRaisesRegex(
                Exception,
                expected_regex="Number of circuits and PauliSums do not match"
        ):
            # Wrong batch size for pauli operators.
            sampled_expectation.SampledExpectation()(reg_circuit,
                                                     operators=[[test_psum],
                                                                [test_psum]],
                                                     repetitions=1)

        with self.assertRaisesRegex(Exception,
                                    expected_regex="greater than 0"):
            # Wrong repetitions.
            sampled_expectation.SampledExpectation()(reg_circuit,
                                                     operators=test_psum,
                                                     repetitions=-1)

        with self.assertRaisesRegex(
                Exception,
                expected_regex="num_samples and pauli_sums do not match"):
            # Wrong second dimension size for repetitions & pauli operators.
            sampled_expectation.SampledExpectation()(reg_circuit,
                                                     operators=test_psum,
                                                     repetitions=[5, 4, 3])
Esempio n. 11
0
def test_surface_code_cycle_stratifies_without_growing():
    g = cirq.GridQubit
    circuit = cirq.Circuit(
        cirq.H(g(9, 11)),
        cirq.H(g(11, 12)),
        cirq.H(g(12, 9)),
        cirq.H(g(9, 8)),
        cirq.H(g(8, 11)),
        cirq.H(g(11, 9)),
        cirq.H(g(10, 9)),
        cirq.H(g(10, 8)),
        cirq.H(g(11, 10)),
        cirq.H(g(12, 10)),
        cirq.H(g(9, 9)),
        cirq.H(g(9, 10)),
        cirq.H(g(10, 11)),
        cirq.CZ(g(10, 9), g(9, 9)),
        cirq.CZ(g(10, 11), g(9, 11)),
        cirq.CZ(g(9, 10), g(8, 10)),
        cirq.CZ(g(11, 10), g(10, 10)),
        cirq.CZ(g(12, 9), g(11, 9)),
        cirq.CZ(g(11, 12), g(10, 12)),
        cirq.H(g(9, 11)),
        cirq.H(g(9, 9)),
        cirq.H(g(10, 10)),
        cirq.H(g(11, 9)),
        cirq.H(g(10, 12)),
        cirq.H(g(8, 10)),
        cirq.CZ(g(11, 10), g(11, 11)),
        cirq.CZ(g(10, 9), g(10, 8)),
        cirq.CZ(g(12, 9), g(12, 10)),
        cirq.CZ(g(10, 11), g(10, 10)),
        cirq.CZ(g(9, 8), g(9, 9)),
        cirq.CZ(g(9, 10), g(9, 11)),
        cirq.CZ(g(8, 11), g(8, 10)),
        cirq.CZ(g(11, 10), g(11, 9)),
        cirq.CZ(g(11, 12), g(11, 11)),
        cirq.H(g(10, 8)),
        cirq.H(g(12, 10)),
        cirq.H(g(12, 9)),
        cirq.CZ(g(9, 10), g(9, 9)),
        cirq.CZ(g(10, 9), g(10, 10)),
        cirq.CZ(g(10, 11), g(10, 12)),
        cirq.H(g(11, 11)),
        cirq.H(g(9, 11)),
        cirq.H(g(11, 9)),
        cirq.CZ(g(9, 8), g(10, 8)),
        cirq.CZ(g(11, 10), g(12, 10)),
        cirq.H(g(11, 12)),
        cirq.H(g(8, 10)),
        cirq.H(g(10, 10)),
        cirq.CZ(g(8, 11), g(9, 11)),
        cirq.CZ(g(10, 9), g(11, 9)),
        cirq.CZ(g(10, 11), g(11, 11)),
        cirq.H(g(9, 8)),
        cirq.H(g(10, 12)),
        cirq.H(g(11, 10)),
        cirq.CZ(g(9, 10), g(10, 10)),
        cirq.H(g(11, 11)),
        cirq.H(g(9, 11)),
        cirq.H(g(8, 11)),
        cirq.H(g(11, 9)),
        cirq.H(g(10, 9)),
        cirq.H(g(10, 11)),
        cirq.H(g(9, 10)),
    )
    assert len(circuit) == 8
    stratified = cirq.stratified_circuit(circuit, categories=[cirq.H, cirq.CZ])
    # Ideally, this would not grow at all, but for now the algorithm has it
    # grow to a 9. Note that this optimizer uses a fairly simple algorithm
    # that is known not to be optimal - optimal stratification is a CSP
    # problem with high dimensionality that quickly becomes intractable. See
    # https://github.com/quantumlib/Cirq/pull/2772/ for some discussion on
    # this, as well as a more optimal but much more complex and slow solution.
    assert len(stratified) == 9
Esempio n. 12
0
 def _h_layer(self) -> List[cirq.Gate]:
     gate_seq = []
     for qubit in self._qubits:
         gate_seq.append(cirq.H(qubit))
     return gate_seq
Esempio n. 13
0
def add_swap_test(
    state1: typing.Union[cirq.Qid, typing.Iterable[cirq.Qid]],
    state2: typing.Union[cirq.Qid, typing.Iterable[cirq.Qid]],
    circuit: cirq.Circuit,
    auxiliary_qubit: typing.Optional[cirq.Qid] = None,
    auxiliary_qubit_type: typing.Optional[
        typing.Union[typing.Type[cirq.GridQubit], typing.Type[cirq.LineQubit]]
    ] = cirq.GridQubit,
    cswap_in_elementary_gates: bool = False
) -> typing.Tuple[str, cirq.Qid]:
    """
    Add a SWAP test between two quantum states `state1` and `state2`, and then add
    the test into `circuit`.

    999: ───H───@───H───M('SWAP test measure')───
                │
    1: ─────────SWAP─────────────────────────────
                │
    2: ─────────SWAP─────────────────────────────

    :param state1:
        Quantum state to be tested.
    :param state2:
        Quantum state to be tested.
    :param circuit:
        The quantum circuit to which the SWAP test is to be appended.
    :param auxiliary_qubit:
        The auxiliary qubit.
        If being None, it will be created by `generate_auxiliary_qubit`.
        If being a `cirq.Qid` object, then it will be used as the auxiliary
        qubit of our SWAP test, and the argument `auxiliary_qubit_type` will be
        ignored.
        Note: `auxiliary_qubit` and `auxiliary_qubit_type` can not both be
        `None` at the same time.
    :param auxiliary_qubit_type:
        The type of the auxiliary qubit of SWAP test. Only LineQubit and
        GridQubit are supported.
        If `auxiliary_qubit` is None, this argument will be used to create the
        auxiliary qubit.
        If `auxiliary_qubit` is a `cirq.Qid` object, then this argument will be
        ignored.
        Note: `auxiliary_qubit` and `auxiliary_qubit_type` can not both be
        `None` at the same time.
    :param cswap_in_elementary_gates:
        Tells whether the CSWAP gate will be represented in elementary gates.
    :return:
        The string key of the measurement.

    """
    if isinstance(state1, cirq.Qid):
        state1 = [state1]
    if isinstance(state2, cirq.Qid):
        state2 = [state2]

    if len(state1) != len(state2):
        raise ValueError(
            "Qubit lengths of the two target states must equal, "
            "but {} != {}.".format(len(state1), len(state2))
        )

    if auxiliary_qubit is None:
        auxiliary_qubit = generate_auxiliary_qubit(circuit, auxiliary_qubit_type)
    measurement_name = "SWAP test measure "

    existed_swap_measurement_ids = {int(key[len(measurement_name):])
                                    for key in get_all_measurement_keys(circuit)
                                    if key.startswith(measurement_name)}
    swap_measurement_id = (max(existed_swap_measurement_ids) + 1
                           if len(existed_swap_measurement_ids) != 0
                           else 0)
    measurement_name += str(swap_measurement_id)

    circuit.append(cirq.H(auxiliary_qubit))
    for qubit1, qubit2 in zip(state1, state2):
        cswap_op = cirq.CSWAP.on(auxiliary_qubit, qubit1, qubit2)
        if cswap_in_elementary_gates:
            circuit.append(
                cirq.decompose(cswap_op)
            )
        else:
            circuit.append(cswap_op)

    circuit.append([
        cirq.H(auxiliary_qubit),
        cirq.measure(auxiliary_qubit, key=measurement_name)
    ])

    return measurement_name, auxiliary_qubit
Esempio n. 14
0
 def encode_function(qubit):
     if origin_bit == 1:
         yield cirq.X(qubit)
     if encode_gate == 1:
         yield cirq.H(qubit)
Esempio n. 15
0
# initialize registers
b = cirq.LineQubit(0)
x = []
for i in range(n):
    x.append(
        [cirq.LineQubit(i) for i in range(1 + bits * i,
                                          bits * (i + 1) + 1)])

r = [cirq.LineQubit(i) for i in range(1 + bits * n, 1 + bits * n + m)]

# initialize circuit
circuit = cirq.Circuit()

# prepare superpositions over b and x
# have \sum_{b, x} |b>|x>|0>
circuit.append(cirq.H(b))
for i in range(n):
    for j in range(bits):
        circuit.append(cirq.H(x[i][j]))

# initialize phase qubis
for i in range(m):
    circuit.append(cirq.H(r[i]))

# prepare phase qubits that recover MSB with high probability when measured
# after each iteration of the loop, the i-th phase qubit should be in the state:
# |+_theta>, where theta = pi/4 * (<a, x> + b . y_i) and a is the i-th row of A

for i in range(m):
    for j in range(n):
        for k in range(bits):
Esempio n. 16
0
def test_throws_when_indexed_by_unused_qubit():
    a, b = cirq.LineQubit.range(2)
    moment = cirq.Moment([cirq.H(a)])

    with pytest.raises(KeyError, match="Moment doesn't act on given qubit"):
        _ = moment[b]
def test_cnots_separated_by_single_gates_correct():
    a, b = cirq.LineQubit.range(2)
    assert_optimization_not_broken(cirq.Circuit(cirq.CNOT(a, b), cirq.H(b), cirq.CNOT(a, b)))
Esempio n. 18
0
    def _decompose_(self, qubits):
        """The goal is to effect a rotation around an axis in the XY plane in
        each of three orthogonal 2-dimensional subspaces.

        First, the following basis change is performed:
            0000 ↦ 0001        0001 ↦ 1111
            1111 ↦ 0010        1110 ↦ 1100
                               0010 ↦ 0000
            0110 ↦ 0101        1101 ↦ 0011
            1001 ↦ 0110        0100 ↦ 0100
            1010 ↦ 1001        1011 ↦ 0111
            0101 ↦ 1010        1000 ↦ 1000
            1100 ↦ 1101        0111 ↦ 1011
            0011 ↦ 1110

        Note that for each 2-dimensional subspace of interest, the first two
        qubits are the same and the right two qubits are different. The desired
        rotations thus can be effected by a complex-version of a partial SWAP
        gate on the latter two qubits, controlled on the first two qubits. This
        partial SWAP-like gate can  be decomposed such that it is parameterized
        solely by a rotation in the ZY plane on the third qubit. These are the
        `individual_rotations`; call them U0, U1, U2.

        To decompose the double controlled rotations, we use four other
        rotations V0, V1, V2, V3 (the `combined_rotations`) such that
            U0 = V3 · V1 · V0
            U1 = V3 · V2 · V1
            U2 = V2 · V0
        """

        if self._is_parameterized_():
            return NotImplemented

        individual_rotations = [
            la.expm(0.5j * self.exponent *
                    np.array([[np.real(w), 1j * s * np.imag(w)],
                              [-1j * s * np.imag(w), -np.real(w)]]))
            for s, w in zip([1, -1, -1], self.weights)
        ]

        combined_rotations = {}
        combined_rotations[0] = la.sqrtm(
            np.linalg.multi_dot([
                la.inv(individual_rotations[1]), individual_rotations[0],
                individual_rotations[2]
            ]))
        combined_rotations[1] = la.inv(combined_rotations[0])
        combined_rotations[2] = np.linalg.multi_dot([
            la.inv(individual_rotations[0]), individual_rotations[1],
            combined_rotations[0]
        ])
        combined_rotations[3] = individual_rotations[0]

        controlled_rotations = {
            i: cirq.ControlledGate(
                cirq.MatrixGate(combined_rotations[i], qid_shape=(2, )))
            for i in range(4)
        }

        a, b, c, d = qubits

        basis_change = list(
            cirq.flatten_op_tree([
                cirq.CNOT(b, a),
                cirq.CNOT(c, b),
                cirq.CNOT(d, c),
                cirq.CNOT(c, b),
                cirq.CNOT(b, a),
                cirq.CNOT(a, b),
                cirq.CNOT(b, c),
                cirq.CNOT(a, b),
                [cirq.X(c), cirq.X(d)],
                [cirq.CNOT(c, d), cirq.CNOT(d, c)],
                [cirq.X(c), cirq.X(d)],
            ]))

        controlled_rotations = list(
            cirq.flatten_op_tree([
                controlled_rotations[0](b, c),
                cirq.CNOT(a, b), controlled_rotations[1](b, c),
                cirq.CNOT(b, a),
                cirq.CNOT(a, b), controlled_rotations[2](b, c),
                cirq.CNOT(a, b), controlled_rotations[3](b, c)
            ]))

        controlled_swaps = [
            [cirq.CNOT(c, d), cirq.H(c)],
            cirq.CNOT(d, c),
            controlled_rotations,
            cirq.CNOT(d, c),
            [cirq.inverse(op) for op in reversed(controlled_rotations)],
            [cirq.H(c), cirq.CNOT(c, d)],
        ]

        return [basis_change, controlled_swaps, basis_change[::-1]]
Esempio n. 19
0
"""Program for generating random bits in Cirq."""

# Imports
import cirq


# Helper function for visualizing output
def bitstring(bits):
    return ''.join('1' if e else '0' for e in bits)


# Get a qubit and quantum circuit
qbit = cirq.LineQubit(0)
circ = cirq.Circuit()

# Add the Hadamard and measure operations to the circuit
circ.append([cirq.H(qbit), cirq.measure(qbit, key="z")])

# Simulate the circuit
sim = cirq.Simulator()
res = sim.run(circ, repetitions=10)

# Print the outcome
print("Bitstring =", bitstring(res.measurements["z"]))
Esempio n. 20
0
def test_repeat(add_measurements, use_default_ids_for_initial_rep):
    a, b = cirq.LineQubit.range(2)
    circuit = cirq.Circuit(cirq.H(a), cirq.CX(a, b))
    if add_measurements:
        circuit.append([cirq.measure(b, key='mb'), cirq.measure(a, key='ma')])
    op_base = cirq.CircuitOperation(circuit.freeze())
    assert op_base.repeat(1) is op_base
    assert op_base.repeat(1, ['0']) != op_base
    assert op_base.repeat(1, ['0']) == op_base.repeat(repetition_ids=['0'])
    assert op_base.repeat(1, ['0']) == op_base.with_repetition_ids(['0'])

    initial_repetitions = -3
    if add_measurements:
        with pytest.raises(ValueError, match='circuit is not invertible'):
            _ = op_base.repeat(initial_repetitions)
        initial_repetitions = abs(initial_repetitions)

    op_with_reps: Optional[cirq.CircuitOperation] = None
    rep_ids = []
    if use_default_ids_for_initial_rep:
        op_with_reps = op_base.repeat(initial_repetitions)
        rep_ids = ['0', '1', '2']
        assert op_base**initial_repetitions == op_with_reps
    else:
        rep_ids = ['a', 'b', 'c']
        op_with_reps = op_base.repeat(initial_repetitions, rep_ids)
        assert op_base**initial_repetitions != op_with_reps
        assert (op_base**initial_repetitions).replace(
            repetition_ids=rep_ids) == op_with_reps
    assert op_with_reps.repetitions == initial_repetitions
    assert op_with_reps.repetition_ids == rep_ids
    assert op_with_reps.repeat(1) is op_with_reps

    final_repetitions = 2 * initial_repetitions

    op_with_consecutive_reps = op_with_reps.repeat(2)
    assert op_with_consecutive_reps.repetitions == final_repetitions
    assert op_with_consecutive_reps.repetition_ids == _full_join_string_lists(
        ['0', '1'], rep_ids)
    assert op_base**final_repetitions != op_with_consecutive_reps

    op_with_consecutive_reps = op_with_reps.repeat(2, ['a', 'b'])
    assert op_with_reps.repeat(
        repetition_ids=['a', 'b']) == op_with_consecutive_reps
    assert op_with_consecutive_reps.repetitions == final_repetitions
    assert op_with_consecutive_reps.repetition_ids == _full_join_string_lists(
        ['a', 'b'], rep_ids)

    with pytest.raises(ValueError, match='length to be 2'):
        _ = op_with_reps.repeat(2, ['a', 'b', 'c'])

    with pytest.raises(
            ValueError,
            match='At least one of repetitions and repetition_ids must be set'
    ):
        _ = op_base.repeat()

    with pytest.raises(TypeError,
                       match='Only integer or sympy repetitions are allowed'):
        _ = op_base.repeat(1.3)
    assert op_base.repeat(3.00000000001).repetitions == 3
    assert op_base.repeat(2.99999999999).repetitions == 3
Esempio n. 21
0
    def test_cirq_qsim_all_supported_gates(self):
        q0 = cirq.GridQubit(1, 1)
        q1 = cirq.GridQubit(1, 0)
        q2 = cirq.GridQubit(0, 1)
        q3 = cirq.GridQubit(0, 0)

        circuit = cirq.Circuit(
            cirq.Moment([
                cirq.H(q0),
                cirq.H(q1),
                cirq.H(q2),
                cirq.H(q3),
            ]),
            cirq.Moment([
                cirq.T(q0),
                cirq.T(q1),
                cirq.T(q2),
                cirq.T(q3),
            ]),
            cirq.Moment([
                cirq.CZPowGate(exponent=0.7, global_shift=0.2)(q0, q1),
                cirq.CXPowGate(exponent=1.2, global_shift=0.4)(q2, q3),
            ]),
            cirq.Moment([
                cirq.XPowGate(exponent=0.3, global_shift=1.1)(q0),
                cirq.YPowGate(exponent=0.4, global_shift=1)(q1),
                cirq.ZPowGate(exponent=0.5, global_shift=0.9)(q2),
                cirq.HPowGate(exponent=0.6, global_shift=0.8)(q3),
            ]),
            cirq.Moment([
                cirq.CX(q0, q2),
                cirq.CZ(q1, q3),
            ]),
            cirq.Moment([
                cirq.X(q0),
                cirq.Y(q1),
                cirq.Z(q2),
                cirq.S(q3),
            ]),
            cirq.Moment([
                cirq.XXPowGate(exponent=0.4, global_shift=0.7)(q0, q1),
                cirq.YYPowGate(exponent=0.8, global_shift=0.5)(q2, q3),
            ]),
            cirq.Moment([cirq.I(q0),
                         cirq.I(q1),
                         cirq.IdentityGate(2)(q2, q3)]),
            cirq.Moment([
                cirq.rx(0.7)(q0),
                cirq.ry(0.2)(q1),
                cirq.rz(0.4)(q2),
                cirq.PhasedXPowGate(phase_exponent=0.8,
                                    exponent=0.6,
                                    global_shift=0.3)(q3),
            ]),
            cirq.Moment([
                cirq.ZZPowGate(exponent=0.3, global_shift=1.3)(q0, q2),
                cirq.ISwapPowGate(exponent=0.6, global_shift=1.2)(q1, q3),
            ]),
            cirq.Moment([
                cirq.XPowGate(exponent=0.1, global_shift=0.9)(q0),
                cirq.YPowGate(exponent=0.2, global_shift=1)(q1),
                cirq.ZPowGate(exponent=0.3, global_shift=1.1)(q2),
                cirq.HPowGate(exponent=0.4, global_shift=1.2)(q3),
            ]),
            cirq.Moment([
                cirq.SwapPowGate(exponent=0.2, global_shift=0.9)(q0, q1),
                cirq.PhasedISwapPowGate(phase_exponent=0.8, exponent=0.6)(q2,
                                                                          q3),
            ]),
            cirq.Moment([
                cirq.PhasedXZGate(x_exponent=0.2,
                                  z_exponent=0.3,
                                  axis_phase_exponent=1.4)(q0),
                cirq.T(q1),
                cirq.H(q2),
                cirq.S(q3),
            ]),
            cirq.Moment([
                cirq.SWAP(q0, q2),
                cirq.XX(q1, q3),
            ]),
            cirq.Moment([
                cirq.rx(0.8)(q0),
                cirq.ry(0.9)(q1),
                cirq.rz(1.2)(q2),
                cirq.T(q3),
            ]),
            cirq.Moment([
                cirq.YY(q0, q1),
                cirq.ISWAP(q2, q3),
            ]),
            cirq.Moment([
                cirq.T(q0),
                cirq.Z(q1),
                cirq.Y(q2),
                cirq.X(q3),
            ]),
            cirq.Moment([
                cirq.FSimGate(0.3, 1.7)(q0, q2),
                cirq.ZZ(q1, q3),
            ]),
            cirq.Moment([
                cirq.ry(1.3)(q0),
                cirq.rz(0.4)(q1),
                cirq.rx(0.7)(q2),
                cirq.S(q3),
            ]),
            cirq.Moment([
                cirq.MatrixGate(
                    np.array([[0, -0.5 - 0.5j, -0.5 - 0.5j, 0],
                              [0.5 - 0.5j, 0, 0, -0.5 + 0.5j],
                              [0.5 - 0.5j, 0, 0, 0.5 - 0.5j],
                              [0, -0.5 - 0.5j, 0.5 + 0.5j, 0]]))(q0, q1),
                cirq.MatrixGate(
                    np.array([[0.5 - 0.5j, 0, 0, -0.5 + 0.5j],
                              [0, 0.5 - 0.5j, -0.5 + 0.5j, 0],
                              [0, -0.5 + 0.5j, -0.5 + 0.5j, 0],
                              [0.5 - 0.5j, 0, 0, 0.5 - 0.5j]]))(q2, q3),
            ]),
            cirq.Moment([
                cirq.MatrixGate(np.array([[1, 0], [0, 1j]]))(q0),
                cirq.MatrixGate(np.array([[0, -1j], [1j, 0]]))(q1),
                cirq.MatrixGate(np.array([[0, 1], [1, 0]]))(q2),
                cirq.MatrixGate(np.array([[1, 0], [0, -1]]))(q3),
            ]),
            cirq.Moment([
                cirq.riswap(0.7)(q0, q1),
                cirq.givens(1.2)(q2, q3),
            ]),
            cirq.Moment([
                cirq.H(q0),
                cirq.H(q1),
                cirq.H(q2),
                cirq.H(q3),
            ]),
        )

        simulator = cirq.Simulator()
        cirq_result = simulator.simulate(circuit)

        qsim_simulator = qsimcirq.QSimSimulator()
        qsim_result = qsim_simulator.simulate(circuit)

        assert cirq.linalg.allclose_up_to_global_phase(
            qsim_result.state_vector(), cirq_result.state_vector())
Esempio n. 22
0
        prefix = gates[:i + 1]
        expected_a = cirq.LinearCombinationOfGates(collections.Counter(prefix))
        expected_b = -expected_a

        assert_linear_combinations_are_equal(a, expected_a)
        assert_linear_combinations_are_equal(b, expected_b)


@pytest.mark.parametrize('op', (
    cirq.X(q0),
    cirq.Y(q1),
    cirq.XX(q0, q1),
    cirq.CZ(q0, q1),
    cirq.FREDKIN(q0, q1, q2),
    cirq.ControlledOperation((q0, q1), cirq.H(q2)),
    cirq.ParallelGateOperation(cirq.X, (q0, q1, q2)),
    cirq.PauliString({
        q0: cirq.X,
        q1: cirq.Y,
        q2: cirq.Z
    }),
))
def test_empty_linear_combination_of_operations_accepts_all_operations(op):
    combination = cirq.LinearCombinationOfOperations({})
    combination[op] = -0.5j
    assert len(combination) == 1


@pytest.mark.parametrize('terms', (
    {
Esempio n. 23
0
def test_tagged_operation_forwards_protocols():
    """The results of all protocols applied to an operation with a tag should
    be equivalent to the result without tags.
    """
    q1 = cirq.GridQubit(1, 1)
    q2 = cirq.GridQubit(1, 2)
    h = cirq.H(q1)
    tag = 'tag1'
    tagged_h = cirq.H(q1).with_tags(tag)

    np.testing.assert_equal(cirq.unitary(tagged_h), cirq.unitary(h))
    assert cirq.has_unitary(tagged_h)
    assert cirq.decompose(tagged_h) == cirq.decompose(h)
    assert cirq.pauli_expansion(tagged_h) == cirq.pauli_expansion(h)
    assert cirq.equal_up_to_global_phase(h, tagged_h)
    assert np.isclose(cirq.channel(h), cirq.channel(tagged_h)).all()

    assert cirq.measurement_key(cirq.measure(q1, key='blah').with_tags(tag)) == 'blah'

    parameterized_op = cirq.XPowGate(exponent=sympy.Symbol('t'))(q1).with_tags(tag)
    assert cirq.is_parameterized(parameterized_op)
    resolver = cirq.study.ParamResolver({'t': 0.25})
    assert cirq.resolve_parameters(parameterized_op, resolver) == cirq.XPowGate(exponent=0.25)(
        q1
    ).with_tags(tag)
    assert cirq.resolve_parameters_once(parameterized_op, resolver) == cirq.XPowGate(exponent=0.25)(
        q1
    ).with_tags(tag)

    y = cirq.Y(q1)
    tagged_y = cirq.Y(q1).with_tags(tag)
    assert tagged_y ** 0.5 == cirq.YPowGate(exponent=0.5)(q1)
    assert tagged_y * 2 == (y * 2)
    assert 3 * tagged_y == (3 * y)
    assert cirq.phase_by(y, 0.125, 0) == cirq.phase_by(tagged_y, 0.125, 0)
    controlled_y = tagged_y.controlled_by(q2)
    assert controlled_y.qubits == (
        q2,
        q1,
    )
    assert isinstance(controlled_y, cirq.Operation)
    assert not isinstance(controlled_y, cirq.TaggedOperation)

    clifford_x = cirq.SingleQubitCliffordGate.X(q1)
    tagged_x = cirq.SingleQubitCliffordGate.X(q1).with_tags(tag)
    assert cirq.commutes(clifford_x, clifford_x)
    assert cirq.commutes(tagged_x, clifford_x)
    assert cirq.commutes(clifford_x, tagged_x)
    assert cirq.commutes(tagged_x, tagged_x)

    assert cirq.trace_distance_bound(y ** 0.001) == cirq.trace_distance_bound(
        (y ** 0.001).with_tags(tag)
    )

    flip = cirq.bit_flip(0.5)(q1)
    tagged_flip = cirq.bit_flip(0.5)(q1).with_tags(tag)
    assert cirq.has_mixture(tagged_flip)
    assert cirq.has_channel(tagged_flip)

    flip_mixture = cirq.mixture(flip)
    tagged_mixture = cirq.mixture(tagged_flip)
    assert len(tagged_mixture) == 2
    assert len(tagged_mixture[0]) == 2
    assert len(tagged_mixture[1]) == 2
    assert tagged_mixture[0][0] == flip_mixture[0][0]
    assert np.isclose(tagged_mixture[0][1], flip_mixture[0][1]).all()
    assert tagged_mixture[1][0] == flip_mixture[1][0]
    assert np.isclose(tagged_mixture[1][1], flip_mixture[1][1]).all()

    qubit_map = {q1: 'q1'}
    qasm_args = cirq.QasmArgs(qubit_id_map=qubit_map)
    assert cirq.qasm(h, args=qasm_args) == cirq.qasm(tagged_h, args=qasm_args)

    cirq.testing.assert_has_consistent_apply_unitary(tagged_h)
Esempio n. 24
0
def _get_circuit_proto_pairs():
    q0 = cirq.GridQubit(0, 0)
    q1 = cirq.GridQubit(0, 1)

    pairs = [
        # HPOW and aliases.
        (cirq.Circuit(cirq.HPowGate(exponent=0.3)(q0)),
         _build_gate_proto("HP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [0.3, 1.0, 0.0], ['0_0'])),
        (cirq.Circuit(cirq.HPowGate(exponent=sympy.Symbol('alpha'))(q0)),
         _build_gate_proto("HP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 1.0, 0.0], ['0_0'])),
        (cirq.Circuit(cirq.HPowGate(exponent=3.1 * sympy.Symbol('alpha'))(q0)),
         _build_gate_proto("HP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 3.1, 0.0], ['0_0'])),
        (cirq.Circuit(cirq.H(q0)),
         _build_gate_proto("HP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [1.0, 1.0, 0.0], ['0_0'])),

        # XPOW and aliases.
        (cirq.Circuit(cirq.XPowGate(exponent=0.3)(q0)),
         _build_gate_proto("XP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [0.3, 1.0, 0.0], ['0_0'])),
        (cirq.Circuit(cirq.XPowGate(exponent=sympy.Symbol('alpha'))(q0)),
         _build_gate_proto("XP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 1.0, 0.0], ['0_0'])),
        (cirq.Circuit(cirq.XPowGate(exponent=3.1 * sympy.Symbol('alpha'))(q0)),
         _build_gate_proto("XP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 3.1, 0.0], ['0_0'])),
        (cirq.Circuit(cirq.X(q0)),
         _build_gate_proto("XP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [1.0, 1.0, 0.0], ['0_0'])),

        # YPOW and aliases
        (cirq.Circuit(cirq.YPowGate(exponent=0.3)(q0)),
         _build_gate_proto("YP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [0.3, 1.0, 0.0], ['0_0'])),
        (cirq.Circuit(cirq.YPowGate(exponent=sympy.Symbol('alpha'))(q0)),
         _build_gate_proto("YP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 1.0, 0.0], ['0_0'])),
        (cirq.Circuit(cirq.YPowGate(exponent=3.1 * sympy.Symbol('alpha'))(q0)),
         _build_gate_proto("YP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 3.1, 0.0], ['0_0'])),
        (cirq.Circuit(cirq.Y(q0)),
         _build_gate_proto("YP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [1.0, 1.0, 0.0], ['0_0'])),

        # ZPOW and aliases.
        (cirq.Circuit(cirq.ZPowGate(exponent=0.3)(q0)),
         _build_gate_proto("ZP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [0.3, 1.0, 0.0], ['0_0'])),
        (cirq.Circuit(cirq.ZPowGate(exponent=sympy.Symbol('alpha'))(q0)),
         _build_gate_proto("ZP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 1.0, 0.0], ['0_0'])),
        (cirq.Circuit(cirq.ZPowGate(exponent=3.1 * sympy.Symbol('alpha'))(q0)),
         _build_gate_proto("ZP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 3.1, 0.0], ['0_0'])),
        (cirq.Circuit(cirq.Z(q0)),
         _build_gate_proto("ZP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [1.0, 1.0, 0.0], ['0_0'])),

        # XXPow and aliases
        (cirq.Circuit(cirq.XXPowGate(exponent=0.3)(q0, q1)),
         _build_gate_proto("XXP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [0.3, 1.0, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(cirq.XXPowGate(exponent=sympy.Symbol('alpha'))(q0, q1)),
         _build_gate_proto("XXP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 1.0, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(
            cirq.XXPowGate(exponent=3.1 * sympy.Symbol('alpha'))(q0, q1)),
         _build_gate_proto("XXP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 3.1, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(cirq.XX(q0, q1)),
         _build_gate_proto("XXP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [1.0, 1.0, 0.0], ['0_0', '0_1'])),

        # YYPow and aliases
        (cirq.Circuit(cirq.YYPowGate(exponent=0.3)(q0, q1)),
         _build_gate_proto("YYP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [0.3, 1.0, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(cirq.YYPowGate(exponent=sympy.Symbol('alpha'))(q0, q1)),
         _build_gate_proto("YYP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 1.0, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(
            cirq.YYPowGate(exponent=3.1 * sympy.Symbol('alpha'))(q0, q1)),
         _build_gate_proto("YYP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 3.1, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(cirq.YY(q0, q1)),
         _build_gate_proto("YYP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [1.0, 1.0, 0.0], ['0_0', '0_1'])),

        # ZZPow and aliases
        (cirq.Circuit(cirq.ZZPowGate(exponent=0.3)(q0, q1)),
         _build_gate_proto("ZZP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [0.3, 1.0, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(cirq.ZZPowGate(exponent=sympy.Symbol('alpha'))(q0, q1)),
         _build_gate_proto("ZZP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 1.0, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(
            cirq.ZZPowGate(exponent=3.1 * sympy.Symbol('alpha'))(q0, q1)),
         _build_gate_proto("ZZP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 3.1, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(cirq.ZZ(q0, q1)),
         _build_gate_proto("ZZP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [1.0, 1.0, 0.0], ['0_0', '0_1'])),

        # CZPow and aliases
        (cirq.Circuit(cirq.CZPowGate(exponent=0.3)(q0, q1)),
         _build_gate_proto("CZP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [0.3, 1.0, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(cirq.CZPowGate(exponent=sympy.Symbol('alpha'))(q0, q1)),
         _build_gate_proto("CZP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 1.0, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(
            cirq.CZPowGate(exponent=3.1 * sympy.Symbol('alpha'))(q0, q1)),
         _build_gate_proto("CZP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 3.1, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(cirq.CZ(q0, q1)),
         _build_gate_proto("CZP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [1.0, 1.0, 0.0], ['0_0', '0_1'])),

        # CNOTPow and aliases
        (cirq.Circuit(cirq.CNotPowGate(exponent=0.3)(q0, q1)),
         _build_gate_proto("CNP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [0.3, 1.0, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(
            cirq.CNotPowGate(exponent=sympy.Symbol('alpha'))(q0, q1)),
         _build_gate_proto("CNP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 1.0, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(
            cirq.CNotPowGate(exponent=3.1 * sympy.Symbol('alpha'))(q0, q1)),
         _build_gate_proto("CNP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 3.1, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(cirq.CNOT(q0, q1)),
         _build_gate_proto("CNP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [1.0, 1.0, 0.0], ['0_0', '0_1'])),

        # SWAPPow and aliases
        (cirq.Circuit(cirq.SwapPowGate(exponent=0.3)(q0, q1)),
         _build_gate_proto("SP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [0.3, 1.0, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(
            cirq.SwapPowGate(exponent=sympy.Symbol('alpha'))(q0, q1)),
         _build_gate_proto("SP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 1.0, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(
            cirq.SwapPowGate(exponent=3.1 * sympy.Symbol('alpha'))(q0, q1)),
         _build_gate_proto("SP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 3.1, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(cirq.SWAP(q0, q1)),
         _build_gate_proto("SP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [1.0, 1.0, 0.0], ['0_0', '0_1'])),

        # ISWAPPow and aliases
        (cirq.Circuit(cirq.ISwapPowGate(exponent=0.3)(q0, q1)),
         _build_gate_proto("ISP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [0.3, 1.0, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(
            cirq.ISwapPowGate(exponent=sympy.Symbol('alpha'))(q0, q1)),
         _build_gate_proto("ISP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 1.0, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(
            cirq.ISwapPowGate(exponent=3.1 * sympy.Symbol('alpha'))(q0, q1)),
         _build_gate_proto("ISP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           ['alpha', 3.1, 0.0], ['0_0', '0_1'])),
        (cirq.Circuit(cirq.ISWAP(q0, q1)),
         _build_gate_proto("ISP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [1.0, 1.0, 0.0], ['0_0', '0_1'])),

        # PhasedXPow and aliases
        (cirq.Circuit(
            cirq.PhasedXPowGate(phase_exponent=0.9,
                                exponent=0.3,
                                global_shift=0.2)(q0)),
         _build_gate_proto("PXP", [
             'phase_exponent', 'phase_exponent_scalar', 'exponent',
             'exponent_scalar', 'global_shift'
         ], [0.9, 1.0, 0.3, 1.0, 0.2], ['0_0'])),
        (cirq.Circuit(
            cirq.PhasedXPowGate(phase_exponent=sympy.Symbol('alpha'),
                                exponent=0.3)(q0)),
         _build_gate_proto("PXP", [
             'phase_exponent', 'phase_exponent_scalar', 'exponent',
             'exponent_scalar', 'global_shift'
         ], ['alpha', 1.0, 0.3, 1.0, 0.0], ['0_0'])),
        (cirq.Circuit(
            cirq.PhasedXPowGate(phase_exponent=3.1 * sympy.Symbol('alpha'),
                                exponent=0.3)(q0)),
         _build_gate_proto("PXP", [
             'phase_exponent', 'phase_exponent_scalar', 'exponent',
             'exponent_scalar', 'global_shift'
         ], ['alpha', 3.1, 0.3, 1.0, 0.0], ['0_0'])),
        (cirq.Circuit(
            cirq.PhasedXPowGate(phase_exponent=0.9,
                                exponent=sympy.Symbol('beta'))(q0)),
         _build_gate_proto("PXP", [
             'phase_exponent', 'phase_exponent_scalar', 'exponent',
             'exponent_scalar', 'global_shift'
         ], [0.9, 1.0, 'beta', 1.0, 0.0], ['0_0'])),
        (cirq.Circuit(
            cirq.PhasedXPowGate(phase_exponent=0.9,
                                exponent=5.1 * sympy.Symbol('beta'))(q0)),
         _build_gate_proto("PXP", [
             'phase_exponent', 'phase_exponent_scalar', 'exponent',
             'exponent_scalar', 'global_shift'
         ], [0.9, 1.0, 'beta', 5.1, 0.0], ['0_0'])),
        (cirq.Circuit(
            cirq.PhasedXPowGate(phase_exponent=3.1 * sympy.Symbol('alpha'),
                                exponent=5.1 * sympy.Symbol('beta'))(q0)),
         _build_gate_proto("PXP", [
             'phase_exponent', 'phase_exponent_scalar', 'exponent',
             'exponent_scalar', 'global_shift'
         ], ['alpha', 3.1, 'beta', 5.1, 0.0], ['0_0'])),

        # RX, RY, RZ with symbolization is tested in special cases as the
        # string comparison of the float converted sympy.pi does not happen
        # smoothly. See: test_serialize_deserialize_special_case_one_qubit
        (cirq.Circuit(cirq.rx(np.pi)(q0)),
         _build_gate_proto("XP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [1.0, 1.0, -0.5], ['0_0'])),
        (cirq.Circuit(cirq.ry(np.pi)(q0)),
         _build_gate_proto("YP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [1.0, 1.0, -0.5], ['0_0'])),
        (cirq.Circuit(cirq.rz(np.pi)(q0)),
         _build_gate_proto("ZP",
                           ['exponent', 'exponent_scalar', 'global_shift'],
                           [1.0, 1.0, -0.5], ['0_0'])),

        # Identity
        (cirq.Circuit(cirq.I(q0)),
         _build_gate_proto("I", ['unused'], [True], ['0_0'])),

        # FSimGate
        (cirq.Circuit(cirq.FSimGate(theta=0.1, phi=0.2)(q0, q1)),
         _build_gate_proto("FSIM",
                           ['theta', 'theta_scalar', 'phi', 'phi_scalar'],
                           [0.1, 1.0, 0.2, 1.0], ['0_0', '0_1'])),
        (cirq.Circuit(
            cirq.FSimGate(theta=2.1 * sympy.Symbol("alpha"),
                          phi=1.3 * sympy.Symbol("beta"))(q0, q1)),
         _build_gate_proto("FSIM",
                           ['theta', 'theta_scalar', 'phi', 'phi_scalar'],
                           ['alpha', 2.1, 'beta', 1.3], ['0_0', '0_1'])),
    ]

    return pairs
Esempio n. 25
0
    def encode(self, additional_qubits: List[cirq.Qid],
               unencoded_qubits: List[cirq.Qid]) -> cirq.Circuit:
        """Creates a circuit that encodes the qubits using the code words.

        Args:
            additional_qubits: The list of self.n - self.k qubits needed to encode the qubit.
            unencoded_qubits: The list of self.k qubits that contain the original message.

        Returns:
            A circuit where the self.n qubits are the encoded qubits.
        """
        assert len(additional_qubits) == self.n - self.k
        assert len(unencoded_qubits) == self.k
        qubits = additional_qubits + unencoded_qubits

        circuit = cirq.Circuit()

        # Equation 4.8:
        # This follows the improvements of:
        # https://cs269q.stanford.edu/projects2019/stabilizer_code_report_Y.pdf
        for r, x in enumerate(self.logical_Xs):
            for j in range(self.r, self.n - self.k):
                # By constructions, the first r rows can never contain a Z, as
                # r is defined by the Gaussian elimination as the rank.
                if x[j] == 'X' or x[j] == 'Y':
                    circuit.append(
                        cirq.ControlledOperation([unencoded_qubits[r]],
                                                 cirq.X(additional_qubits[j])))

        gate_dict = {'X': cirq.X, 'Y': cirq.Y, 'Z': cirq.Z}

        for r in range(self.r):
            circuit.append(cirq.H(qubits[r]))

            # Let's consider the first stabilizer:
            # The reason for adding S gate is Y gate we used is the complex format (i.e. to
            # make it Hermitian). It has following four cases: (ignore the phase factor)
            # (I+X@P_2...P_k)|0...0> = |0...0> + |1>|\psi>
            # (I+Y@P_2...P_k)|0...0> = |0...0> + i|1>|\psi>
            # The other forms are not possible in the standard form, by construction.

            # The first case means we need [1,1] vector and controlled gates and in the
            # second case we need [1, i] vector and controlled gates. Corresponding, it is
            # the first column of H and the first column of SH respectively.

            # For the other stabilizers, the process can be repeated, as by definition they
            # commute.

            if self.M[r][r] == 'Y' or self.M[r][r] == 'Z':
                circuit.append(cirq.S(qubits[r]))

            for n in range(self.n):
                if n == r:
                    continue
                if self.M[r][n] == 'I':
                    continue
                op = gate_dict[self.M[r][n]]
                circuit.append(
                    cirq.ControlledOperation([qubits[r]], op(qubits[n])))
        # At this stage, the state vector should be equal to equations 3.17 and 3.18.

        return circuit
Esempio n. 26
0
def test_readout_error():
    p00 = 0.05
    p11 = 0.1

    p = p11 / (p00 + p11)
    gamma = p11 / p

    # Create qubits and circuit
    qubits = [cirq.LineQubit(0), cirq.LineQubit(1)]
    circuit = cirq.Circuit(
        cirq.Moment([cirq.X(qubits[0])]),
        cirq.Moment([cirq.CNOT(qubits[0], qubits[1])]),
        cirq.Moment([cirq.H(qubits[1])]),
        cirq.Moment([
            cirq.measure(qubits[0], key='q0'),
            cirq.measure(qubits[1], key='q1')
        ]),
    )

    # Create noise model from NoiseProperties object with specified noise
    prop = NoiseProperties(p00=p00, p11=p11)
    noise_model = NoiseModelFromNoiseProperties(prop)

    noisy_circuit = cirq.Circuit(noise_model.noisy_moments(circuit, qubits))

    # Insert expected channels to circuit
    expected_circuit = cirq.Circuit(
        cirq.Moment([cirq.X(qubits[0])]),
        cirq.Moment([cirq.CNOT(qubits[0], qubits[1])]),
        cirq.Moment([cirq.H(qubits[1])]),
        cirq.Moment([
            cirq.GeneralizedAmplitudeDampingChannel(
                p=p, gamma=gamma).on_each(qubits)
        ]),
        cirq.Moment([
            cirq.measure(qubits[0], key='q0'),
            cirq.measure(qubits[1], key='q1')
        ]),
    )

    assert_equivalent_op_tree(expected_circuit, noisy_circuit)

    # Create Noise Model with just p00
    prop_p00 = NoiseProperties(p00=p00)
    noise_model_p00 = NoiseModelFromNoiseProperties(prop_p00)

    noisy_circuit_p00 = cirq.Circuit(
        noise_model_p00.noisy_moments(circuit, qubits))

    # Insert expected channels to circuit
    expected_circuit_p00 = cirq.Circuit(
        cirq.Moment([cirq.X(qubits[0])]),
        cirq.Moment([cirq.CNOT(qubits[0], qubits[1])]),
        cirq.Moment([cirq.H(qubits[1])]),
        cirq.Moment([
            cirq.GeneralizedAmplitudeDampingChannel(p=0.0,
                                                    gamma=p00).on_each(qubits)
        ]),
        cirq.Moment([
            cirq.measure(qubits[0], key='q0'),
            cirq.measure(qubits[1], key='q1')
        ]),
    )

    assert_equivalent_op_tree(expected_circuit_p00, noisy_circuit_p00)

    # Create Noise Model with just p11
    prop_p11 = NoiseProperties(p11=p11)
    noise_model_p11 = NoiseModelFromNoiseProperties(prop_p11)

    noisy_circuit_p11 = cirq.Circuit(
        noise_model_p11.noisy_moments(circuit, qubits))

    # Insert expected channels to circuit
    expected_circuit_p11 = cirq.Circuit(
        cirq.Moment([cirq.X(qubits[0])]),
        cirq.Moment([cirq.CNOT(qubits[0], qubits[1])]),
        cirq.Moment([cirq.H(qubits[1])]),
        cirq.Moment([
            cirq.GeneralizedAmplitudeDampingChannel(p=1.0,
                                                    gamma=p11).on_each(qubits)
        ]),
        cirq.Moment([
            cirq.measure(qubits[0], key='q0'),
            cirq.measure(qubits[1], key='q1')
        ]),
    )

    assert_equivalent_op_tree(expected_circuit_p11, noisy_circuit_p11)
Esempio n. 27
0
    class UndiagrammableGate(cirq.SingleQubitGate):
        pass

    undiagrammable_op = UndiagrammableGate()(qbits[1])

    c_op = cirq.ControlledOperation(qbits[:1], undiagrammable_op)
    assert cirq.circuit_diagram_info(c_op, default=None) is None


@pytest.mark.parametrize('gate', [
    cirq.X(cirq.NamedQubit('q1')),
    cirq.X(cirq.NamedQubit('q1'))**0.5,
    cirq.rx(np.pi)(cirq.NamedQubit('q1')),
    cirq.rx(np.pi / 2)(cirq.NamedQubit('q1')),
    cirq.Z(cirq.NamedQubit('q1')),
    cirq.H(cirq.NamedQubit('q1')),
    cirq.CNOT(cirq.NamedQubit('q1'), cirq.NamedQubit('q2')),
    cirq.SWAP(cirq.NamedQubit('q1'), cirq.NamedQubit('q2')),
    cirq.CCZ(cirq.NamedQubit('q1'), cirq.NamedQubit('q2'),
             cirq.NamedQubit('q3')),
    cirq.ControlledGate(cirq.ControlledGate(
        cirq.CCZ))(*cirq.LineQubit.range(5)),
    GateUsingWorkspaceForApplyUnitary()(cirq.NamedQubit('q1')),
    GateAllocatingNewSpaceForResult()(cirq.NamedQubit('q1')),
])
def test_controlled_operation_is_consistent(gate: cirq.GateOperation):
    cb = cirq.NamedQubit('ctr')
    cgate = cirq.ControlledOperation([cb], gate)
    cirq.testing.assert_implements_consistent_protocols(cgate)

    cgate = cirq.ControlledOperation([cb], gate, control_values=[0])
Esempio n. 28
0
def test_string_format():
    x, y, z = cirq.LineQubit.range(3)

    fc0 = cirq.FrozenCircuit()
    op0 = cirq.CircuitOperation(fc0)
    assert (
        str(op0)
        == f"""\
{op0.circuit.diagram_name()}:
[                         ]"""
    )

    fc0_global_phase_inner = cirq.FrozenCircuit(
        cirq.GlobalPhaseOperation(1j), cirq.GlobalPhaseOperation(1j)
    )
    op0_global_phase_inner = cirq.CircuitOperation(fc0_global_phase_inner)
    fc0_global_phase_outer = cirq.FrozenCircuit(
        op0_global_phase_inner, cirq.GlobalPhaseOperation(1j)
    )
    op0_global_phase_outer = cirq.CircuitOperation(fc0_global_phase_outer)
    assert (
        str(op0_global_phase_outer)
        == f"""\
{op0_global_phase_outer.circuit.diagram_name()}:
[                         ]
[                         ]
[ global phase:   -0.5π   ]"""
    )

    fc1 = cirq.FrozenCircuit(cirq.X(x), cirq.H(y), cirq.CX(y, z), cirq.measure(x, y, z, key='m'))
    op1 = cirq.CircuitOperation(fc1)
    assert (
        str(op1)
        == f"""\
{op1.circuit.diagram_name()}:
[ 0: ───X───────M('m')─── ]
[               │         ]
[ 1: ───H───@───M──────── ]
[           │   │         ]
[ 2: ───────X───M──────── ]"""
    )
    assert (
        repr(op1)
        == f"""\
cirq.CircuitOperation(
    circuit=cirq.FrozenCircuit([
        cirq.Moment(
            cirq.X(cirq.LineQubit(0)),
            cirq.H(cirq.LineQubit(1)),
        ),
        cirq.Moment(
            cirq.CNOT(cirq.LineQubit(1), cirq.LineQubit(2)),
        ),
        cirq.Moment(
            cirq.measure(cirq.LineQubit(0), cirq.LineQubit(1), cirq.LineQubit(2), key='m'),
        ),
    ]),
)"""
    )

    fc2 = cirq.FrozenCircuit(cirq.X(x), cirq.H(y), cirq.CX(y, x))
    op2 = cirq.CircuitOperation(
        circuit=fc2,
        qubit_map=({y: z}),
        repetitions=3,
        parent_path=('outer', 'inner'),
        repetition_ids=['a', 'b', 'c'],
    )
    assert (
        str(op2)
        == f"""\
{op2.circuit.diagram_name()}:
[ 0: ───X───X───          ]
[           │             ]
[ 1: ───H───@───          ](qubit_map={{1: 2}}, parent_path=('outer', 'inner'),\
 repetition_ids=['a', 'b', 'c'])"""
    )
    assert (
        repr(op2)
        == """\
cirq.CircuitOperation(
    circuit=cirq.FrozenCircuit([
        cirq.Moment(
            cirq.X(cirq.LineQubit(0)),
            cirq.H(cirq.LineQubit(1)),
        ),
        cirq.Moment(
            cirq.CNOT(cirq.LineQubit(1), cirq.LineQubit(0)),
        ),
    ]),
    repetitions=3,
    qubit_map={cirq.LineQubit(1): cirq.LineQubit(2)},
    parent_path=('outer', 'inner'),
    repetition_ids=['a', 'b', 'c'],
)"""
    )

    fc3 = cirq.FrozenCircuit(
        cirq.X(x) ** sympy.Symbol('b'),
        cirq.measure(x, key='m'),
    )
    op3 = cirq.CircuitOperation(
        circuit=fc3,
        qubit_map={x: y},
        measurement_key_map={'m': 'p'},
        param_resolver={sympy.Symbol('b'): 2},
    )
    indented_fc3_repr = repr(fc3).replace('\n', '\n    ')
    assert (
        str(op3)
        == f"""\
{op3.circuit.diagram_name()}:
[ 0: ───X^b───M('m')───   ](qubit_map={{0: 1}}, \
key_map={{m: p}}, params={{b: 2}})"""
    )
    assert (
        repr(op3)
        == f"""\
cirq.CircuitOperation(
    circuit={indented_fc3_repr},
    qubit_map={{cirq.LineQubit(0): cirq.LineQubit(1)}},
    measurement_key_map={{'m': 'p'}},
    param_resolver=cirq.ParamResolver({{sympy.Symbol('b'): 2}}),
)"""
    )

    fc4 = cirq.FrozenCircuit(cirq.X(y))
    op4 = cirq.CircuitOperation(fc4)
    fc5 = cirq.FrozenCircuit(cirq.X(x), op4)
    op5 = cirq.CircuitOperation(fc5)
    assert (
        repr(op5)
        == f"""\
cirq.CircuitOperation(
    circuit=cirq.FrozenCircuit([
        cirq.Moment(
            cirq.X(cirq.LineQubit(0)),
            cirq.CircuitOperation(
                circuit=cirq.FrozenCircuit([
                    cirq.Moment(
                        cirq.X(cirq.LineQubit(1)),
                    ),
                ]),
            ),
        ),
    ]),
)"""
    )
Esempio n. 29
0
def test_run_no_repetitions():
    q0 = cirq.LineQubit(0)
    simulator = cirq.CliffordSimulator()
    circuit = cirq.Circuit(cirq.H(q0), cirq.measure(q0))
    result = simulator.run(circuit, repetitions=0)
    assert sum(result.measurements['q(0)']) == 0
Esempio n. 30
0
import cirq

#define the length of the grid, ie the 'GridQubit'
length = 3
qubits = [cirq.GridQubit(i,j) for i in range (length) for j in range (length)]
print(qubits)
#prints

#making a 'Moment', a circuit on the 'GridQubit'
circuit = cirq.Circuit()
circuit.append(cirq.H(q) for q in qubits if (q.row + q.col) % 2 == 0)
#H(Hadmard 'Gate' object) can be changed to foment this row+column even 'Operation'
circuit.append(cirq.X(q) for q in qubits if (q.row + q.col) % 2 == 1)
#X "Gate' object can be changed to foment this row+column odd 'Operation'
print(circuit)


#changing a 'Moment' to two 'Moments'
circuit = cirq.Circuit()
circuit.append([cirq.H(q) for q in qubits if (q.row + q.col) % 2 == 0],
#H(Hadmard 'Gate' object) can be changed to foment this row+column even 'Operation'
                strategy=cirq.InsertStrategy.EARLIEST)  #places H gate at earliest moment
circuit.append([cirq.X(q) for q in qubits if (q.row + q.col) % 2 == 1],
#X "Gate' object can be changed to foment this row+column odd 'Operation'
                strategy=cirq.InsertStrategy.NEW_THEN_INLINE) #places X gate at new individual moment
print(circuit)

#itterating over a 'Circuit's 'Moments'
for i, m in enumerate(circuit):
        print ('Moment {}: {}'.format(i, m))