Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
dataset_generator.py
Go to the documentation of this file.
1 import numpy as np
2 import networkx as nx
3 import pickle
4 from tqdm import tqdm
5 
6 
7 def grid_graph(n):
8  n1 = int(np.sqrt(n))
9  # assert np.sqrt(n) == n1
10 
11  G = nx.Graph()
12  G.add_nodes_from(range(n))
13  edges = []
14 
15  for i in range(n1):
16  for j in range(n1-1):
17  edges.append([i*n1+j, i*n1+j+1])
18 
19  for i in range(n1):
20  for j in range(n1-1):
21  edges.append([j*n1+i, (j+1)*n1+i])
22 
23  G.add_edges_from(edges)
24  return G
25 
26 
27 def grid8_graph(n):
28  n1 = int(np.sqrt(n))
29 
30  G = nx.Graph()
31  G.add_nodes_from(range(n))
32  edges = []
33 
34  for i in range(n1):
35  for j in range(n1-1):
36  edges.append([i*n1+j, i*n1+j+1])
37 
38  for i in range(n1):
39  for j in range(n1-1):
40  edges.append([j*n1+i, (j+1)*n1+i])
41 
42  for i in range(n1-1):
43  for j in range(n1-1):
44  edges.append([i*n1+j, (i+1)*n1+j+1])
45 
46  for i in range(n1-1):
47  for j in range(1, n1):
48  edges.append([i*n1+j, (i+1)*n1+j-1])
49 
50  # this is just to construct (4,3) grid
51  if (n - n1**2) == 3:
52  edges+=[[n-1, n-2], [n-1, n-4], [n-1, n-5], [n-2, n-3], [n-2, n-4], [n-2, n-5], [n-2, n-6],
53  [n-3, n-5], [n-3, n-6]]
54 
55  G.add_edges_from(edges)
56  return G
57 
58 
59 def grid6_graph(n):
60  n1 = int(np.sqrt(n))
61  G = grid8_graph(n)
62  G.remove_edges_from([[i, i+n1-1] for i in range(n)])
63  return G
64 
65 
66 def grid3_graph(n):
67  G = nx.Graph()
68  G.add_nodes_from(range(n))
69  edges = []
70 
71  edges.append([0,1])
72  for i in range(2,n):
73  edges.append([i-2, i])
74  edges.append([i-1, i])
75 
76  G.add_edges_from(edges)
77  return G
78 
79 
80 undirected_graphs = {
81  'grid': grid_graph,
82  '8grid': grid8_graph,
83  '6grid': grid6_graph,
84  '3grid': grid3_graph
85  }
86 
87 
89  def __init__(self, graph_type, n_vertices, factor_dist = "uniform", G = None):
90  self.name = 'GeneralBinaryMRF'
91  self.graph_type = graph_type
92  if self.graph_type == "custom":
93  self.graph = G
94  else:
95  self.graph = undirected_graphs[graph_type](n_vertices)
96  self.n_vertices = self.graph.number_of_nodes()
97  self.n_edges = self.graph.number_of_edges()
98  self.edge_list = list(self.graph.edges())
99 
100  # get the cliques
101  self.cliques = [np.sort(c).tolist() for c in nx.find_cliques(self.graph)]
102  self.clique_sizes = [len(c) for c in self.cliques]
103  # choose random factors
104  if factor_dist == "uniform":
105  self.factors = [np.random.random(size=(2**s)) * 100 + 1e-5 for s in self.clique_sizes]
106  # from the factors calculate unnormalized measures for each assignment
107  measures = []
108  for i in tqdm(range(2**self.n_vertices)):
109  assignment = np.array(list(bin(i)[2:].zfill(self.n_vertices))).astype(int)
110  m = 1
111  for j, c in enumerate(self.cliques):
112  k = 0
113  for l, v in enumerate(c):
114  k += assignment[v] * (2**l)
115  m *= self.factors[j][k]
116  measures.append(m)
117 
118  # get the target distribution by normalizing
119  self.distribution = measures/np.sum(measures)
120 
121  def save(self, path):
122  file = open(path+"/mrf.bin",'wb')
123  pickle.dump(self,file)
124  file.close()
125  self.path = path
126 
127 
128 def generate_MRF_dataset(n_nodes, graph_type, dataset_size, path = None):
129  mrf = GeneralBinaryMRF(graph_type, n_nodes)
130  mrf_samples = np.random.choice(
131  range(2**mrf.n_vertices), size=dataset_size, p=mrf.distribution
132  )
133  training_set = np.array(
134  [
135  np.array(list(format(i, "b").zfill(mrf.n_vertices))).astype(int)
136  for i in mrf_samples
137  ]
138  )
139 
140  if path is not None:
141  mrf.save(path)
142 
143  return training_set, mrf.distribution, list(nx.find_cliques(mrf.graph))
144 
145 if __name__ == "__main__":
146  n_nodes = 9
147  graph_type = "8grid"
148  dataset_size = 1000
149  saveas = "dataset.txt"
150 
151  training_set, target_distribution, _ = generate_MRF_dataset(n_nodes, graph_type, dataset_size)
152 
153  np.savetxt(saveas, training_set.astype(int))
154 
def generate_MRF_dataset(n_nodes, graph_type, dataset_size, path=None)
list edges
Definition: GQML_test.py:37
def __init__(self, graph_type, n_vertices, factor_dist="uniform", G=None)