pyqrack-cuda 1.49.0__tar.gz → 1.49.2__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.49.0/pyqrack_cuda.egg-info → pyqrack_cuda-1.49.2}/PKG-INFO +1 -1
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/qrack_ace_backend.py +93 -30
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2/pyqrack_cuda.egg-info}/PKG-INFO +1 -1
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/setup.py +1 -1
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/LICENSE +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/MANIFEST.in +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/Makefile +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/README.md +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyproject.toml +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/__init__.py +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/neuron_activation_fn.py +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/pauli.py +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/qrack_circuit.py +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/qrack_neuron.py +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/qrack_neuron_torch_layer.py +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/qrack_simulator.py +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/qrack_stabilizer.py +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/qrack_system/__init__.py +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/qrack_system/qrack_system.py +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/quimb_circuit_type.py +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/stats/__init__.py +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/stats/load_quantized_data.py +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/stats/quantize_by_range.py +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack_cuda.egg-info/SOURCES.txt +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack_cuda.egg-info/dependency_links.txt +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack_cuda.egg-info/not-zip-safe +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack_cuda.egg-info/requires.txt +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack_cuda.egg-info/top_level.txt +0 -0
- {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/setup.cfg +0 -0
@@ -63,13 +63,17 @@ class QrackAceBackend:
|
|
63
63
|
self.long_range_columns = long_range_columns
|
64
64
|
self._is_init = [False] * qubit_count
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
col_seq *
|
70
|
-
|
71
|
-
|
72
|
-
|
66
|
+
if long_range_columns >= self.row_length:
|
67
|
+
self._is_col_long_range = [True] * long_range_columns
|
68
|
+
else:
|
69
|
+
col_seq = [True] * long_range_columns + [False]
|
70
|
+
len_col_seq = len(col_seq)
|
71
|
+
self._is_col_long_range = (
|
72
|
+
col_seq * ((self.row_length + len_col_seq - 1) // len_col_seq)
|
73
|
+
)[: self.row_length]
|
74
|
+
if long_range_columns < self.row_length:
|
75
|
+
self._is_col_long_range[-1] = False
|
76
|
+
|
73
77
|
self._hardware_offset = []
|
74
78
|
tot_qubits = 0
|
75
79
|
for _ in range(self.col_length):
|
@@ -455,8 +459,30 @@ class QrackAceBackend:
|
|
455
459
|
|
456
460
|
lq1_lr = self._is_col_long_range[lq1 % self.row_length]
|
457
461
|
lq2_lr = self._is_col_long_range[lq2 % self.row_length]
|
462
|
+
|
463
|
+
lq1_row = lq1 // self.row_length
|
464
|
+
lq1_col = lq1 % self.row_length
|
465
|
+
lq2_row = lq2 // self.row_length
|
466
|
+
lq2_col = lq2 % self.row_length
|
467
|
+
|
468
|
+
connected_cols = []
|
469
|
+
c = (lq1_col - 1) % self.row_length
|
470
|
+
while self._is_col_long_range[c] and (len(connected_cols) < (self.row_length - 1)):
|
471
|
+
connected_cols.append(c)
|
472
|
+
c = (c - 1) % self.row_length
|
473
|
+
connected_cols.append(c)
|
474
|
+
boundary = len(connected_cols)
|
475
|
+
c = (lq1_col + 1) % self.row_length
|
476
|
+
while self._is_col_long_range[c] and (len(connected_cols) < (self.row_length - 1)):
|
477
|
+
connected_cols.append(c)
|
478
|
+
c = (c + 1) % self.row_length
|
479
|
+
connected_cols.append(c)
|
480
|
+
|
458
481
|
if lq1_lr and lq2_lr:
|
459
|
-
|
482
|
+
if lq2_col in connected_cols:
|
483
|
+
gate(self._unpack(lq1), self._unpack(lq2)[0])
|
484
|
+
else:
|
485
|
+
shadow(self._unpack(lq1)[0], self._unpack(lq2)[0])
|
460
486
|
return
|
461
487
|
|
462
488
|
self._correct(lq1)
|
@@ -479,14 +505,9 @@ class QrackAceBackend:
|
|
479
505
|
|
480
506
|
return
|
481
507
|
|
482
|
-
lq1_row = lq1 // self.row_length
|
483
|
-
lq1_col = lq1 % self.row_length
|
484
|
-
lq2_row = lq2 // self.row_length
|
485
|
-
lq2_col = lq2 % self.row_length
|
486
|
-
|
487
508
|
hq1 = None
|
488
509
|
hq2 = None
|
489
|
-
if (
|
510
|
+
if (lq2_col in connected_cols) and (connected_cols.index(lq2_col) < boundary):
|
490
511
|
if lq1_lr:
|
491
512
|
self._correct(lq2)
|
492
513
|
hq1 = self._unpack(lq1)
|
@@ -509,7 +530,7 @@ class QrackAceBackend:
|
|
509
530
|
gate([hq1[0]], hq2[0])
|
510
531
|
self._encode(lq2, hq2, False)
|
511
532
|
self._encode(lq1, hq1, True)
|
512
|
-
elif
|
533
|
+
elif lq2_col in connected_cols:
|
513
534
|
if lq1_lr:
|
514
535
|
self._correct(lq2)
|
515
536
|
hq2 = self._unpack(lq2, True)
|
@@ -532,7 +553,7 @@ class QrackAceBackend:
|
|
532
553
|
gate([hq1[0]], hq2[0])
|
533
554
|
self._encode(lq1, hq1, False)
|
534
555
|
self._encode(lq2, hq2, True)
|
535
|
-
|
556
|
+
elif lq1_col == lq2_col:
|
536
557
|
hq1 = self._unpack(lq1)
|
537
558
|
hq2 = self._unpack(lq2)
|
538
559
|
if lq1_lr:
|
@@ -551,6 +572,22 @@ class QrackAceBackend:
|
|
551
572
|
else:
|
552
573
|
gate([hq1[1]], hq2[1])
|
553
574
|
gate([hq1[2]], hq2[2])
|
575
|
+
else:
|
576
|
+
hq1 = self._unpack(lq1)
|
577
|
+
hq2 = self._unpack(lq2)
|
578
|
+
if lq1_lr:
|
579
|
+
self._correct(lq2)
|
580
|
+
self._decode(lq2, hq2)
|
581
|
+
shadow(hq1[0], hq2[0])
|
582
|
+
self._encode(lq2, hq2)
|
583
|
+
elif lq2_lr:
|
584
|
+
self._decode(lq1, hq1)
|
585
|
+
shadow(hq1[0], hq2[0])
|
586
|
+
self._encode(lq1, hq1)
|
587
|
+
else:
|
588
|
+
shadow(hq1[0], hq2[0])
|
589
|
+
shadow(hq1[1], hq2[1])
|
590
|
+
shadow(hq1[2], hq2[2])
|
554
591
|
|
555
592
|
def cx(self, lq1, lq2):
|
556
593
|
self._cpauli(lq1, lq2, False, Pauli.PauliX)
|
@@ -1050,17 +1087,43 @@ class QrackAceBackend:
|
|
1050
1087
|
"measure",
|
1051
1088
|
]
|
1052
1089
|
|
1053
|
-
#
|
1054
|
-
def
|
1055
|
-
coupling_map =
|
1056
|
-
|
1057
|
-
|
1058
|
-
|
1059
|
-
|
1060
|
-
|
1061
|
-
|
1062
|
-
|
1063
|
-
|
1064
|
-
|
1065
|
-
|
1066
|
-
|
1090
|
+
# Mostly written by Dan, but with a little help from Elara (custom OpenAI GPT)
|
1091
|
+
def get_logical_coupling_map(self):
|
1092
|
+
coupling_map = set()
|
1093
|
+
rows, cols = self.row_length, self.col_length
|
1094
|
+
|
1095
|
+
# Map each column index to its full list of logical qubit indices
|
1096
|
+
def logical_index(row, col):
|
1097
|
+
return row * cols + col
|
1098
|
+
|
1099
|
+
for col in range(cols):
|
1100
|
+
connected_cols = [col]
|
1101
|
+
c = (col - 1) % cols
|
1102
|
+
while self._is_col_long_range[c] and (len(connected_cols) < self.row_length):
|
1103
|
+
connected_cols.append(c)
|
1104
|
+
c = (c - 1) % cols
|
1105
|
+
connected_cols.append(c)
|
1106
|
+
c = (col + 1) % cols
|
1107
|
+
while self._is_col_long_range[c] and (len(connected_cols) < self.row_length):
|
1108
|
+
connected_cols.append(c)
|
1109
|
+
c = (c + 1) % cols
|
1110
|
+
connected_cols.append(c)
|
1111
|
+
|
1112
|
+
is_long = self._is_col_long_range[col]
|
1113
|
+
if is_long:
|
1114
|
+
for row in range(rows):
|
1115
|
+
a = logical_index(row, col)
|
1116
|
+
for c in connected_cols:
|
1117
|
+
for r in range(0, rows):
|
1118
|
+
b = logical_index(r, c)
|
1119
|
+
if a != b:
|
1120
|
+
coupling_map.add((a, b))
|
1121
|
+
else:
|
1122
|
+
for row in range(rows):
|
1123
|
+
a = logical_index(row, col)
|
1124
|
+
for c in connected_cols:
|
1125
|
+
for r in range(0, rows):
|
1126
|
+
b = logical_index(r, c)
|
1127
|
+
coupling_map.add((a, b))
|
1128
|
+
|
1129
|
+
return sorted(coupling_map)
|
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
|