pyqrack-cuda 1.44.23__tar.gz → 1.44.25__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/Makefile +1 -1
- {pyqrack_cuda-1.44.23/pyqrack_cuda.egg-info → pyqrack_cuda-1.44.25}/PKG-INFO +1 -1
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack/qrack_ace_backend.py +34 -24
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25/pyqrack_cuda.egg-info}/PKG-INFO +1 -1
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/setup.py +1 -1
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/LICENSE +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/MANIFEST.in +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/README.md +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyproject.toml +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack/__init__.py +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack/neuron_activation_fn.py +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack/pauli.py +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack/qrack_circuit.py +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack/qrack_neuron.py +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack/qrack_neuron_torch_layer.py +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack/qrack_simulator.py +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack/qrack_stabilizer.py +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack/qrack_system/__init__.py +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack/qrack_system/qrack_system.py +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack/quimb_circuit_type.py +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack/stats/__init__.py +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack/stats/load_quantized_data.py +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack/stats/quantize_by_range.py +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack_cuda.egg-info/SOURCES.txt +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack_cuda.egg-info/dependency_links.txt +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack_cuda.egg-info/not-zip-safe +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack_cuda.egg-info/requires.txt +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/pyqrack_cuda.egg-info/top_level.txt +0 -0
- {pyqrack_cuda-1.44.23 → pyqrack_cuda-1.44.25}/setup.cfg +0 -0
@@ -18,7 +18,7 @@ help:
|
|
18
18
|
build-deps:
|
19
19
|
ifneq ($(OS),Windows_NT)
|
20
20
|
ifeq ($(QRACK_PRESENT),)
|
21
|
-
git clone https://github.com/unitaryfund/qrack.git; cd qrack; git checkout
|
21
|
+
git clone https://github.com/unitaryfund/qrack.git; cd qrack; git checkout 065d4575ca82be0398ed726de59899c16500581f; cd ..
|
22
22
|
endif
|
23
23
|
mkdir -p qrack/build
|
24
24
|
ifeq ($(UNAME_S),Linux)
|
@@ -38,8 +38,18 @@ class QrackAceBackend:
|
|
38
38
|
col_length(int): Qubits per column.
|
39
39
|
"""
|
40
40
|
|
41
|
-
def __init__(
|
42
|
-
self
|
41
|
+
def __init__(
|
42
|
+
self,
|
43
|
+
qubit_count=1,
|
44
|
+
alternating_codes=True,
|
45
|
+
isTensorNetwork=False,
|
46
|
+
toClone=None,
|
47
|
+
):
|
48
|
+
self.sim = (
|
49
|
+
toClone.sim.clone()
|
50
|
+
if toClone
|
51
|
+
else QrackSimulator(3 * qubit_count + 1, isTensorNetwork=isTensorNetwork)
|
52
|
+
)
|
43
53
|
self._ancilla = 3 * qubit_count
|
44
54
|
self._factor_width(qubit_count)
|
45
55
|
self.alternating_codes = alternating_codes
|
@@ -130,38 +140,37 @@ class QrackAceBackend:
|
|
130
140
|
self.sim.mcx([hq[0]], hq[1])
|
131
141
|
|
132
142
|
def _correct(self, lq):
|
143
|
+
if not self._is_init[lq]:
|
144
|
+
return
|
133
145
|
# We can't use true syndrome-based error correction,
|
134
146
|
# because one of the qubits in the code is separated.
|
135
147
|
# However, we can get pretty close!
|
136
|
-
hq = self._unpack(lq)
|
137
148
|
shots = 1024
|
138
|
-
samples = self.sim.measure_shots(hq, shots)
|
139
|
-
syndrome = [0, 0, 0]
|
140
|
-
for sample in samples:
|
141
|
-
match sample:
|
142
|
-
case 1:
|
143
|
-
syndrome[0] += 1
|
144
|
-
case 2:
|
145
|
-
syndrome[1] += 1
|
146
|
-
case 4:
|
147
|
-
syndrome[2] += 1
|
148
|
-
case 6:
|
149
|
-
syndrome[0] += 1
|
150
|
-
case 5:
|
151
|
-
syndrome[1] += 1
|
152
|
-
case 3:
|
153
|
-
syndrome[2] += 1
|
154
|
-
|
155
149
|
row = lq // self.row_length
|
156
150
|
even_row = not (row & 1)
|
157
151
|
single_bit = 0
|
158
152
|
other_bits = []
|
159
|
-
if
|
153
|
+
if not self.alternating_codes or even_row:
|
160
154
|
single_bit = 2
|
161
155
|
other_bits = [0, 1]
|
162
156
|
else:
|
163
157
|
single_bit = 0
|
164
158
|
other_bits = [1, 2]
|
159
|
+
hq = self._unpack(lq)
|
160
|
+
single_bit_value = self.sim.prob(hq[single_bit])
|
161
|
+
samples = self.sim.measure_shots([hq[other_bits[0]], hq[other_bits[1]]], shots)
|
162
|
+
syndrome = [0, 0, 0]
|
163
|
+
syndrome_indices = [other_bits[1], other_bits[0]] if single_bit_value else [other_bits[0], other_bits[1]]
|
164
|
+
for sample in samples:
|
165
|
+
match sample:
|
166
|
+
case 0:
|
167
|
+
syndrome[single_bit] += single_bit_value
|
168
|
+
case 1:
|
169
|
+
syndrome[syndrome_indices[0]] += 1
|
170
|
+
case 2:
|
171
|
+
syndrome[syndrome_indices[1]] += 1
|
172
|
+
case 3:
|
173
|
+
syndrome[single_bit] += 1 - single_bit_value
|
165
174
|
|
166
175
|
max_syndrome = max(syndrome)
|
167
176
|
force_syndrome = True
|
@@ -193,6 +202,8 @@ class QrackAceBackend:
|
|
193
202
|
self.sim.force_m(self._ancilla, False)
|
194
203
|
|
195
204
|
def _correct_if_like_h(self, th, lq):
|
205
|
+
if not self._is_init[lq]:
|
206
|
+
return
|
196
207
|
while th > math.pi:
|
197
208
|
th -= 2 * math.pi
|
198
209
|
while th <= -math.pi:
|
@@ -201,7 +212,6 @@ class QrackAceBackend:
|
|
201
212
|
if not math.isclose(th, 0):
|
202
213
|
self._correct(lq)
|
203
214
|
|
204
|
-
|
205
215
|
def u(self, th, ph, lm, lq):
|
206
216
|
while ph > math.pi:
|
207
217
|
ph -= 2 * math.pi
|
@@ -242,7 +252,6 @@ class QrackAceBackend:
|
|
242
252
|
self._encode(hq)
|
243
253
|
|
244
254
|
def h(self, lq):
|
245
|
-
self._correct(lq)
|
246
255
|
hq = self._unpack(lq)
|
247
256
|
self._decode(hq)
|
248
257
|
self.sim.h(hq[0])
|
@@ -302,6 +311,8 @@ class QrackAceBackend:
|
|
302
311
|
return
|
303
312
|
|
304
313
|
if not self._is_init[lq1]:
|
314
|
+
hq1 = self._unpack(lq1)
|
315
|
+
hq2 = self._unpack(lq2)
|
305
316
|
gate([hq1[0]], hq2[0])
|
306
317
|
gate([hq1[1]], hq2[1])
|
307
318
|
gate([hq1[2]], hq2[2])
|
@@ -343,7 +354,6 @@ class QrackAceBackend:
|
|
343
354
|
gate([hq1[1]], hq2[1])
|
344
355
|
gate([hq1[2]], hq2[2])
|
345
356
|
|
346
|
-
|
347
357
|
def cx(self, lq1, lq2):
|
348
358
|
self._cpauli(lq1, lq2, False, Pauli.PauliX)
|
349
359
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|