|
12 | 12 | # See the License for the specific language governing permissions and
|
13 | 13 | # limitations under the License.
|
14 | 14 |
|
| 15 | +from itertools import product |
15 | 16 | import numpy as np
|
16 | 17 | import pytest
|
17 | 18 | import cirq
|
@@ -78,6 +79,43 @@ def test_CCNOT():
|
78 | 79 | np.testing.assert_equal(results, expected_results)
|
79 | 80 |
|
80 | 81 |
|
| 82 | +@pytest.mark.parametrize(['initial_state'], [(list(x),) for x in product([0, 1], repeat=4)]) |
| 83 | +def test_CCCX(initial_state): |
| 84 | + CCCX = cirq.CCNOT.controlled() |
| 85 | + qubits = cirq.LineQubit.range(4) |
| 86 | + |
| 87 | + circuit = cirq.Circuit() |
| 88 | + circuit.append(CCCX(*qubits)) |
| 89 | + circuit.append(cirq.measure(qubits, key='key')) |
| 90 | + |
| 91 | + final_state = initial_state.copy() |
| 92 | + final_state[-1] ^= all(final_state[:-1]) |
| 93 | + |
| 94 | + sim = cirq.ClassicalStateSimulator() |
| 95 | + results = sim.simulate(circuit, initial_state=initial_state).measurements['key'] |
| 96 | + np.testing.assert_equal(results, final_state) |
| 97 | + |
| 98 | + |
| 99 | +@pytest.mark.parametrize(['initial_state'], [(list(x),) for x in product([0, 1], repeat=3)]) |
| 100 | +def test_CSWAP(initial_state): |
| 101 | + CSWAP = cirq.SWAP.controlled() |
| 102 | + qubits = cirq.LineQubit.range(3) |
| 103 | + circuit = cirq.Circuit() |
| 104 | + |
| 105 | + circuit = cirq.Circuit() |
| 106 | + circuit.append(CSWAP(*qubits)) |
| 107 | + circuit.append(cirq.measure(qubits, key='key')) |
| 108 | + |
| 109 | + a, b, c = initial_state |
| 110 | + if a: |
| 111 | + b, c = c, b |
| 112 | + final_state = [a, b, c] |
| 113 | + |
| 114 | + sim = cirq.ClassicalStateSimulator() |
| 115 | + results = sim.simulate(circuit, initial_state=initial_state).measurements['key'] |
| 116 | + np.testing.assert_equal(results, final_state) |
| 117 | + |
| 118 | + |
81 | 119 | def test_measurement_gate():
|
82 | 120 | q0, q1 = cirq.LineQubit.range(2)
|
83 | 121 | circuit = cirq.Circuit()
|
|
0 commit comments