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.
Files changed (29) hide show
  1. {pyqrack_cuda-1.49.0/pyqrack_cuda.egg-info → pyqrack_cuda-1.49.2}/PKG-INFO +1 -1
  2. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/qrack_ace_backend.py +93 -30
  3. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2/pyqrack_cuda.egg-info}/PKG-INFO +1 -1
  4. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/setup.py +1 -1
  5. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/LICENSE +0 -0
  6. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/MANIFEST.in +0 -0
  7. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/Makefile +0 -0
  8. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/README.md +0 -0
  9. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyproject.toml +0 -0
  10. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/__init__.py +0 -0
  11. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/neuron_activation_fn.py +0 -0
  12. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/pauli.py +0 -0
  13. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/qrack_circuit.py +0 -0
  14. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/qrack_neuron.py +0 -0
  15. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/qrack_neuron_torch_layer.py +0 -0
  16. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/qrack_simulator.py +0 -0
  17. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/qrack_stabilizer.py +0 -0
  18. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/qrack_system/__init__.py +0 -0
  19. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/qrack_system/qrack_system.py +0 -0
  20. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/quimb_circuit_type.py +0 -0
  21. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/stats/__init__.py +0 -0
  22. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/stats/load_quantized_data.py +0 -0
  23. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack/stats/quantize_by_range.py +0 -0
  24. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack_cuda.egg-info/SOURCES.txt +0 -0
  25. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack_cuda.egg-info/dependency_links.txt +0 -0
  26. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack_cuda.egg-info/not-zip-safe +0 -0
  27. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack_cuda.egg-info/requires.txt +0 -0
  28. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/pyqrack_cuda.egg-info/top_level.txt +0 -0
  29. {pyqrack_cuda-1.49.0 → pyqrack_cuda-1.49.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyqrack-cuda
3
- Version: 1.49.0
3
+ Version: 1.49.2
4
4
  Summary: pyqrack - Pure Python vm6502q/qrack Wrapper
5
5
  Home-page: https://github.com/vm6502q/pyqrack
6
6
  Author: Daniel Strano
@@ -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
- col_seq = [True] * long_range_columns + [False]
67
- len_col_seq = len(col_seq)
68
- self._is_col_long_range = (
69
- col_seq * ((self.row_length + len_col_seq - 1) // len_col_seq)
70
- )[: self.row_length]
71
- if long_range_columns < self.row_length:
72
- self._is_col_long_range[-1] = False
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
- gate(self._unpack(lq1), self._unpack(lq2)[0])
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 (lq2_row == lq1_row) and (((lq1_col + 1) % self.row_length) == lq2_col):
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 (lq1_row == lq2_row) and (((lq2_col + 1) % self.row_length) == lq1_col):
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
- else:
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
- # Provided by Elara (custom OpenAI GPT)
1054
- def generate_logical_coupling_map(self):
1055
- coupling_map = []
1056
- for y in range(self._col_length):
1057
- for x in range(self._row_length):
1058
- q = y * self._row_length + x
1059
- # Define neighbors with orbifolding
1060
- neighbors = []
1061
- neighbors.append((x + 1) % self._row_length + y * self._row_length)
1062
- neighbors.append(x + ((y + 1) % self._col_length) * self._row_length)
1063
- for nq in neighbors:
1064
- coupling_map.append([q, nq])
1065
-
1066
- return coupling_map
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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyqrack-cuda
3
- Version: 1.49.0
3
+ Version: 1.49.2
4
4
  Summary: pyqrack - Pure Python vm6502q/qrack Wrapper
5
5
  Home-page: https://github.com/vm6502q/pyqrack
6
6
  Author: Daniel Strano
@@ -7,7 +7,7 @@ from setuptools import setup
7
7
  from setuptools.command.build_py import build_py
8
8
 
9
9
 
10
- VERSION = "1.49.0"
10
+ VERSION = "1.49.2"
11
11
 
12
12
  # Read long description from README.
13
13
  README_PATH = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'README.md')
File without changes
File without changes
File without changes
File without changes
File without changes