pyqrack-cuda 1.44.32__tar.gz → 1.44.34__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.32/pyqrack_cuda.egg-info → pyqrack_cuda-1.44.34}/PKG-INFO +1 -1
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack/qrack_ace_backend.py +42 -10
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34/pyqrack_cuda.egg-info}/PKG-INFO +1 -1
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/setup.py +1 -1
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/LICENSE +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/MANIFEST.in +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/Makefile +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/README.md +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyproject.toml +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack/__init__.py +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack/neuron_activation_fn.py +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack/pauli.py +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack/qrack_circuit.py +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack/qrack_neuron.py +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack/qrack_neuron_torch_layer.py +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack/qrack_simulator.py +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack/qrack_stabilizer.py +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack/qrack_system/__init__.py +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack/qrack_system/qrack_system.py +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack/quimb_circuit_type.py +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack/stats/__init__.py +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack/stats/load_quantized_data.py +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack/stats/quantize_by_range.py +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack_cuda.egg-info/SOURCES.txt +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack_cuda.egg-info/dependency_links.txt +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack_cuda.egg-info/not-zip-safe +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack_cuda.egg-info/requires.txt +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/pyqrack_cuda.egg-info/top_level.txt +0 -0
- {pyqrack_cuda-1.44.32 → pyqrack_cuda-1.44.34}/setup.cfg +0 -0
@@ -423,31 +423,63 @@ class QrackAceBackend:
|
|
423
423
|
|
424
424
|
def m(self, lq):
|
425
425
|
hq = self._unpack(lq)
|
426
|
+
even_row = not ((lq // self.row_length) & 1)
|
427
|
+
if not self.alternating_codes or even_row:
|
428
|
+
single_bit = 2
|
429
|
+
other_bits = [0, 1]
|
430
|
+
else:
|
431
|
+
single_bit = 0
|
432
|
+
other_bits = [1, 2]
|
426
433
|
syndrome = 0
|
427
434
|
bits = []
|
428
|
-
for q in
|
429
|
-
bits.append(self.sim.m(q))
|
435
|
+
for q in other_bits:
|
436
|
+
bits.append(self.sim.m(hq[q]))
|
430
437
|
if bits[-1]:
|
431
438
|
syndrome += 1
|
432
|
-
|
433
|
-
|
439
|
+
# single_bit never shares entanglement with other_bits.
|
440
|
+
# In the ideal, it should simply duplicate other_bits.
|
441
|
+
# So get more precision by using it analytically.
|
442
|
+
analytical = self.sim.prob(hq[single_bit])
|
443
|
+
syndrome += analytical
|
444
|
+
result = True if (syndrome >= 1.5) else False
|
445
|
+
# The two separable parts of the code are correlated,
|
446
|
+
# but not non-locally, via entanglement.
|
447
|
+
# Prefer to collapse the analytical part toward agreement.
|
448
|
+
bits.append(self.sim.m(hq[single_bit]) if math.isclose(analytical, 0 if result else 1) else self.sim.force_m(hq[single_bit], result))
|
449
|
+
for i in range(2):
|
434
450
|
if bits[i] != result:
|
435
|
-
self.sim.x(hq[i])
|
436
|
-
|
451
|
+
self.sim.x(hq[other_bits[i]])
|
452
|
+
if bits[2] != result:
|
453
|
+
self.sim.x(hq[single_bit])
|
437
454
|
self._is_init[lq] = False
|
438
455
|
|
439
456
|
return result
|
440
457
|
|
441
458
|
def m_all(self):
|
442
459
|
result = 0
|
443
|
-
|
444
|
-
|
460
|
+
# Whenever a nonzero syndrome occurs (so the code has an error),
|
461
|
+
# we insert the more-probable results and collapse towards it.
|
462
|
+
# Randomize the order of post-selection to amortize error.
|
463
|
+
lqubits = random.shuffle(list(range(self.sim.num_qubits() // 3)))
|
464
|
+
for lq in lqubits:
|
445
465
|
if self.m(lq):
|
446
|
-
result |= 1
|
466
|
+
result |= 1 << lq
|
447
467
|
|
448
468
|
return result
|
449
469
|
|
450
|
-
def measure_shots(self, q, s):
|
470
|
+
def measure_shots(self, q, s, high_accuracy=False):
|
471
|
+
if high_accuracy:
|
472
|
+
samples = []
|
473
|
+
for _ in range(s):
|
474
|
+
clone = self.sim.clone()
|
475
|
+
sample = 0
|
476
|
+
for i in range(len(q)):
|
477
|
+
if clone.m(q[i]):
|
478
|
+
sample |= 1 << i
|
479
|
+
samples.append(sample)
|
480
|
+
|
481
|
+
return samples
|
482
|
+
|
451
483
|
_q = []
|
452
484
|
for i in q:
|
453
485
|
_q.append(3 * i)
|
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
|