-
Notifications
You must be signed in to change notification settings - Fork 2
/
server.py
136 lines (112 loc) · 2.69 KB
/
server.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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
from flask import Flask
from qiskit import QuantumCircuit, assemble, Aer
from random import randint
app = Flask(__name__)
sim = Aer.get_backend('aer_simulator')
circuits = []
qubits = []
#get count results of circuit q
#def getCounts(q):
# result = sim.run(q).result()
# counts = result.get_counts()
# return counts
#classical binary bitstring length n
def randomBitstring(n):
bitstring = ""
for i in range(n):
x = randint(1,2)
bitstring += "0" if x==1 else "1"
return bitstring
#assigns string value (0,1,+,-) to qubit
def qubitString(a,b):
if a=="0" and b=="0":
return "0"
elif a=="1" and b=="0":
return "1"
elif a=="0" and b=="1":
return "+"
elif a=="1" and b=="1":
return "-"
# APIS to implement
# input: n
# return a, b as strings, and qubits are an array of strings
# generates a, b as random bit strings of length n, from which it generates the qubits
@app.route('/generateAlice/<int:n>')
def generateAlice(n):
# global qubits
# a = randomBitstring(n)
# b = randomBitstring(n)
a = "11111"
b = "00111"
qubits = [""]*n
for i in range(n):
q = QuantumCircuit(1,1)
circuits.append(q)
if(int(a[i])==1):
q.x(0)
if(int(b[i])==1):
q.h(0)
qubits[i] = qubitString(a[i],b[i])
print(a)
print(b)
print(qubits)
return {
"a": a,
"b": b,
"qubits": qubits
}
# index: the qubit to measure, basis: 0 for 0, 1, 1 for + , -
# measures the qubit, returns the result as a string.
@app.route('/measureQubit/<int:index>/<int:basis>')
def measureQubit(index, basis):
q = circuits[index]
print("CIRCUIT #"+str(index))
print("basis "+str(basis))
if basis==1:
q.h(0)
q.measure(0,0)
#my understanding is that we apply Hadamard again to return qubit back to original state after measuring in the +/- basis
#please correct if I am wrong
if basis==1:
q.h(0)
#run one simulation to measure
result = sim.run(q, shots=1, memory=True).result()
print(sim.run(q, shots=100).result().get_counts())
memory = result.get_memory(q)[0]
print(memory)
if basis==0:
return memory
else:
return "+" if memory=="0" else "-"
# first randomly generate b', then measures all the qubits.
# return b' as string, measurement outcome as array of strings.
def measureBob(n):
b2 = randomBitstring(n)
print(b2)
result=[""]*n
for i in range(n):
q = circuits[i]
result[i]=measureQubit(i, int(b2[i]))
print(result[i])
print(result)
return {
"b2": b2,
"result": result
}
def sendBases(isBob):
pass
# drop the list of indices from the state
def drop(indices, a, a2):
for i in reversed(range(0,len(a))):
if i in indices:
a = a[0:i]+a[i+1:]
a2 = a2[0:i]+a2[i+1:]
return {
"a": a,
"a2": a2
}
#ind = [0,1]
#print(drop(ind,"aa","bb"))
generateAlice(5)
measureBob(5)
measureBob(5)