25 from mpi4py
import MPI
26 from PyQNLPSimulator
import PyQNLPSimulator
as p
29 from QNLP
import DisCoCat
38 from itertools
import product
42 rank = comm.Get_rank()
44 NUM_BASIS_NOUN = int(os.environ[
'NUM_BASIS_NOUN'])
45 NUM_BASIS_VERB = int(os.environ[
'NUM_BASIS_VERB'])
47 BASIS_NOUN_DIST_CUTOFF = int(os.environ[
'BASIS_NOUN_DIST_CUTOFF'])
48 BASIS_VERB_DIST_CUTOFF = int(os.environ[
'BASIS_VERB_DIST_CUTOFF'])
50 VERB_NOUN_DIST_CUTOFF = int(os.environ[
'VERB_NOUN_DIST_CUTOFF'])
56 BASIS_NOUN_DIST_CUTOFF = 2
57 BASIS_VERB_DIST_CUTOFF = 2
58 VERB_NOUN_DIST_CUTOFF = 2
69 s_encoder = simple.SimpleEncoder(num_nouns=NUM_BASIS_NOUN, num_verbs=NUM_BASIS_VERB)
70 assert (len(sys.argv) > 1)
72 corpus_file=sys.argv[1]
74 if not os.path.isfile(corpus_file):
75 print (
"Error: Inputted file does not exist")
78 vsm = q.VectorSpaceModel.VectorSpaceModel(
79 corpus_path=corpus_file,
89 basis = vsm.define_basis({
'verbs' : NUM_BASIS_VERB,
'nouns' : NUM_BASIS_NOUN})
100 verb_dist = vsm.sort_basis_tokens_by_dist(
"verbs", num_basis=NUM_BASIS_VERB)
101 noun_dist = vsm.sort_basis_tokens_by_dist(
"nouns", num_basis=NUM_BASIS_NOUN)
113 vsm.assign_indexing(
"nouns");
114 vsm.assign_indexing(
"verbs");
127 dcc = DisCoCat.DisCoCat()
128 mapping_verbs = dcc.map_to_basis(vsm.tokens[
'verbs'] , verb_dist[
'verbs'], basis_dist_cutoff=BASIS_VERB_DIST_CUTOFF)
129 mapping_nouns = dcc.map_to_basis(vsm.tokens[
'nouns'] , noun_dist[
'nouns'], basis_dist_cutoff=BASIS_NOUN_DIST_CUTOFF)
179 encoding_dict = {
"ns" : vsm.encoded_tokens[
"nouns"],
180 "v" : vsm.encoded_tokens[
"verbs"],
181 "no" : vsm.encoded_tokens[
"nouns"]
184 decoding_dict = {
"ns" : { v:k
for k,v
in encoding_dict[
"ns"].items() },
185 "v" : { v:k
for k,v
in encoding_dict[
"v"].items() },
186 "no" : { v:k
for k,v
in encoding_dict[
"no"].items() }
193 len_reg_memory = q.encoding.utils.pow2bits( int(np.max( list(encoding_dict[
'v'].values()))) )[1] + \
194 q.encoding.utils.pow2bits( int(np.max( list(encoding_dict[
'no'].values()))) )[1] + \
195 q.encoding.utils.pow2bits( int(np.max( list(encoding_dict[
'ns'].values()))) )[1]
197 len_reg_aux = len_reg_memory + 2
198 num_qubits = len_reg_memory + len_reg_aux
201 Requires {} qubits to encode data using {} 202 noun and {} verb basis elements, allowing a 203 maximum of {} unique patterns. 205 """.format(
"#"*48, num_qubits, NUM_BASIS_NOUN, NUM_BASIS_VERB, (NUM_BASIS_NOUN**2)*NUM_BASIS_VERB,
"#"*48)
216 bit_shifts = [i[1]
for i
in q.utils.get_type_offsets(encoding_dict)]
219 bit_shifts.insert(0,0)
220 bit_shifts = np.cumsum(bit_shifts)
223 corpus_list_n = vsm.tokens[
'nouns']
224 corpus_list_v = vsm.tokens[
'verbs']
225 dist_cutoff = BASIS_VERB_DIST_CUTOFF
227 v_list = vg.calc_verb_noun_pairings(corpus_list_v, corpus_list_n, VERB_NOUN_DIST_CUTOFF)
232 for i
in v.lr_nouns.keys():
235 if mapping_nouns[i[0]] !=
None and mapping_verbs[v.verb] !=
None and mapping_nouns[i[1]] !=
None:
237 [ {i[0] : [encoding_dict[
'ns'][k]
for k
in mapping_nouns[i[0]].keys()] },
238 {v.verb : [encoding_dict[
'v'][k]
for k
in mapping_verbs[v.verb].keys()] },
239 {i[1] : [encoding_dict[
'no'][k]
for k
in mapping_nouns[i[1]].keys()] }
243 print(
"Sentences matching noun-verb-noun structure captured as:", sentences)
248 reg_memory = [0]*len_reg_memory;
249 for i
in range(len_reg_memory):
250 reg_memory[i] = i + len_reg_aux
252 reg_aux = [0]*len_reg_aux
253 for i
in range(len_reg_aux-2):
257 print(
"REG_MEM=",reg_memory)
258 print(
"REG_AUX=",reg_aux)
265 for idx,sentence
in enumerate(sentences):
266 superpos_patterns = list( product( list(sentence[0].values())[0], list(sentence[1].values())[0], list(sentence[2].values())[0] ) )
268 for patt
in superpos_patterns:
269 num = q.utils.encode_binary_pattern_direct(patt, encoding_dict)
270 vec_to_encode.extend([num])
273 vec_to_encode = list(set(vec_to_encode))
276 d ={
"sentences" : len(sentences),
277 "patterns" : len(vec_to_encode),
278 "NUM_BASIS_NOUN" : NUM_BASIS_NOUN,
279 "NUM_BASIS_VERB" : NUM_BASIS_VERB,
280 "BASIS_NOUN_DIST_CUTOFF" : BASIS_NOUN_DIST_CUTOFF,
281 "BASIS_VERB_DIST_CUTOFF" : BASIS_VERB_DIST_CUTOFF,
282 "VERB_NOUN_DIST_CUTOFF" : VERB_NOUN_DIST_CUTOFF
285 print(
"Encoding data:", vec_to_encode)
290 for i
in vec_to_encode:
291 shot_counter.update({i : 0})
298 len_reg_memory =
None 302 reg_memory = comm.bcast(reg_memory, root=0)
303 reg_aux = comm.bcast(reg_aux, root=0)
304 vec_to_encode = comm.bcast(vec_to_encode, root=0)
305 shot_counter = comm.bcast(shot_counter, root=0)
307 num_qubits = len(reg_memory) + len(reg_aux)
312 if os.environ.get(
'RESOURCE_EST')
is not None:
313 print(
"Overriding default qubit count")
316 sim = p(num_qubits, use_fusion)
321 num_exps = int(sys.argv[2])
322 except Exception
as e:
325 pbar = tqdm(total=num_exps)
330 num_exps=comm.bcast(num_exps, root=0)
336 test_string = (
'hatter',
'say',
'queen')
337 test_pattern = q.utils.encode_binary_pattern(test_string, encoding_dict)
339 print(
"Test string: {} pattern: {}".format(test_string, test_pattern))
343 test_pattern=comm.bcast(test_pattern, root=0)
346 for exp
in range(num_exps):
350 print(
"Encoding {} patterns for experiment {} of {}".format(len(vec_to_encode), exp+1, num_exps))
354 sim.encodeBinToSuperpos_unique(reg_memory, reg_aux, vec_to_encode, len(reg_memory))
357 sim.applyHammingDistanceRotY(test_pattern, reg_memory, reg_aux, len(reg_memory))
360 sim.collapseToBasisZ(reg_aux[len(reg_aux)-2], 1)
362 val = sim.applyMeasurementToRegister(reg_memory, normalise)
365 shot_counter[val] += 1
366 except Exception
as e:
367 print(
"Measured pattern {} does not match data for experiment {} of {}. Discarding.".format(val, exp+1, num_exps), file=sys.stderr)
374 print(
"Measured pattern {} for experiment {} of {}".format(val, exp+1, num_exps))
380 print(
"#"*48,
"Shot counter values")
382 print (
"Number of faults: {}".format(num_faults))
385 shot_counter_s = [ (k,v)
for k, v
in sorted(shot_counter.items(), key=
lambda item: item[1], reverse=
True)]
387 key_order = [i[0]
for i
in shot_counter_s]
389 xlab_str = [q.utils.decode_binary_pattern(i, decoding_dict)
for i
in key_order]
390 xlab_bin = [
"{0:0{num_bits}b}".format(i, num_bits=len_reg_memory)
for i
in key_order ]
392 pattern_dict = {k:v
for k,v
in zip(xlab_str, xlab_bin)}
393 pattern_count = {k:v
for k,v
in zip(xlab_str, [shot_counter[i]
for i
in key_order])}
395 print(
"#"*48,
"Shot counter values key to token state")
397 print(
"#"*48,
"Token state counts")
400 import matplotlib
as mpl
402 import matplotlib.pyplot
as plt
415 post_vals = [i[1]
for i
in shot_counter_s]
417 pv_sum = np.sum(list(shot_counter.values()))
418 hist_list_hamCl = list(zip(
419 [
",".join(i[0]) +
r" "+ str(q.utils.HammingInt(test_pattern, int(i[1],2)))
for i
in zip(xlab_str,xlab_bin)],
420 [i/pv_sum
for i
in post_vals]
422 labelsHCL = [x[0]
for x
in hist_list_hamCl]
424 x = np.arange(len(labels))
427 fig, ax = plt.subplots()
429 rects2 = ax.bar(x + width/2, post_vals, width, label=
'Measurement')
431 test_pattern_str = q.utils.decode_binary_pattern(test_pattern, decoding_dict)
432 print(
"Test pattern={}".format(test_pattern_str))
435 ax.set_ylabel(
r"P({})".format(test_pattern_str),fontsize=24)
437 ax.tick_params(axis=
'both', which=
'major', labelsize=10)
438 ax.set_xticklabels(labels, rotation=-35, ha=
"left",fontsize=10)
439 ax.legend(fontsize=16)
441 plt.axhline(y=1.0/len(shot_counter), color=
'crimson', linestyle=
"--")
442 plt.text(len(shot_counter)-0.1, 1.0/(len(shot_counter)),
'1/sqrt(n)', horizontalalignment=
'left', verticalalignment=
'center', fontsize=16)
444 fig.set_size_inches(20, 12, forward=
True)
445 plt.savefig(
"qnlp_e2e.pdf")
449 fig, ax = plt.subplots()
451 rects2 = ax.bar(x + width/2, post_vals, width, label=
'Measurement')
454 ax.set_ylabel(
r"P({})".format(test_pattern_str),fontsize=24)
456 ax.tick_params(axis=
'both', which=
'major', labelsize=10)
457 ax.set_xticklabels(labelsHCL, rotation=-35, ha=
"left",fontsize=10)
458 ax.legend(fontsize=16)
460 plt.axhline(y=1.0/len(shot_counter), color=
'crimson', linestyle=
"--")
461 plt.text(len(shot_counter)-0.1, 1.0/(len(shot_counter)),
'1/sqrt(n)', horizontalalignment=
'left', verticalalignment=
'center', fontsize=16)
463 fig.set_size_inches(20, 12, forward=
True)
464 plt.savefig(
"qnlp_e2e_ham.pdf")
471 data = {
"key_order" : key_order,
"xlab_str" : xlab_str,
"xlab_bin" : xlab_bin,
"pattern_dict":pattern_dict,
"pattern_count":pattern_count,
"shot_counter" : shot_counter,
"encoding_dict":encoding_dict,
"decoding_dict" : decoding_dict}
472 f = open(
"qnlp_e2e_{}.pkl".format(test_pattern_str),
"wb")