def assert_permute_consistent(gate):
    gate = gate.__copy__()
    n_qubits = gate.num_qubits()
    qubits = cirq.LineQubit.range(n_qubits)
    for pos in itertools.permutations(range(n_qubits)):
        permuted_gate = gate.__copy__()
        gate.permute(pos)
        assert permuted_gate.permuted(pos) == gate
        actual_unitary = cirq.unitary(permuted_gate)

        ops = [
            cca.LinearPermutationGate(n_qubits, dict(zip(range(n_qubits),
                                                         pos)),
                                      ofc.FSWAP)(*qubits),
            gate(*qubits),
            cca.LinearPermutationGate(n_qubits, dict(zip(pos,
                                                         range(n_qubits))),
                                      ofc.FSWAP)(*qubits)
        ]
        circuit = cirq.Circuit(ops)
        expected_unitary = cirq.unitary(circuit)
        assert np.allclose(actual_unitary, expected_unitary)

    with pytest.raises(ValueError):
        gate.permute(range(1, n_qubits))
    with pytest.raises(ValueError):
        gate.permute([1] * n_qubits)
def test_linear_permutation_gate_pow_not_implemented():
    permutation_gate = cca.LinearPermutationGate(3, {0: 1, 1: 2, 2: 0})

    assert permutation_gate.__pow__(0) is NotImplemented
    assert permutation_gate.__pow__(2) is NotImplemented
    assert permutation_gate.__pow__(-2) is NotImplemented
    assert permutation_gate.__pow__(0.5) is NotImplemented
    assert permutation_gate.__pow__(-0.5) is NotImplemented
def test_linear_permutation_gate_equality(permutation_sets):
    swap_gates = [cirq.SWAP, cirq.CNOT]
    equals_tester = ct.EqualsTester()
    for swap_gate in swap_gates:
        for permutation_set in permutation_sets:
            equals_tester.add_equality_group(
                *(cca.LinearPermutationGate(10, permutation, swap_gate)
                  for permutation in permutation_set))
Exemple #4
0
def test_executor_random(
    num_qubits: int, acquaintance_size: int, gates: Dict[Tuple[cirq.Qid, ...], cirq.Gate]
):
    qubits = cirq.LineQubit.range(num_qubits)
    circuit = cca.complete_acquaintance_strategy(qubits, acquaintance_size)

    logical_circuit = cirq.Circuit([g(*Q) for Q, g in gates.items()])
    expected_unitary = logical_circuit.unitary()

    initial_mapping = {q: q for q in qubits}
    final_mapping = cca.GreedyExecutionStrategy(gates, initial_mapping)(circuit)
    permutation = {q.x: qq.x for q, qq in final_mapping.items()}
    circuit.append(cca.LinearPermutationGate(num_qubits, permutation)(*qubits))
    actual_unitary = circuit.unitary()

    np.testing.assert_allclose(actual=actual_unitary, desired=expected_unitary, verbose=True)
Exemple #5
0
def test_linear_permutation_gate(n_elements, n_permuted):
    qubits = cirq.LineQubit.range(n_elements)
    elements = tuple(range(n_elements))
    elements_to_permute = random.sample(elements, n_permuted)
    permuted_elements = random.sample(elements_to_permute, n_permuted)
    permutation = {e: p for e, p in
                   zip(elements_to_permute, permuted_elements)}
    cca.PermutationGate.validate_permutation(permutation, n_elements)
    gate = cca.LinearPermutationGate(n_elements, permutation)
    ct.assert_equivalent_repr(gate)
    assert gate.permutation() == permutation
    mapping = dict(zip(qubits, elements))
    for swap in cirq.flatten_op_tree(cirq.decompose_once_with_qubits(
            gate, qubits)):
        assert isinstance(swap, cirq.GateOperation)
        swap.gate.update_mapping(mapping, swap.qubits)
    for i in range(n_elements):
        p = permutation.get(elements[i], i)
        assert mapping.get(qubits[p], elements[i]) == i
Exemple #6
0
def test_linear_permutation_gate():
    for _ in range(20):
        n_elements = randint(5, 20)
        n_permuted = randint(0, n_elements)
        qubits = [cirq.NamedQubit(s) for s in alphabet[:n_elements]]
        elements = tuple(range(n_elements))
        elements_to_permute = sample(elements, n_permuted)
        permuted_elements = sample(elements_to_permute, n_permuted)
        permutation = {e: p for e, p in
                       zip(elements_to_permute, permuted_elements)}
        cca.PermutationGate.validate_permutation(permutation, n_elements)
        gate = cca.LinearPermutationGate(permutation)
        assert gate.permutation(n_elements) == permutation
        mapping = dict(zip(qubits, elements))
        for swap in cirq.flatten_op_tree(cirq.decompose_once_with_qubits(
                gate, qubits)):
            assert isinstance(swap, cirq.GateOperation)
            swap.gate.update_mapping(mapping, swap.qubits)
        for i in range(n_elements):
            p = permutation.get(elements[i], i)
            assert mapping.get(qubits[p], elements[i]) == i
Exemple #7
0
def permute_gate(qubits: Sequence[cirq.Qid], permutation: List[int]):
    return cca.LinearPermutationGate(
        num_qubits=len(qubits),
        permutation={i: permutation[i]
                     for i in range(len(permutation))}).on(*qubits)
def test_linear_permutation_gate_pow_inverse(num_qubits, permutation, inverse):
    permutation_gate = cca.LinearPermutationGate(num_qubits, permutation)
    inverse_gate = cca.LinearPermutationGate(num_qubits, inverse)

    assert permutation_gate**-1 == inverse_gate
    assert cirq.inverse(permutation_gate) == inverse_gate
def test_linear_permutation_gate_pow_identity(num_qubits, permutation):
    permutation_gate = cca.LinearPermutationGate(num_qubits, permutation)

    assert permutation_gate**1 == permutation_gate