コード例 #1
0
 def one_qubit_unitary(self, bit, symbols):
     return cirq.Circuit(
         cirq.X(bit)**symbols[0],
         cirq.Y(bit)**symbols[1],
         cirq.Z(bit)**symbols[2])
コード例 #2
0
        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)
コード例 #3
0
@pytest.mark.parametrize('terms, expected_qubits', (
    ({}, ()),
    ({
        cirq.I(q0): 1,
        cirq.H(q0): 1e-3j
    }, (q0, )),
    ({
        cirq.X(q0): 1j,
        cirq.H(q1): 2j
    }, (q0, q1)),
    ({
        cirq.Y(q0): -1,
        cirq.CZ(q0, q1): 3e3
    }, (q0, q1)),
    ({
        cirq.Z(q0): -1j,
        cirq.CNOT(q1, q2): 0.25
    }, (q0, q1, q2)),
))
def test_linear_combination_of_operations_has_correct_qubits(
        terms, expected_qubits):
    combination = cirq.LinearCombinationOfOperations(terms)
    assert combination.qubits == expected_qubits


@pytest.mark.parametrize('terms, expected_matrix', (
    ({}, np.array([0])),
    ({
        cirq.I(q0): 2,
        cirq.X(q0): 3,
        cirq.Y(q0): 4,
コード例 #4
0
def test_raises_for_non_commuting_paulis():
    with pytest.raises(ValueError, match='commuting'):
        cirq.PauliSumExponential(cirq.X(q0) + cirq.Z(q0), np.pi / 2)
コード例 #5
0
def test_pauli_sum_exponential_parameterized_matrix_raises():
    with pytest.raises(ValueError, match='parameterized'):
        cirq.PauliSumExponential(
            cirq.X(q0) + cirq.Z(q1), sympy.Symbol("theta")).matrix()
コード例 #6
0
 def generator(depth):
     if depth <= 0:
         yield cirq.CZ(q0, q1), cirq.Y(q0)
     else:
         yield cirq.X(q0), generator(depth - 1)
         yield cirq.Z(q0)
コード例 #7
0
ファイル: json_test.py プロジェクト: c-poole/Cirq
 'LineQid': [cirq.LineQid(0, 1),
             cirq.LineQid(123, 2),
             cirq.LineQid(-4, 5)],
 'MeasurementGate': [
     cirq.MeasurementGate(num_qubits=3, key='z'),
     cirq.MeasurementGate(num_qubits=3,
                          key='z',
                          invert_mask=(True, False, True)),
     cirq.MeasurementGate(num_qubits=3,
                          key='z',
                          invert_mask=(True, False),
                          qid_shape=(1, 2, 3)),
 ],
 'Moment': [
     cirq.Moment(operations=[cirq.X(Q0), cirq.Y(Q1),
                             cirq.Z(Q2)]),
 ],
 'NO_NOISE':
 cirq.NO_NOISE,
 'NamedQubit':
 cirq.NamedQubit('hi mom'),
 'PauliString': [
     cirq.PauliString({
         Q0: cirq.X,
         Q1: cirq.Y,
         Q2: cirq.Z
     }),
     cirq.X(Q0) * cirq.Y(Q1) * 123
 ],
 'PhaseDampingChannel':
 cirq.PhaseDampingChannel(0.5),
コード例 #8
0
def test_custom_circuit_gate():
    a, b, c, d, e = cirq.LineQubit.range(5)

    # Without name.
    assert_url_to_circuit_returns(
        '{"cols":[["~d3pq"],["Y"]],'
        '"gates":[{"id":"~d3pq","circuit":{"cols":[["H"],["•","X"]]}}]}',
        cirq.Circuit(
            cirq.H(a),
            cirq.X(b).controlled_by(a),
            cirq.Y(a),
        ))

    # With name.
    assert_url_to_circuit_returns(
        '{"cols":[["~d3pq"],["Y"]],'
        '"gates":[{"id":"~d3pq","name":"test",'
        '"circuit":{"cols":[["H"],["•","X"]]}}]}',
        cirq.Circuit(
            cirq.H(a),
            cirq.X(b).controlled_by(a),
            cirq.Y(a),
        ))

    # With internal input.
    assert_url_to_circuit_returns(
        '{"cols":[["~a5ls"]],"gates":[{"id":"~a5ls",'
        '"circuit":{"cols":[["inputA1","+=A1"]]}}]}',
        cirq.Circuit(
            cirq.contrib.quirk.QuirkArithmeticOperation('+=A1',
                                                        target=[b],
                                                        inputs=[[a]])))

    # With external input.
    assert_url_to_circuit_returns(
        '{"cols":[["inputA1","~r79k"]],"gates":[{"id":"~r79k",'
        '"circuit":{"cols":[["+=A1"]]}}]}',
        cirq.Circuit(
            cirq.contrib.quirk.QuirkArithmeticOperation('+=A1',
                                                        target=[b],
                                                        inputs=[[a]])))

    # With external control.
    assert_url_to_circuit_returns(
        '{"cols":[["•",1,"~r79k"]],"gates":[{"id":"~r79k",'
        '"circuit":{"cols":[["X"],["Y","Z"]]}}]}',
        cirq.Circuit(
            cirq.X(c).controlled_by(a),
            cirq.Y(c).controlled_by(a),
            cirq.Z(d).controlled_by(a)))

    # With external and internal control.
    assert_url_to_circuit_returns(
        '{"cols":[["•",1,"~r79k"]],"gates":[{"id":"~r79k",'
        '"circuit":{"cols":[["X"],["⊕","Z"]]}}]}',
        cirq.Circuit(
            cirq.X(c).controlled_by(a),
            cirq.Y(c)**0.5,
            cirq.Z(d).controlled_by(a, c),
            cirq.Y(c)**-0.5))

    # Broadcast input.
    assert_url_to_circuit_returns(
        '{"cols":[["~q1fh",1,1,"inputA2"]],"gates":[{"id":"~q1fh",'
        '"circuit":{"cols":[["+=A2"],[1,"+=A2"],[1,"+=A2"]]}}]}',
        cirq.Circuit(
            cirq.contrib.quirk.QuirkArithmeticOperation('+=A2',
                                                        target=[a, b],
                                                        inputs=[[d, e]]),
            cirq.contrib.quirk.QuirkArithmeticOperation('+=A2',
                                                        target=[b, c],
                                                        inputs=[[d, e]]),
            cirq.contrib.quirk.QuirkArithmeticOperation('+=A2',
                                                        target=[b, c],
                                                        inputs=[[d, e]]),
        ))

    # Nested custom gate.
    assert_url_to_circuit_returns(
        '{"cols":[["~gtnd"]],"gates":[{"id":"~ct36",'
        '"circuit":{"cols":[["X"],["X"]]}},{"id":"~gtnd",'
        '"circuit":{"cols":[["~ct36"],["~ct36"]]}}]}',
        cirq.Circuit(cirq.X(a)) * 4)

    # Nested custom gate wrong order.
    with pytest.raises(ValueError, match='Unrecognized column entry'):
        _ = quirk_json_to_circuit({
            "cols": [["~gtnd"]],
            "gates": [
                {
                    "id": "~gtnd",
                    "circuit": {
                        "cols": [["~ct36"], ["~ct36"]]
                    }
                },
                {
                    "id": "~ct36",
                    "circuit": {
                        "cols": [["X"], ["X"]]
                    }
                },
            ]
        })
q0, q1 = cirq.GridQubit.rect(1, 2)

# Create a circuit on these qubits using the parameters you created above.
circuit = cirq.Circuit(
    cirq.rx(a).on(q0),
    cirq.ry(b).on(q1), cirq.CNOT(control=q0, target=q1))

SVGCircuit(circuit)

# Calculate a state vector with a=0.5 and b=-0.5.
resolver = cirq.ParamResolver({a: 0.5, b: -0.5})
output_state_vector = cirq.Simulator().simulate(circuit,
                                                resolver).final_state_vector
output_state_vector

z0 = cirq.Z(q0)

qubit_map = {q0: 0, q1: 1}

z0.expectation_from_state_vector(output_state_vector, qubit_map).real

z0x1 = 0.5 * z0 + cirq.X(q1)

z0x1.expectation_from_state_vector(output_state_vector, qubit_map).real

# Rank 1 tensor containing 1 circuit.
circuit_tensor = tfq.convert_to_tensor([circuit])

print(circuit_tensor.shape)
print(circuit_tensor.dtype)
コード例 #10
0
ファイル: superdense.py プロジェクト: reemuru/qc-portfolio

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


# Create two quantum and classical registers
qreg = [cirq.LineQubit(x) for x in range(2)]
circ = cirq.Circuit()

# Dictionary of operations for each message
message = {
    "00": [],
    "01": [cirq.X(qreg[0])],
    "10": [cirq.Z(qreg[0])],
    "11": [cirq.X(qreg[0]), cirq.Z(qreg[0])]
}

# Alice creates a bell pair
circ.append(cirq.H(qreg[0]))
circ.append(cirq.CNOT(qreg[0], qreg[1]))

# Alice picks a message to send
m = "01"
print("Alice's sent message =", m)

# Alice encodes her message with the appropriate quantum operations
circ.append(message[m])

# Bob measures in the Bell basis
コード例 #11
0
ファイル: hq_1_6.py プロジェクト: QCatMC/Circuits-In-Python
qubits = cq.LineQubit(0).range(2)

# create an empty circuit
circuit = cq.Circuit()

# construct a simulator to run the circuit
sim = cq.google.XmonSimulator()

#%%

## The indexing of lineQubits is such that the high-order bit (top wire) is
## index 0.

## initialize starting state to |10>
circuit.append(cq.H(qubits[0]))
circuit.append(cq.Z(qubits[0]))
circuit.append(cq.H(qubits[1]))

# solution to puzzle 1-4
circuit.append(cq.H(qubits[0]))
circuit.append(cq.Z(qubits[0]))
circuit.append(cq.H(qubits[1]))

# finish with standard measurement on both bits
circuit.append(
    [cq.MeasurementGate(key="q" + str(1 - i))(qubits[i]) for i in range(2)])

print(circuit)

#%%
コード例 #12
0
        (cirq.PhasedXPowGate(exponent=0.25, phase_exponent=0.125)(Q), True),
        (cirq.XPowGate(exponent=0.5)(Q), True),
        (cirq.YPowGate(exponent=0.25)(Q), True),
        (cirq.ZPowGate(exponent=0.125)(Q), True),
        (cirq.CZPowGate(exponent=0.5)(Q, Q2), False),
        (cirq.CZ(Q, Q2), True),
        (cirq.CNOT(Q, Q2), True),
        (cirq.SWAP(Q, Q2), False),
        (cirq.ISWAP(Q, Q2), False),
        (cirq.CCNOT(Q, Q2, Q3), True),
        (cirq.CCZ(Q, Q2, Q3), True),
        (cirq.ParallelGate(cirq.X, num_copies=3)(Q, Q2, Q3), True),
        (cirq.ParallelGate(cirq.Y, num_copies=3)(Q, Q2, Q3), True),
        (cirq.ParallelGate(cirq.Z, num_copies=3)(Q, Q2, Q3), True),
        (cirq.X(Q).controlled_by(Q2, Q3), True),
        (cirq.Z(Q).controlled_by(Q2, Q3), True),
        (cirq.ZPowGate(exponent=0.5)(Q).controlled_by(Q2, Q3), False),
    ],
)
def test_gateset(op: cirq.Operation, expected: bool):
    gs = cirq_pasqal.PasqalGateset()
    assert gs.validate(op) == expected
    assert gs.validate(cirq.Circuit(op)) == expected


@pytest.mark.parametrize(
    "op,expected",
    [
        (cirq.H(Q), True),
        (cirq.HPowGate(exponent=0.5)(Q), False),
        (cirq.PhasedXPowGate(exponent=0.25, phase_exponent=0.125)(Q), True),
コード例 #13
0
def _all_operations(q0, q1, q2, q3, q4, include_measurments=True):
    class DummyOperation(cirq.Operation, cirq.QasmConvertibleOperation,
                         cirq.CompositeOperation):
        qubits = (q0, )
        with_qubits = NotImplemented

        def known_qasm_output(self, args):
            return '// Dummy operation\n'

        def default_decompose(self):
            # Only used by test_output_unitary_same_as_qiskit
            return ()  # coverage: ignore

    class DummyCompositeOperation(cirq.Operation, cirq.CompositeOperation):
        qubits = (q0, )
        with_qubits = NotImplemented

        def default_decompose(self):
            return cirq.X(self.qubits[0])

        def __repr__(self):
            return 'DummyCompositeOperation()'

    return (
        cirq.Z(q0),
        cirq.Z(q0)**.625,
        cirq.Y(q0),
        cirq.Y(q0)**.375,
        cirq.X(q0),
        cirq.X(q0)**.875,
        cirq.H(q1),
        cirq.CZ(q0, q1),
        cirq.CZ(q0, q1)**0.25,  # Requires 2-qubit decomposition
        cirq.CNOT(q0, q1),
        cirq.CNOT(q0, q1)**0.5,  # Requires 2-qubit decomposition
        cirq.SWAP(q0, q1),
        cirq.SWAP(q0, q1)**0.75,  # Requires 2-qubit decomposition
        cirq.CCZ(q0, q1, q2),
        cirq.CCX(q0, q1, q2),
        cirq.CCZ(q0, q1, q2)**0.5,
        cirq.CCX(q0, q1, q2)**0.5,
        cirq.CSWAP(q0, q1, q2),
        cirq.ISWAP(q2, q0),  # Requires 2-qubit decomposition
        cirq.google.ExpZGate()(q3),
        cirq.google.ExpZGate(half_turns=0.75)(q3),
        cirq.google.ExpWGate(axis_half_turns=0.125, half_turns=0.25)(q1),
        cirq.google.Exp11Gate()(q0, q1),
        # Requires 2-qubit decomposition
        cirq.google.Exp11Gate(half_turns=1.25)(q0, q1),
        (
            cirq.MeasurementGate('xX')(q0),
            cirq.MeasurementGate('x_a')(q2),
            cirq.MeasurementGate('x?')(q1),
            cirq.MeasurementGate('X')(q3),
            cirq.MeasurementGate('_x')(q4),
            cirq.MeasurementGate('x_a')(q2),
            cirq.MeasurementGate('multi', (False, True))(q1, q2, q3),
        ) if include_measurments else (),
        DummyOperation(),
        DummyCompositeOperation(),
    )
コード例 #14
0
    def test_complex_pad(self):
        """Test trickier padding."""
        bit = cirq.GridQubit(0, 0)
        bit2 = cirq.GridQubit(0, 1)
        circuit = cirq.Circuit(
            cirq.X(bit)**sympy.Symbol('alpha'),
            cirq.Y(bit)**sympy.Symbol('alpha'),
            cirq.Z(bit)**sympy.Symbol('alpha'),
            cirq.XX(bit, bit2)**sympy.Symbol('alpha'))
        circuit2 = cirq.Circuit(
            cirq.X(bit)**sympy.Symbol('beta'),
            cirq.Y(bit)**sympy.Symbol('beta'),
            cirq.Z(bit)**sympy.Symbol('beta'),
            cirq.XX(bit, bit2)**sympy.Symbol('alpha'))
        circuit3 = cirq.Circuit(
            cirq.X(bit)**sympy.Symbol('alpha'),
            cirq.Y(bit)**sympy.Symbol('alpha'),
            cirq.Z(bit)**sympy.Symbol('alpha'),
            cirq.XX(bit, bit2)**sympy.Symbol('alpha'))
        inputs = util.convert_to_tensor([circuit, circuit2, circuit3])
        symbols = tf.convert_to_tensor(['alpha', 'beta', 'gamma'])
        new = tf.convert_to_tensor(['new', 'old', 'nothing'])
        res = tfq_ps_util_ops.tfq_ps_symbol_replace(inputs, symbols, new)
        output = util.from_tensor(res)

        correct_000 = cirq.Circuit(
            cirq.X(bit)**sympy.Symbol('new'),
            cirq.Y(bit)**sympy.Symbol('alpha'),
            cirq.Z(bit)**sympy.Symbol('alpha'),
            cirq.XX(bit, bit2)**sympy.Symbol('alpha'))
        correct_001 = cirq.Circuit(
            cirq.X(bit)**sympy.Symbol('alpha'),
            cirq.Y(bit)**sympy.Symbol('new'),
            cirq.Z(bit)**sympy.Symbol('alpha'),
            cirq.XX(bit, bit2)**sympy.Symbol('alpha'))
        correct_002 = cirq.Circuit(
            cirq.X(bit)**sympy.Symbol('alpha'),
            cirq.Y(bit)**sympy.Symbol('alpha'),
            cirq.Z(bit)**sympy.Symbol('new'),
            cirq.XX(bit, bit2)**sympy.Symbol('alpha'))
        correct_003 = cirq.Circuit(
            cirq.X(bit)**sympy.Symbol('alpha'),
            cirq.Y(bit)**sympy.Symbol('alpha'),
            cirq.Z(bit)**sympy.Symbol('alpha'),
            cirq.XX(bit, bit2)**sympy.Symbol('new'))

        self.assertEqual(correct_000, output[0][0][0])
        self.assertEqual(correct_001, output[0][0][1])
        self.assertEqual(correct_002, output[0][0][2])
        self.assertEqual(correct_003, output[0][0][3])

        self.assertEqual(correct_000, output[2][0][0])
        self.assertEqual(correct_001, output[2][0][1])
        self.assertEqual(correct_002, output[2][0][2])
        self.assertEqual(correct_003, output[2][0][3])

        correct_110 = cirq.Circuit(
            cirq.X(bit)**sympy.Symbol('old'),
            cirq.Y(bit)**sympy.Symbol('beta'),
            cirq.Z(bit)**sympy.Symbol('beta'),
            cirq.XX(bit, bit2)**sympy.Symbol('alpha'))
        correct_111 = cirq.Circuit(
            cirq.X(bit)**sympy.Symbol('beta'),
            cirq.Y(bit)**sympy.Symbol('old'),
            cirq.Z(bit)**sympy.Symbol('beta'),
            cirq.XX(bit, bit2)**sympy.Symbol('alpha'))
        correct_112 = cirq.Circuit(
            cirq.X(bit)**sympy.Symbol('beta'),
            cirq.Y(bit)**sympy.Symbol('beta'),
            cirq.Z(bit)**sympy.Symbol('old'),
            cirq.XX(bit, bit2)**sympy.Symbol('alpha'))
        correct_113 = cirq.Circuit()

        self.assertEqual(correct_110, output[1][1][0])
        self.assertEqual(correct_111, output[1][1][1])
        self.assertEqual(correct_112, output[1][1][2])
        self.assertEqual(correct_113, output[1][1][3])

        correct_100 = cirq.Circuit(
            cirq.X(bit)**sympy.Symbol('beta'),
            cirq.Y(bit)**sympy.Symbol('beta'),
            cirq.Z(bit)**sympy.Symbol('beta'),
            cirq.XX(bit, bit2)**sympy.Symbol('new'))
        correct_101 = cirq.Circuit()
        correct_102 = cirq.Circuit()
        correct_103 = cirq.Circuit()

        self.assertEqual(correct_100, output[1][0][0])
        self.assertEqual(correct_101, output[1][0][1])
        self.assertEqual(correct_102, output[1][0][2])
        self.assertEqual(correct_103, output[1][0][3])

        correct_220 = cirq.Circuit()
        correct_221 = cirq.Circuit()
        correct_222 = cirq.Circuit()
        correct_223 = cirq.Circuit()

        self.assertEqual(correct_220, output[2][2][0])
        self.assertEqual(correct_221, output[2][2][1])
        self.assertEqual(correct_222, output[2][2][2])
        self.assertEqual(correct_223, output[2][2][3])

        correct = cirq.Circuit()
        for i in range(3):
            for j in range(3):
                for k in range(3):
                    if i != j and (not (i == 2 and j == 0)) \
                        and (not (i == 1 and j == 0)):
                        self.assertEqual(correct, output[i][j][k])
コード例 #15
0
def optimal_givens_decomposition(
        qubits: Sequence[cirq.Qid],
        unitary: numpy.ndarray) -> Iterable[cirq.Operation]:
    r"""
    Implement a circuit that provides the unitary that is generated by
    single-particle fermion generators

    .. math::

        U(v) = exp(log(v)_{p,q}(a_{p}^{\dagger}a_{q} - a_{q}^{\dagger}a_{p})

    This can be used for implementing an exact single-body basis rotation

    Args:
        qubits: Sequence of qubits to apply the operations over.  The qubits
                should be ordered in linear physical order.
        unitary:
    """
    N = unitary.shape[0]
    right_rotations = []
    left_rotations = []
    for i in range(1, N):
        if i % 2 == 1:
            for j in range(0, i):
                # eliminate U[N - j, i - j] by mixing U[N - j, i - j],
                # U[N - j, i - j - 1] by right multiplication
                # of a givens rotation matrix in column [i - j, i - j + 1]
                gmat = givens_matrix_elements(unitary[N - j - 1, i - j - 1],
                                              unitary[N - j - 1,
                                                      i - j - 1 + 1],
                                              which='left')
                right_rotations.append((gmat.T, (i - j - 1, i - j)))
                givens_rotate(unitary,
                              gmat.conj(),
                              i - j - 1,
                              i - j,
                              which='col')
        else:
            for j in range(1, i + 1):
                # elimination of U[N + j - i, j] by mixing U[N + j - i, j] and
                # U[N + j - i - 1, j] by left multiplication
                # of a givens rotation that rotates row space
                # [N + j - i - 1, N + j - i
                gmat = givens_matrix_elements(unitary[N + j - i - 1 - 1,
                                                      j - 1],
                                              unitary[N + j - i - 1, j - 1],
                                              which='right')
                left_rotations.append((gmat, (N + j - i - 2, N + j - i - 1)))
                givens_rotate(unitary,
                              gmat,
                              N + j - i - 2,
                              N + j - i - 1,
                              which='row')

    new_left_rotations = []
    for (left_gmat, (i, j)) in reversed(left_rotations):
        phase_matrix = numpy.diag([unitary[i, i], unitary[j, j]])
        matrix_to_decompose = left_gmat.conj().T.dot(phase_matrix)
        new_givens_matrix = givens_matrix_elements(matrix_to_decompose[1, 0],
                                                   matrix_to_decompose[1, 1],
                                                   which='left')
        new_phase_matrix = matrix_to_decompose.dot(new_givens_matrix.T)

        # check if T_{m,n}^{-1}D  = D T.
        # coverage: ignore
        if not numpy.allclose(new_phase_matrix.dot(new_givens_matrix.conj()),
                              matrix_to_decompose):
            raise GivensTranspositionError("Failed to shift the phase matrix "
                                           "from right to left")
        # coverage: ignore

        unitary[i, i], unitary[j, j] = new_phase_matrix[0,
                                                        0], new_phase_matrix[1,
                                                                             1]
        new_left_rotations.append((new_givens_matrix.conj(), (i, j)))

    phases = numpy.diag(unitary)
    rotations = []
    ordered_rotations = []
    for (gmat, (i, j)) in list(reversed(new_left_rotations)) + list(
            map(lambda x: (x[0].conj().T, x[1]), reversed(right_rotations))):
        ordered_rotations.append((gmat, (i, j)))

        # if this throws the impossible has happened
        # coverage: ignore
        if not numpy.isclose(gmat[0, 0].imag, 0.0):
            raise GivensMatrixError(
                "Givens matrix does not obey our convention that all elements "
                "in the first column are real")
        if not numpy.isclose(gmat[1, 0].imag, 0.0):
            raise GivensMatrixError(
                "Givens matrix does not obey our convention that all elements "
                "in the first column are real")
        # coverage: ignore

        theta = numpy.arcsin(numpy.real(gmat[1, 0]))
        phi = numpy.angle(gmat[1, 1])
        rotations.append((i, j, theta, phi))

    for op in reversed(rotations):
        i, j, theta, phi = cast(Tuple[int, int, float, float], op)
        if not numpy.isclose(phi, 0.0):
            yield cirq.Z(qubits[j])**(phi / numpy.pi)

        yield Ryxxy(-theta).on(qubits[i], qubits[j])

    for idx, phase in enumerate(phases):
        yield cirq.Z(qubits[idx])**(numpy.angle(phase) / numpy.pi)
コード例 #16
0
def test_commutes():
    assert cirq.commutes(cirq.ZPowGate(exponent=sympy.Symbol('t')), cirq.Z)
    assert cirq.commutes(cirq.Z, cirq.Z(cirq.LineQubit(0)),
                         default=None) is None
    assert cirq.commutes(cirq.Z**0.1, cirq.XPowGate(exponent=0))
コード例 #17
0
OPERATIONS = [
    (cirq.X(Q0), X_PROTO),
    (
        cirq.Y(Q0),
        op_proto({
            'ypowgate': {
                'exponent': {
                    'float_value': 1.0
                }
            },
            'qubit_constant_index': [0],
        }),
    ),
    (
        cirq.Z(Q0),
        op_proto({
            'zpowgate': {
                'exponent': {
                    'float_value': 1.0
                }
            },
            'qubit_constant_index': [0],
        }),
    ),
    (
        cirq.XPowGate(exponent=0.125)(Q1),
        op_proto({
            'xpowgate': {
                'exponent': {
                    'float_value': 0.125
コード例 #18
0
def bernstein(error_correct=False):

    API_TOKEN = '7cf33cd2f0d7044af8518c33321fa74d7380d3ba58d08b271404e8226aa1f5490818ba86e1635f89e6c3cfbf10aa091ff04c1f5ff61f0f391ed780b4484e0b18'

    # initialize qiskit
    IBMQ.save_account(API_TOKEN)
    provider = IBMQ.load_account()
    print(provider.backends())
    backend = provider.backends.ibmq_16_melbourne

    # initialize qubits with architecture in mind
    qubits = [cirq.GridQubit(0, 5), cirq.GridQubit(1, 4),\
              cirq.GridQubit(0, 6), cirq.GridQubit(2, 5),\
              cirq.GridQubit(2, 3), cirq.GridQubit(1, 5),\
              cirq.GridQubit(3, 4), cirq.GridQubit(2, 4)]

    if error_correct:
        error_qubits = [cirq.GridQubit(3, 4), cirq.GridQubit(3, 3),\
                           cirq.GridQubit(3, 2), cirq.GridQubit(4, 3)]

    # construct circuit
    circuit = cirq.Circuit()

    # error correction setup. error correct qubit (2,3)
    if error_correct:
        circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
        circuit.append([cirq.SWAP(error_qubits[0], error_qubits[1])])
        circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
        circuit.append([cirq.SWAP(error_qubits[0], error_qubits[1])])

    # hadamards
    circuit.append([cirq.H(q) for q in qubits])

    # turn helper qubit to 1
    circuit.append([cirq.Z(qubits[7])])

    # oracle
    circuit.append([cirq.CNOT(qubits[1], qubits[7])])
    circuit.append([cirq.CNOT(qubits[3], qubits[7])])
    circuit.append([cirq.CNOT(qubits[4], qubits[7])])
    circuit.append([cirq.CNOT(qubits[6], qubits[7])])

    # hadamards
    circuit.append([cirq.H(q) for q in qubits[:-1]])

    # error detection and correction
    if error_correct:
        circuit.append([cirq.SWAP(error_qubits[2], error_qubits[1])])
        circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
        circuit.append([cirq.SWAP(error_qubits[2], error_qubits[1])])
        circuit.append([cirq.CNOT(error_qubits[1], error_qubits[2])])
        circuit.append([cirq.SWAP(error_qubits[3], error_qubits[1])])
        circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
        circuit.append([cirq.CNOT(error_qubits[0], error_qubits[1])])
        circuit.append([cirq.SWAP(error_qubits[1], error_qubits[3])])
        circuit.append(
            [cirq.measure(error_qubits[2]),
             cirq.measure(error_qubits[3])])
        circuit.append(
            [cirq.CCNOT(qubits[2], error_qubits[1], error_qubits[0])])

    # measure
    circuit.append([cirq.measure(q) for q in qubits[:-1]])

    # export to qasm
    qasm_str = circuit.to_qasm()

    # import qiskit from qasm
    qiskit_circuit = qiskitqc.from_qasm_str(qasm_str)

    # run qiskit
    transpiled = transpile(qiskit_circuit, backend)
    qobj = assemble(transpiled, backend, shots=100)
    job = backend.run(qobj)
    print(job.job_id())
    result = job.result()
    counts = result.get_counts()
    delayed_result = backend.retrieve_job(job.job_id()).result()
    delayed_counts = delayed_result.get_counts()
    print(counts)
    print(delayed_counts)

    return requests.post(url, json=job_payload)
コード例 #19
0
def test_is_supported():
    q0, q1 = cirq.GridQubit.rect(1, 2)
    assert MY_GATE_SET.is_supported(cirq.Circuit(cirq.X(q0), cirq.X(q1)))
    assert not MY_GATE_SET.is_supported(cirq.Circuit(cirq.X(q0), cirq.Z(q1)))
コード例 #20
0
 def _decompose_(self, qs):        
     for i in range(n):
         Rz = cirq.Z(qs[n]) ** (gamma * objs[i])
         yield Rz.controlled_by(qs[i])
コード例 #21
0

def test_raises_for_non_commuting_paulis():
    with pytest.raises(ValueError, match='commuting'):
        cirq.PauliSumExponential(cirq.X(q0) + cirq.Z(q0), np.pi / 2)


def test_raises_for_non_hermitian_pauli():
    with pytest.raises(ValueError, match='hermitian'):
        cirq.PauliSumExponential(cirq.X(q0) + 1j * cirq.Z(q1), np.pi / 2)


@pytest.mark.parametrize(
    'psum_exp, expected_qubits',
    (
        (cirq.PauliSumExponential(cirq.Z(q1), np.pi / 2), (q1, )),
        (
            cirq.PauliSumExponential(2j * cirq.X(q0) + 3j * cirq.Y(q2),
                                     sympy.Symbol("theta")),
            (q0, q2),
        ),
        (
            cirq.PauliSumExponential(
                cirq.X(q0) * cirq.Y(q1) + cirq.Y(q2) * cirq.Z(q3), np.pi),
            (q0, q1, q2, q3),
        ),
    ),
)
def test_pauli_sum_exponential_qubits(psum_exp, expected_qubits):
    assert psum_exp.qubits == expected_qubits
コード例 #22
0
ファイル: hq_1_10.py プロジェクト: QCatMC/Circuits-In-Python
circuit = cq.Circuit()

# construct a simulator to run the circuit
sim = cq.google.XmonSimulator()

#%%

## The indexing of lineQubits is such that the high-order bit (top wire) is
## index 0.

## initialize starting state to |11>
circuit.append([cq.X(qubits[0]), cq.X(qubits[1])])

# solution to puzzle 1-9
circuit.append([cq.H(qubits[0]), cq.H(qubits[1])])
circuit.append([cq.Z(qubits[0]), cq.Z(qubits[1])])
circuit.append([cq.H(qubits[0]), cq.H(qubits[1])])

# finish with standard measurement on both bits
circuit.append(
    [cq.MeasurementGate(key="q" + str(1 - i))(qubits[i]) for i in range(2)])

print(circuit)

#%%

# "Run" the computation 20 times.
result = sim.run(circuit, repetitions=20)

# view results
print(result)
コード例 #23
0
def test_raises_for_non_hermitian_pauli():
    with pytest.raises(ValueError, match='hermitian'):
        cirq.PauliSumExponential(cirq.X(q0) + 1j * cirq.Z(q1), np.pi / 2)
コード例 #24
0
 def noisy_operation(self, operation: 'cirq.Operation'):
     return cirq.Z(operation.qubits[0]).with_tags(ops.VirtualTag())
コード例 #25
0
 def _decompose_(self, qubits):
     a, b = qubits
     yield cirq.Z(a)
     yield cirq.S(b)
     yield cirq.X(a)
コード例 #26
0
    assert props_v2 != props
    gpe_op_id_0 = cirq.OpIdentifier(cirq.PhasedXZGate, q0)
    gpe_op_id_1 = cirq.OpIdentifier(cirq.PhasedXZGate, q1)
    assert props_v2.gate_pauli_errors[gpe_op_id_0] == expected_vals['gate_pauli_errors']
    assert props_v2.gate_pauli_errors[gpe_op_id_1] == expected_vals['gate_pauli_errors']

    fsim_op_id_0 = cirq.OpIdentifier(cirq.CZPowGate, q0, q1)
    fsim_op_id_1 = cirq.OpIdentifier(cirq.CZPowGate, q1, q0)
    assert props_v2.fsim_errors[fsim_op_id_0] == expected_vals['fsim_errors']
    assert props_v2.fsim_errors[fsim_op_id_1] == expected_vals['fsim_errors']


@pytest.mark.parametrize(
    'op',
    [
        (cirq.Z(cirq.LineQubit(0)) ** 0.3).with_tags(cirq_google.PhysicalZTag),
        cirq.PhasedXZGate(x_exponent=0.8, z_exponent=0.2, axis_phase_exponent=0.1).on(
            cirq.LineQubit(0)
        ),
    ],
)
def test_single_qubit_gates(op):
    q0 = cirq.LineQubit(0)
    props = sample_noise_properties([q0], [])
    model = NoiseModelFromGoogleNoiseProperties(props)
    circuit = cirq.Circuit(op)
    noisy_circuit = circuit.with_noise(model)
    assert len(noisy_circuit.moments) == 3
    assert len(noisy_circuit.moments[0].operations) == 1
    assert noisy_circuit.moments[0].operations[0] == op.with_tags(PHYSICAL_GATE_TAG)
コード例 #27
0
import time
import cirq
import numpy as np
from functools import reduce
q = [cirq.NamedQubit('q' + str(i)) for i in range(11)]
circuit = cirq.Circuit(cirq.Z(q[0]), cirq.H(q[9]), cirq.H(q[0]),
                       cirq.CNOT(q[9], q[10]), cirq.CNOT(q[0], q[3]),
                       cirq.CNOT(q[0], q[6]), cirq.CZ(q[0], q[3]),
                       cirq.CZ(q[0], q[6]), cirq.H(q[0]), cirq.H(q[3]),
                       cirq.H(q[6]), cirq.Z(q[0]), cirq.Z(q[3]), cirq.Z(q[6]),
                       cirq.CNOT(q[0], q[1]), cirq.CNOT(q[3], q[4]),
                       cirq.CNOT(q[6], q[7]), cirq.CNOT(q[0], q[2]),
                       cirq.CNOT(q[3], q[5]), cirq.CNOT(q[6], q[8]),
                       cirq.CZ(q[0], q[1]), cirq.CZ(q[3], q[4]),
                       cirq.CZ(q[6], q[7]), cirq.CZ(q[0], q[2]),
                       cirq.CZ(q[3], q[5]), cirq.CZ(q[6], q[8]),
                       cirq.CNOT(q[0], q[9]), cirq.measure(q[9], key='c9'),
                       cirq.H(q[0]), cirq.CNOT(q[9], q[10]),
                       cirq.measure(q[0], key='c0'), cirq.CZ(q[0], q[10]),
                       cirq.CNOT(q[10], q[1]), cirq.CNOT(q[10], q[2]),
                       cirq.CNOT(q[3], q[4]), cirq.CNOT(q[6], q[7]),
                       cirq.CNOT(q[3], q[5]), cirq.CNOT(q[6], q[8]),
                       cirq.CZ(q[10], q[1]), cirq.CZ(q[10], q[2]),
                       cirq.CZ(q[3], q[4]), cirq.CZ(q[6], q[7]),
                       cirq.CZ(q[3], q[5]), cirq.CZ(q[6], q[8]),
                       cirq.CCX(q[1], q[2], q[10]), cirq.CCX(q[5], q[4], q[3]),
                       cirq.CCX(q[8], q[7], q[6]), cirq.H(q[10]),
                       cirq.CCX(q[1], q[2], q[10]), cirq.H(q[3]), cirq.H(q[6]),
                       cirq.H(q[10]), cirq.CCX(q[5], q[4], q[3]),
                       cirq.CCX(q[8], q[7], q[6]), cirq.H(q[10]), cirq.H(q[3]),
                       cirq.H(q[6]), cirq.Z(q[10]), cirq.H(q[3]), cirq.H(q[6]),
コード例 #28
0
def prepare_multiplexed(states,
                        control_qubits,
                        target_qubit,
                        GRAY_CODE=True,
                        REVERSE_ZS=True):
    assert len(states) == 2**len(control_qubits)
    assert all(abs(np.linalg.norm(state) - 1.0) < 1e-6 for state in states)
    n = len(control_qubits)

    thetas = [2 * np.arccos(state[0].real) / np.pi for state in states]
    phis = [np.angle(state[1]) / np.pi for state in states]

    circuit = cirq.Circuit()

    if GRAY_CODE:
        # Loading Gray code in bs
        bs = [[0]]
        nums = [0]
        for i in range(n):
            bs = [[0] + b for b in bs] + [[1] + b for b in reversed(bs)]
            nums += [x + 2**i for x in reversed(nums)]
    else:
        # Loading regular order of bitstrings in bs
        bs = [tuple(map(int, f"{i:0{n}b}")) for i in range(2**n)]
        nums = list(range(2**n))

    if REVERSE_ZS:
        # Implement multiplexed Ry
        for b, c in zip(bs[:-1], bs[1:]):
            theta = (sum((-1)**sum(x * y for x, y in zip(b, d)) * thetas[j]
                         for j, d in zip(nums, bs)) / 2**n)
            circuit.append(cirq.Y(target_qubit)**theta)
            circuit.append(
                cirq.CNOT(control_qubits[j], target_qubit)
                for j, (x, y) in enumerate(zip(b, c)) if x != y)
        b = bs[-1]
        theta = (sum((-1)**sum(x * y for x, y in zip(b, d)) * thetas[j]
                     for j, d in enumerate(bs)) / 2**n)
        circuit.append(cirq.Y(target_qubit)**theta)

        # Implement reverse of multiplexed Rz
        phi = (sum((-1)**sum(x * y for x, y in zip(b, d)) * phis[j]
                   for j, d in zip(nums, bs)) / 2**n)
        circuit.append(cirq.Z(target_qubit)**phi)
        for c, b in zip(bs[-1:0:-1], bs[-2::-1]):
            circuit.append(
                cirq.CNOT(control_qubits[j], target_qubit)
                for j, (x, y) in enumerate(zip(b, c)) if x != y)
            phi = (sum((-1)**sum(x * y for x, y in zip(b, d)) * phis[j]
                       for j, d in zip(nums, bs)) / 2**n)
            circuit.append(cirq.Z(target_qubit)**phi)
    else:
        # Implement multiplexed Ry
        for b, c in zip(bs, bs[1:] + [bs[0]]):
            theta = (sum((-1)**sum(x * y for x, y in zip(b, d)) * thetas[j]
                         for j, d in zip(nums, bs)) / 2**n)
            circuit.append(cirq.Y(target_qubit)**theta)
            circuit.append(
                cirq.CNOT(control_qubits[j], target_qubit)
                for j, (x, y) in enumerate(zip(b, c)) if x != y)

        # Implement multiplexed Rz
        for b, c in zip(bs, bs[1:] + [bs[0]]):
            phi = (sum((-1)**sum(x * y for x, y in zip(b, d)) * phis[j]
                       for j, d in zip(nums, bs)) / 2**n)
            circuit.append(cirq.Z(target_qubit)**phi)
            circuit.append(
                cirq.CNOT(control_qubits[j], target_qubit)
                for j, (x, y) in enumerate(zip(b, c)) if x != y)

    return circuit
コード例 #29
0
def test_group_settings_greedy_hydrogen():
    qubits = cirq.LineQubit.range(4)
    q0, q1, q2, q3 = qubits
    terms = [
        0.1711977489805745 * cirq.Z(q0),
        0.17119774898057447 * cirq.Z(q1),
        -0.2227859302428765 * cirq.Z(q2),
        -0.22278593024287646 * cirq.Z(q3),
        0.16862219157249939 * cirq.Z(q0) * cirq.Z(q1),
        0.04532220205777764 * cirq.Y(q0) * cirq.X(q1) * cirq.X(q2) *
        cirq.Y(q3),
        -0.0453222020577776 * cirq.Y(q0) * cirq.Y(q1) * cirq.X(q2) *
        cirq.X(q3),
        -0.0453222020577776 * cirq.X(q0) * cirq.X(q1) * cirq.Y(q2) *
        cirq.Y(q3),
        0.04532220205777764 * cirq.X(q0) * cirq.Y(q1) * cirq.Y(q2) *
        cirq.X(q3),
        0.12054482203290037 * cirq.Z(q0) * cirq.Z(q2),
        0.16586702409067802 * cirq.Z(q0) * cirq.Z(q3),
        0.16586702409067802 * cirq.Z(q1) * cirq.Z(q2),
        0.12054482203290037 * cirq.Z(q1) * cirq.Z(q3),
        0.1743484418396392 * cirq.Z(q2) * cirq.Z(q3),
    ]
    settings = cirq.work.observables_to_settings(terms, qubits)
    grouped_settings = cirq.work.group_settings_greedy(settings)
    assert len(grouped_settings) == 5

    group_max_obs_should_be = [
        cirq.Y(q0) * cirq.X(q1) * cirq.X(q2) * cirq.Y(q3),
        cirq.Y(q0) * cirq.Y(q1) * cirq.X(q2) * cirq.X(q3),
        cirq.X(q0) * cirq.X(q1) * cirq.Y(q2) * cirq.Y(q3),
        cirq.X(q0) * cirq.Y(q1) * cirq.Y(q2) * cirq.X(q3),
        cirq.Z(q0) * cirq.Z(q1) * cirq.Z(q2) * cirq.Z(q3),
    ]
    group_max_settings_should_be = cirq.work.observables_to_settings(
        group_max_obs_should_be, qubits)

    assert set(grouped_settings.keys()) == set(group_max_settings_should_be)
    groups = list(grouped_settings.values())
    assert len(groups[0]) == 1
    assert len(groups[1]) == 1
    assert len(groups[2]) == 1
    assert len(groups[3]) == 1
    assert len(groups[4]) == len(terms) - 4
コード例 #30
0
ファイル: _gate.py プロジェクト: 00mjk/z-quantum-core
    def to_cirq(self, input_cirq_qubits=None):
        """Convert to a cirq gate.

        Args:
            input_cirq_qubits: list[cirq.LineQubit]
                (optional) a list of cirq Qubits that the gate can act on. If not provided
                the function will generate new cirq.LineQubit objects.
        Returns:
        A cirq Circuit object that corresponds to the specification of the quantum gate.
            In the special case the gate itself was natively generated from cirq, the function
            will faithfully reproduce the original GateOperation object, taking into account
            whether the gate acts on GridQubit objects or LineQubit objects.
            In the other cases the resulting cirq gate simply assumes that the qubits are
            LineQubit objects.
        """

        if self.name not in ALL_GATES:
            sys.exit("Gate {} currently not supported.".format(self.name))

        q_inds = []
        q_inds.append(self.qubits[0].index)
        if len(self.qubits) >= 2:
            q_inds.append(self.qubits[1].index)
        if len(self.qubits) >= 3:
            q_inds.append(self.qubits[2].index)

        cirq_qubits = []
        if input_cirq_qubits == None:
            for q in self.qubits:
                if q.info["label"] == "cirq":
                    qkey = q.info["QubitKey"]
                    if q.info["QubitType"] == "GridQubit":
                        cirq_qubits.append(cirq.GridQubit(qkey[0], qkey[1]))
                    if q.info["QubitType"] == "LineQubit":
                        cirq_qubits.append(cirq.LineQubit(qkey))
                else:
                    cirq_qubits.append(cirq.LineQubit(q.index))
        else:
            cirq_qubits = [
                input_cirq_qubits[x] for x in [q.index for q in self.qubits]
            ]

        if len(self.params) > 0:
            params = self.params

        # single-qubit gates
        if self.name == "I":  # Identity
            return cirq.I(cirq_qubits[0])
        if self.name == "X":  # Pauli X
            return cirq.X(cirq_qubits[0])
        if self.name == "Y":  # Pauli Y
            return cirq.Y(cirq_qubits[0])
        if self.name == "Z":  # Pauli Z
            return cirq.Z(cirq_qubits[0])
        if self.name == "H":  # Hadamard
            return cirq.H(cirq_qubits[0])
        if self.name == "S":  # S gate
            return cirq.S(cirq_qubits[0])
        if self.name == "T":  # T gate
            return cirq.T(cirq_qubits[0])
        if self.name == "Rx":  # Single-qubit X rotation
            return cirq.rx(params[0])(cirq_qubits[0])
        if self.name == "Ry":  # Single-qubit Y rotation
            return cirq.ry(params[0])(cirq_qubits[0])
        if self.name == "Rz":  # Single-qubit Z rotation
            return cirq.rz(params[0])(cirq_qubits[0])
        if self.name == "PHASE":  # Phase gate
            return cirq.Z(cirq_qubits[0])**(params[0] / pi)
        if self.name == "ZXZ":  # PhasedXPowGate gate
            g = cirq.PhasedXPowGate(phase_exponent=params[0] / pi,
                                    exponent=params[1] / pi)
            return g(cirq_qubits[0])
        if self.name == "RH":  # HPowGate
            g = cirq.H**(params[0] / pi)
            return g(cirq_qubits[0])
        if self.name == "Da":  # Damping alpha gate
            g = DampingAlpha(params[0])
            return g(cirq_qubits[0])
        if self.name == "Db":  # Damping beta gate
            g = DampingBeta(params[0])
            return g(cirq_qubits[0])

        # two-qubit gates
        if self.name == "CNOT":
            return cirq.CNOT(cirq_qubits[0], cirq_qubits[1])
        if self.name == "CZ":
            return cirq.CZ(cirq_qubits[0], cirq_qubits[1])
        if self.name == "CPHASE":
            return cirq.CZPowGate(exponent=params[0] / pi)(cirq_qubits[0],
                                                           cirq_qubits[1])
        if self.name == "SWAP":
            return cirq.SWAP(cirq_qubits[0], cirq_qubits[1])
        if self.name == "XX":
            return cirq.XX(cirq_qubits[0],
                           cirq_qubits[1])**(params[0] * 2 / pi)
        if self.name == "YY":
            return cirq.YY(cirq_qubits[0],
                           cirq_qubits[1])**(params[0] * 2 / pi)
        if self.name == "ZZ":
            return cirq.ZZ(cirq_qubits[0],
                           cirq_qubits[1])**(params[0] * 2 / pi)