示例#1
0
def test_shift_swap_network_gate_acquaintance_opps(left_part_lens,
                                                   right_part_lens):

    gate = cca.ShiftSwapNetworkGate(left_part_lens, right_part_lens)
    n_qubits = gate.qubit_count()
    qubits = cirq.LineQubit.range(n_qubits)
    strategy = cirq.Circuit(gate(*qubits),
                            device=cca.UnconstrainedAcquaintanceDevice)

    # actual_opps
    initial_mapping = {q: i for i, q in enumerate(qubits)}
    actual_opps = cca.get_logical_acquaintance_opportunities(
        strategy, initial_mapping)

    # expected opps
    i = 0
    sides = ('left', 'right')
    parts = {side: [] for side in sides}
    for side, part_lens in zip(sides, (left_part_lens, right_part_lens)):
        for part_len in part_lens:
            parts[side].append(set(range(i, i + part_len)))
            i += part_len

    expected_opps = set(
        frozenset(left_part | right_part) for left_part, right_part in
        itertools.product(parts['left'], parts['right']))
    assert actual_opps == expected_opps
def test_get_logical_acquaintance_opportunities(n_qubits, acquaintance_size):
    qubits = cirq.LineQubit.range(n_qubits)
    acquaintance_strategy = cca.complete_acquaintance_strategy(
        qubits, acquaintance_size)
    initial_mapping = {q: i for i, q in enumerate(qubits)}
    opps = cca.get_logical_acquaintance_opportunities(
        acquaintance_strategy, initial_mapping)
    assert opps == set(frozenset(s) for s in
                       combinations(range(n_qubits), acquaintance_size))
示例#3
0
def test_cubic_acquaintance_strategy(n_qubits):
    qubits = tuple(cirq.LineQubit.range(n_qubits))
    strategy = cca.cubic_acquaintance_strategy(qubits)
    initial_mapping = {q: i for i, q in enumerate(qubits)}
    opps = cca.get_logical_acquaintance_opportunities(strategy,
                                                      initial_mapping)
    assert set(len(opp) for opp in opps) == set([3])
    expected_opps = set(
        frozenset(ijk) for ijk in itertools.combinations(range(n_qubits), 3))
    assert opps == expected_opps
示例#4
0
def test_acquaint_part_pairs(part_lens):
    parts = []
    n_qubits = 0
    for part_len in part_lens:
        parts.append(tuple(range(n_qubits, n_qubits + part_len)))
        n_qubits += part_len
    qubits = cirq.LineQubit.range(n_qubits)
    swap_network_op = cca.SwapNetworkGate(part_lens, acquaintance_size=None)(*qubits)
    swap_network = cirq.Circuit(swap_network_op)
    initial_mapping = {q: i for i, q in enumerate(qubits)}

    actual_opps = cca.get_logical_acquaintance_opportunities(swap_network, initial_mapping)
    expected_opps = set(frozenset(s + t) for s, t in combinations(parts, 2))
    assert expected_opps == actual_opps
示例#5
0
def get_phase_sep_circuit(
    gates: LogicalGates,
    qubits: Sequence[cirq.Qid],
    initial_mapping: LogicalMapping,
    verbose: bool = True,
):
    # An acquaintance strategy containing permutation gates and acquaintance
    # opportunity gates.
    circuit = cca.complete_acquaintance_strategy(qubits, 2)
    if verbose:
        print('Circuit containing a single complete linear swap network:')
        print(circuit)
        print('\n\n')

    acquaintance_opportunities = cca.get_logical_acquaintance_opportunities(
        circuit, initial_mapping
    )
    assert set(frozenset(edge) for edge in gates) <= acquaintance_opportunities

    cca.expose_acquaintance_gates(circuit)
    if verbose:
        print('Circuit with acquaintance opportunities show explicitly:')
        print(circuit)
        print('\n\n')

    # The greedy execution strategy replaces inserts the logical gates into the
    # circuit at the first opportunity.
    execution_strategy = cca.GreedyExecutionStrategy(gates, initial_mapping)

    # The final mapping may be different from the initial one.
    # In this case, the mapping is simply reversed
    final_mapping = execution_strategy(circuit)
    for p, q in zip(qubits, reversed(qubits)):
        assert initial_mapping[p] == final_mapping[q]

    if verbose:
        print('Circuit with logical gates:')
        print(circuit)
        print('\n\n')

    # All of the operations act on adjacent qubits now
    positions = {q: x for x, q in enumerate(qubits)}
    for op in circuit.all_operations():
        p, q = op.qubits
        assert abs(positions[p] - positions[q]) == 1

    return circuit
示例#6
0
def test_quartic_paired_acquaintances(index_pairs):
    n_pairs = len(index_pairs)
    qubit_pairs = tuple(
        tuple(cirq.LineQubit(x) for x in index_pair)
        for index_pair in index_pairs)
    strategy, qubits = cca.quartic_paired_acquaintance_strategy(qubit_pairs)
    initial_mapping = {q: q.x for q in qubits}
    opps = cca.get_logical_acquaintance_opportunities(strategy,
                                                      initial_mapping)
    assert set(len(opp) for opp in opps) == set([2, 4])
    quadratic_opps = set(opp for opp in opps if len(opp) == 2)
    expected_quadratic_opps = set(
        frozenset(index_pair)
        for index_pair in itertools.combinations(range(2 * n_pairs), 2))
    assert quadratic_opps == expected_quadratic_opps
    quartic_opps = set(opp for opp in opps if len(opp) == 4)
    expected_quartic_opps = set(
        frozenset(I + J) for I, J in itertools.combinations(index_pairs, 2))
    assert quartic_opps == expected_quartic_opps