-
Notifications
You must be signed in to change notification settings - Fork 1k
/
uniform_graph_device.py
61 lines (48 loc) · 2.3 KB
/
uniform_graph_device.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# Copyright 2018 The Cirq Developers
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import Any, Dict, Hashable, Iterable, Mapping, Optional
from cirq import devices, ops
from cirq.contrib.graph_device.graph_device import UndirectedGraphDevice, UndirectedGraphDeviceEdge
from cirq.contrib.graph_device.hypergraph import UndirectedHypergraph
def uniform_undirected_graph_device(
edges: Iterable[Iterable[ops.Qid]], edge_label: Optional[UndirectedGraphDeviceEdge] = None
) -> UndirectedGraphDevice:
"""An undirected graph device all of whose edges are the same.
Args:
edges: The edges.
edge_label: The label to apply to all edges. Defaults to None.
"""
labelled_edges: Dict[Iterable[Hashable], Any] = {frozenset(edge): edge_label for edge in edges}
device_graph = UndirectedHypergraph(labelled_edges=labelled_edges)
return UndirectedGraphDevice(device_graph=device_graph)
def uniform_undirected_linear_device(
n_qubits: int, edge_labels: Mapping[int, Optional[UndirectedGraphDeviceEdge]]
) -> UndirectedGraphDevice:
"""A uniform , undirected graph device whose qubits are arranged
on a line.
Uniformity refers to the fact that all edges of the same size have the same
label.
Args:
n_qubits: The number of qubits.
edge_labels: The labels to apply to all edges of a given size.
Raises:
ValueError: keys to edge_labels are not all at least 1.
"""
if edge_labels and (min(edge_labels) < 1):
raise ValueError(f'edge sizes {tuple(edge_labels.keys())} must be at least 1.')
device = UndirectedGraphDevice()
for arity, label in edge_labels.items():
edges = (devices.LineQubit.range(i, i + arity) for i in range(n_qubits - arity + 1))
device += uniform_undirected_graph_device(edges, label)
return device