pyqrack-cuda 1.47.0__tar.gz → 1.48.0__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.47.0/pyqrack_cuda.egg-info → pyqrack_cuda-1.48.0}/PKG-INFO +1 -1
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack/qrack_ace_backend.py +23 -45
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0/pyqrack_cuda.egg-info}/PKG-INFO +1 -1
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/setup.py +1 -1
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/LICENSE +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/MANIFEST.in +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/Makefile +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/README.md +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyproject.toml +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack/__init__.py +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack/neuron_activation_fn.py +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack/pauli.py +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack/qrack_circuit.py +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack/qrack_neuron.py +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack/qrack_neuron_torch_layer.py +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack/qrack_simulator.py +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack/qrack_stabilizer.py +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack/qrack_system/__init__.py +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack/qrack_system/qrack_system.py +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack/quimb_circuit_type.py +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack/stats/__init__.py +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack/stats/load_quantized_data.py +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack/stats/quantize_by_range.py +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack_cuda.egg-info/SOURCES.txt +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack_cuda.egg-info/dependency_links.txt +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack_cuda.egg-info/not-zip-safe +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack_cuda.egg-info/requires.txt +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/pyqrack_cuda.egg-info/top_level.txt +0 -0
- {pyqrack_cuda-1.47.0 → pyqrack_cuda-1.48.0}/setup.cfg +0 -0
@@ -34,16 +34,15 @@ class QrackAceBackend:
|
|
34
34
|
Attributes:
|
35
35
|
sim(QrackSimulator): Corresponding simulator.
|
36
36
|
alternating_codes(bool): Alternate repetition code elision by index?
|
37
|
-
recursive_stack_depth(int): How many recursive nestings?
|
38
37
|
row_length(int): Qubits per row.
|
39
38
|
col_length(int): Qubits per column.
|
39
|
+
long_range_columns(int): How many ideal rows between QEC boundary rows?
|
40
40
|
"""
|
41
41
|
|
42
42
|
def __init__(
|
43
43
|
self,
|
44
44
|
qubit_count=1,
|
45
|
-
|
46
|
-
recursive_stack_depth=1,
|
45
|
+
long_range_columns=0,
|
47
46
|
alternating_codes=True,
|
48
47
|
reverse_row_and_col=False,
|
49
48
|
isTensorNetwork=False,
|
@@ -51,62 +50,41 @@ class QrackAceBackend:
|
|
51
50
|
isBinaryDecisionTree=False,
|
52
51
|
toClone=None,
|
53
52
|
):
|
53
|
+
if long_range_columns < 0:
|
54
|
+
long_range_columns = 0
|
55
|
+
if qubit_count < 0:
|
56
|
+
qubit_count = 0
|
54
57
|
if toClone:
|
55
58
|
qubit_count = toClone.num_qubits()
|
56
|
-
|
57
|
-
if recursive_stack_depth < 1:
|
58
|
-
recursive_stack_depth = 1
|
59
|
-
if long_range_rows < 0:
|
60
|
-
long_range_rows = 0
|
59
|
+
long_range_columns = toClone.long_range_columns
|
61
60
|
|
62
|
-
self.recursive_stack_depth = recursive_stack_depth
|
63
61
|
self._factor_width(qubit_count, reverse_row_and_col)
|
64
62
|
self.alternating_codes = alternating_codes
|
63
|
+
self.long_range_columns = long_range_columns
|
65
64
|
self._is_init = [False] * qubit_count
|
66
65
|
|
67
|
-
col_seq = [False] + [True] *
|
68
|
-
|
69
|
-
self._is_col_long_range
|
70
|
-
self.row_length - len(self._is_col_long_range)
|
71
|
-
)
|
66
|
+
col_seq = [False] + [True] * long_range_columns
|
67
|
+
len_col_seq = len(col_seq)
|
68
|
+
self._is_col_long_range = (col_seq * ((self.row_length + len_col_seq - 1) // len_col_seq))[:self.row_length]
|
72
69
|
self._hardware_offset = []
|
73
70
|
tot_qubits = 0
|
74
|
-
for _ in range(self.
|
71
|
+
for _ in range(self.col_length):
|
75
72
|
for c in self._is_col_long_range:
|
76
73
|
self._hardware_offset.append(tot_qubits)
|
77
74
|
tot_qubits += 1 if c else 3
|
78
75
|
self._ancilla = tot_qubits
|
79
76
|
tot_qubits += 1
|
80
77
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
alternating_codes,
|
90
|
-
reverse_row_and_col,
|
91
|
-
isTensorNetwork,
|
92
|
-
isStabilizerHybrid,
|
93
|
-
isBinaryDecisionTree,
|
94
|
-
)
|
95
|
-
)
|
96
|
-
# This leaves an "odd-man-out" ancillary qubit.
|
97
|
-
self.sim.row_length = 3 * self.row_length
|
98
|
-
self.sim.col_length = self.col_length
|
99
|
-
else:
|
100
|
-
self.sim = (
|
101
|
-
toClone.sim.clone()
|
102
|
-
if toClone
|
103
|
-
else QrackSimulator(
|
104
|
-
tot_qubits,
|
105
|
-
isTensorNetwork=isTensorNetwork,
|
106
|
-
isStabilizerHybrid=isStabilizerHybrid,
|
107
|
-
isBinaryDecisionTree=isBinaryDecisionTree,
|
108
|
-
)
|
78
|
+
self.sim = (
|
79
|
+
toClone.sim.clone()
|
80
|
+
if toClone
|
81
|
+
else QrackSimulator(
|
82
|
+
tot_qubits,
|
83
|
+
isTensorNetwork=isTensorNetwork,
|
84
|
+
isStabilizerHybrid=isStabilizerHybrid,
|
85
|
+
isBinaryDecisionTree=isBinaryDecisionTree,
|
109
86
|
)
|
87
|
+
)
|
110
88
|
|
111
89
|
def clone(self):
|
112
90
|
return QrackAceBackend(toClone=self)
|
@@ -621,6 +599,7 @@ class QrackAceBackend:
|
|
621
599
|
self.swap(lq1, lq2)
|
622
600
|
|
623
601
|
def m(self, lq):
|
602
|
+
self._is_init[lq] = False
|
624
603
|
hq = self._unpack(lq)
|
625
604
|
if self._is_col_long_range[lq % self.row_length]:
|
626
605
|
return self.sim.m(hq[0])
|
@@ -639,19 +618,18 @@ class QrackAceBackend:
|
|
639
618
|
# but not non-locally, via entanglement.
|
640
619
|
# Collapse the other separable part toward agreement.
|
641
620
|
syndrome += self.sim.force_m(hq[single_bit], bool(syndrome))
|
642
|
-
self._is_init[lq] = False
|
643
621
|
|
644
622
|
return True if (syndrome > 1) else False
|
645
623
|
|
646
624
|
def force_m(self, lq, c):
|
647
625
|
hq = self._unpack(lq)
|
626
|
+
self._is_init[lq] = False
|
648
627
|
if self._is_col_long_range[lq % self.row_length]:
|
649
628
|
return self.sim.force_m(hq[0])
|
650
629
|
|
651
630
|
self._correct(lq)
|
652
631
|
for q in hq:
|
653
632
|
self.sim.force_m(q, c)
|
654
|
-
self._is_init[lq] = False
|
655
633
|
|
656
634
|
return c
|
657
635
|
|
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
|