pyqrack-cuda 1.44.13__tar.gz → 1.44.14__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.13/pyqrack_cuda.egg-info → pyqrack_cuda-1.44.14}/PKG-INFO +1 -1
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack/qrack_ace_backend.py +25 -5
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14/pyqrack_cuda.egg-info}/PKG-INFO +1 -1
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/setup.py +1 -1
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/LICENSE +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/MANIFEST.in +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/Makefile +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/README.md +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyproject.toml +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack/__init__.py +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack/neuron_activation_fn.py +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack/pauli.py +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack/qrack_circuit.py +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack/qrack_neuron.py +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack/qrack_neuron_torch_layer.py +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack/qrack_simulator.py +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack/qrack_stabilizer.py +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack/qrack_system/__init__.py +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack/qrack_system/qrack_system.py +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack/quimb_circuit_type.py +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack/stats/__init__.py +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack/stats/load_quantized_data.py +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack/stats/quantize_by_range.py +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack_cuda.egg-info/SOURCES.txt +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack_cuda.egg-info/dependency_links.txt +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack_cuda.egg-info/not-zip-safe +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack_cuda.egg-info/requires.txt +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/pyqrack_cuda.egg-info/top_level.txt +0 -0
- {pyqrack_cuda-1.44.13 → pyqrack_cuda-1.44.14}/setup.cfg +0 -0
@@ -120,6 +120,9 @@ class QrackAceBackend:
|
|
120
120
|
self.sim.mcx([hq[0]], hq[1])
|
121
121
|
|
122
122
|
def _correct(self, lq):
|
123
|
+
# We can't use true syndrome-based error correction,
|
124
|
+
# because one of the qubits in the code is separated.
|
125
|
+
# However, we can get pretty close!
|
123
126
|
hq = self._unpack(lq)
|
124
127
|
shots = 1024
|
125
128
|
samples = self.sim.measure_shots(hq, shots)
|
@@ -138,19 +141,36 @@ class QrackAceBackend:
|
|
138
141
|
syndrome[1] += 1
|
139
142
|
case 3:
|
140
143
|
syndrome[2] += 1
|
144
|
+
|
145
|
+
row = (hq[0] // 3) // self.row_length
|
146
|
+
even_row = not (row & 1)
|
147
|
+
single_bit = 2 if (not self.alternating_codes or even_row) else 0
|
148
|
+
|
141
149
|
max_syndrome = max(syndrome)
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
even_row = not (row & 1)
|
146
|
-
single_bit = 2 if (not self.alternating_codes or even_row) else 0
|
150
|
+
error_bit = syndrome.index(max_syndrome)
|
151
|
+
if (2 * max_syndrome) >= shots:
|
152
|
+
# There is an error.
|
147
153
|
if error_bit == single_bit:
|
154
|
+
# The stand-alone bit carries the error.
|
148
155
|
self.sim.x(hq[error_bit])
|
149
156
|
else:
|
157
|
+
# The coherent bits carry the error.
|
158
|
+
# Form their syndrome.
|
150
159
|
self.sim.mcx([hq[1]], self._ancilla)
|
151
160
|
self.sim.mcx([hq[2]], self._ancilla)
|
161
|
+
# Force the syndrome pathological
|
152
162
|
self.sim.force_m(self._ancilla, True)
|
163
|
+
# Reset the ancilla.
|
164
|
+
self.sim.x(self._ancilla)
|
165
|
+
# Correct the bit flip.
|
153
166
|
self.sim.x(hq[error_bit])
|
167
|
+
elif error_bit != single_bit:
|
168
|
+
# There is no error.
|
169
|
+
# Form the syndrome of the coherent bits.
|
170
|
+
self.sim.mcx([hq[1]], self._ancilla)
|
171
|
+
self.sim.mcx([hq[2]], self._ancilla)
|
172
|
+
# Force the syndrome non-pathological.
|
173
|
+
self.sim.force_m(self._ancilla, False)
|
154
174
|
|
155
175
|
|
156
176
|
def u(self, th, ph, lm, lq):
|
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
|
File without changes
|