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))
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)
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
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
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