ket-lang 0.10.4.2.dev0__tar.gz → 0.10.4.2.dev1__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 (120) hide show
  1. {ket_lang-0.10.4.2.dev0/src/ket_lang.egg-info → ket_lang-0.10.4.2.dev1}/PKG-INFO +1 -1
  2. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/__init__.py +1 -1
  3. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/amazon.py +4 -4
  4. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/base/__init__.py +15 -0
  5. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/.gitlab-ci.yml +37 -6
  6. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/Cargo.toml +8 -3
  7. ket_lang-0.10.4.2.dev1/src/ket/clib/libs/kbw/build.rs +26 -0
  8. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/kbw.h +1 -1
  9. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/src/c_api.rs +9 -2
  10. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/src/dense_gpu/kernel.rs +38 -36
  11. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/src/dense_gpu/mod.rs +190 -63
  12. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/src/dense_v2.rs +2 -0
  13. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/src/lib.rs +36 -14
  14. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/.gitlab-ci.yml +3 -3
  15. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/c_api/process.rs +1 -1
  16. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/ir/block.rs +16 -2
  17. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/process/mod.rs +26 -1
  18. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/tests.rs +159 -0
  19. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/expv.py +4 -3
  20. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/ibm.py +6 -5
  21. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/measurement.py +4 -0
  22. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/quantumstate.py +1 -0
  23. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1/src/ket_lang.egg-info}/PKG-INFO +1 -1
  24. ket_lang-0.10.4.2.dev0/src/ket/clib/libs/kbw/build.rs +0 -7
  25. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/LICENSE +0 -0
  26. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/MANIFEST.in +0 -0
  27. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/README.md +0 -0
  28. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/pyproject.toml +0 -0
  29. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/setup.cfg +0 -0
  30. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/setup.py +0 -0
  31. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/base/qasm.py +0 -0
  32. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/base/quant.py +0 -0
  33. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/__init__.py +0 -0
  34. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/kbw.py +0 -0
  35. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libket/__init__.py +0 -0
  36. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libket/execution.py +0 -0
  37. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/__init__.py +0 -0
  38. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/.git +0 -0
  39. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/.gitignore +0 -0
  40. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/.pre-commit-config.yaml +0 -0
  41. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/CHANGELOG.md +0 -0
  42. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/LICENSE +0 -0
  43. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/LICENSES/Apache-2.0.txt +0 -0
  44. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/README.md +0 -0
  45. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/REUSE.toml +0 -0
  46. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/cbindgen.toml +0 -0
  47. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/examples/grover_batch.rs +0 -0
  48. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/examples/grover_live.rs +0 -0
  49. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/examples/grover_live_dv2.rs +0 -0
  50. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/src/bitwise.rs +0 -0
  51. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/src/block.rs +0 -0
  52. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/src/convert.rs +0 -0
  53. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/src/dense.rs +0 -0
  54. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/src/quantum_execution.rs +0 -0
  55. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/src/sparse.rs +0 -0
  56. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/kbw/src/sparse_v2.rs +0 -0
  57. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/.git +0 -0
  58. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/.gitignore +0 -0
  59. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/.pre-commit-config.yaml +0 -0
  60. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/CHANGELOG.md +0 -0
  61. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/Cargo.toml +0 -0
  62. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/LICENSE +0 -0
  63. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/LICENSES/Apache-2.0.txt +0 -0
  64. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/README.md +0 -0
  65. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/REUSE.toml +0 -0
  66. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/build.rs +0 -0
  67. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/cbindgen.toml +0 -0
  68. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/examples/grover.rs +0 -0
  69. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/examples/qft.rs +0 -0
  70. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/libket.h +0 -0
  71. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/c_api/block.rs +0 -0
  72. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/c_api/execute.rs +0 -0
  73. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/c_api/mod.rs +0 -0
  74. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/decompose/mod.rs +0 -0
  75. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/decompose/network.rs +0 -0
  76. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/decompose/su2.rs +0 -0
  77. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/decompose/u2.rs +0 -0
  78. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/decompose/util.rs +0 -0
  79. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/decompose/x/c2to4x.rs +0 -0
  80. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/decompose/x/mod.rs +0 -0
  81. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/decompose/x/single_aux.rs +0 -0
  82. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/decompose/x/v_chain.rs +0 -0
  83. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/error.rs +0 -0
  84. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/execution.rs +0 -0
  85. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/ir/gate.rs +0 -0
  86. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/ir/hamiltonian.rs +0 -0
  87. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/ir/macros.rs +0 -0
  88. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/ir/mod.rs +0 -0
  89. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/lib.rs +0 -0
  90. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/mapping/allocation.rs +0 -0
  91. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/mapping/dynamic_look_ahead.rs +0 -0
  92. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/mapping/graph.rs +0 -0
  93. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/mapping/mod.rs +0 -0
  94. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/matrix.rs +0 -0
  95. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/process/classical_shadow.rs +0 -0
  96. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/process/qwc.rs +0 -0
  97. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/qasm/ast.rs +0 -0
  98. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/qasm/executor.rs +0 -0
  99. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/qasm/gates.rs +0 -0
  100. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/qasm/mod.rs +0 -0
  101. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/libs/libket/src/qasm/openqasm.lalrpop +0 -0
  102. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/clib/wrapper.py +0 -0
  103. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/fermion.py +0 -0
  104. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/gates.py +0 -0
  105. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/gateset.py +0 -0
  106. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/mps.py +0 -0
  107. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/npsim.py +0 -0
  108. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/operations.py +0 -0
  109. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/qint.py +0 -0
  110. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/qulib/__init__.py +0 -0
  111. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/qulib/gates.py +0 -0
  112. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/qulib/ham.py +0 -0
  113. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/qulib/oracle.py +0 -0
  114. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket/qulib/prepare.py +0 -0
  115. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket_lang.egg-info/SOURCES.txt +0 -0
  116. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket_lang.egg-info/dependency_links.txt +0 -0
  117. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket_lang.egg-info/not-zip-safe +0 -0
  118. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket_lang.egg-info/requires.txt +0 -0
  119. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/src/ket_lang.egg-info/top_level.txt +0 -0
  120. {ket_lang-0.10.4.2.dev0 → ket_lang-0.10.4.2.dev1}/tests/test_fermion.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ket-lang
3
- Version: 0.10.4.2.dev0
3
+ Version: 0.10.4.2.dev1
4
4
  Summary: Ket quantum programming language interpreter and library
5
5
  Home-page: https://quantumket.org
6
6
  Author: Evandro Chagas Ribeiro da Rosa
@@ -83,7 +83,7 @@ from .fermion import *
83
83
  from .fermion import __all__ as all_fermion
84
84
  from . import qulib
85
85
 
86
- __version__ = "0.10.4.2.dev0"
86
+ __version__ = "0.10.4.2.dev1"
87
87
 
88
88
  __all__ = (
89
89
  all_base
@@ -62,6 +62,7 @@ from __future__ import annotations
62
62
  #
63
63
  # SPDX-License-Identifier: Apache-2.0
64
64
 
65
+ from collections import Counter
65
66
  from functools import reduce
66
67
  from json import loads
67
68
  from operator import add
@@ -256,10 +257,9 @@ class AmazonBraket(BatchExecution): # pylint: disable=too-many-instance-attribu
256
257
  result = self.device.run(circuit, shots=shots).result()
257
258
  aws_map = {q: i for i, q in enumerate(result.measured_qubits)}
258
259
 
259
- counts = {
260
- self._from_braket_to_ket(k, qubits_to_sample, aws_map): v
261
- for k, v in result.measurement_counts.items()
262
- }
260
+ counts = Counter()
261
+ for k, v in result.measurement_counts.items():
262
+ counts[self._from_braket_to_ket(k, qubits_to_sample, aws_map)] += v
263
263
 
264
264
  mask_64bit = (1 << 64) - 1
265
265
  num_chunks = (len(qubits_to_sample) + 63) // 64
@@ -185,6 +185,21 @@ class Process(LibketProcess): # pylint: disable=too-many-instance-attributes
185
185
  if self._blocked_qubits[q] == 0:
186
186
  del self._blocked_qubits[q]
187
187
 
188
+ def _check_not_in_block(self, operation: str):
189
+ """Raise if ``operation`` is called inside a gate-building block.
190
+
191
+ Blocks (``with around``, ``with control``, ``with inverse``, gate
192
+ functions) are only added to the circuit when they close. Measuring
193
+ or inspecting the state inside one would run before the block's
194
+ gates, giving silently wrong results.
195
+ """
196
+ if self._blocks:
197
+ raise RuntimeError(
198
+ f"Cannot call {operation} inside a gate-building block "
199
+ "(e.g., 'with around', 'with control', 'with inverse', or a "
200
+ "function used as a gate). Call it outside the block."
201
+ )
202
+
188
203
  def _get_exp_value_index(self) -> int:
189
204
  index = self._exp_value_count
190
205
  self._exp_value_count += 1
@@ -18,7 +18,7 @@ variables:
18
18
  # ---------------------------------------------------------------------------
19
19
 
20
20
  cargo-clippy:
21
- image: registry.gitlab.com/quantum-ket/ket-building-images:linux-1.97
21
+ image: registry.gitlab.com/quantum-ket/ket-building-images:linux-2.34-1.97
22
22
  stage: lint
23
23
  cache:
24
24
  - key: cargo-registry-v1
@@ -46,7 +46,7 @@ reuse:
46
46
  # ---------------------------------------------------------------------------
47
47
 
48
48
  cargo-test:
49
- image: registry.gitlab.com/quantum-ket/ket-building-images:linux-1.97
49
+ image: registry.gitlab.com/quantum-ket/ket-building-images:linux-2.34-1.97
50
50
  stage: test
51
51
  cache:
52
52
  - key: cargo-registry-v1
@@ -67,8 +67,9 @@ cargo-test:
67
67
  # Build stage
68
68
  # ---------------------------------------------------------------------------
69
69
 
70
+ # glibc >= 2.28, default features (dense + sparse).
70
71
  linux-build:
71
- image: registry.gitlab.com/quantum-ket/ket-building-images:linux-1.97
72
+ image: registry.gitlab.com/quantum-ket/ket-building-images:linux-2.28-1.97
72
73
  stage: build
73
74
  cache:
74
75
  - key: cargo-registry-v1
@@ -76,7 +77,7 @@ linux-build:
76
77
  - .cargo/registry/index/
77
78
  - .cargo/registry/cache/
78
79
  policy: pull
79
- - key: cargo-release-linux-$CI_COMMIT_REF_SLUG
80
+ - key: cargo-release-linux-2.28-$CI_COMMIT_REF_SLUG
80
81
  paths:
81
82
  - target/release/
82
83
  - target/.rustc_info.json
@@ -84,9 +85,35 @@ linux-build:
84
85
  policy: pull-push
85
86
  script:
86
87
  - cargo build --release
88
+ - cp target/release/libkbw.so libkbw.so
87
89
  artifacts:
88
90
  paths:
89
- - target/release/libkbw.so
91
+ - libkbw.so
92
+ rules:
93
+ - if: '$CI_COMMIT_BRANCH == "main"'
94
+
95
+ # glibc >= 2.34, default features + GPU (wgpu) and CUDA.
96
+ linux-gpu-build:
97
+ image: registry.gitlab.com/quantum-ket/ket-building-images:linux-2.34-1.97
98
+ stage: build
99
+ cache:
100
+ - key: cargo-registry-v1
101
+ paths:
102
+ - .cargo/registry/index/
103
+ - .cargo/registry/cache/
104
+ policy: pull
105
+ - key: cargo-release-linux-2.34-gpu-$CI_COMMIT_REF_SLUG
106
+ paths:
107
+ - target/release/
108
+ - target/.rustc_info.json
109
+ - target/CACHEDIR.TAG
110
+ policy: pull-push
111
+ script:
112
+ - cargo build --release -F gpu,cuda
113
+ - cp target/release/libkbw.so libkbw.gpu.so
114
+ artifacts:
115
+ paths:
116
+ - libkbw.gpu.so
90
117
  rules:
91
118
  - if: '$CI_COMMIT_BRANCH == "main"'
92
119
 
@@ -151,8 +178,12 @@ publish:
151
178
  script:
152
179
  - |
153
180
  curl --location --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
154
- --upload-file target/release/libkbw.so \
181
+ --upload-file libkbw.so \
155
182
  "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/kbw/${CI_COMMIT_SHORT_SHA}/libkbw.so"
183
+ - |
184
+ curl --location --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
185
+ --upload-file libkbw.gpu.so \
186
+ "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/kbw/${CI_COMMIT_SHORT_SHA}/libkbw.gpu.so"
156
187
  - |
157
188
  curl --location --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
158
189
  --upload-file target/x86_64-pc-windows-gnu/release/kbw.dll \
@@ -28,7 +28,11 @@ build-info = { version = "0.0.45", default-features = false, features = [] }
28
28
  serde = { version = "1.0.228", features = ["derive"] }
29
29
  serde_json = "1.0.150"
30
30
  num-traits = "0.2"
31
- cubecl = { version = "0.10.0", features = ["wgpu"], optional = true }
31
+ cubecl = { version = "0.11.1", optional = true }
32
+ cudarc = { version = "0.19.10", default-features = false, features = [
33
+ "cuda-13040",
34
+ "dynamic-loading",
35
+ ], optional = true }
32
36
  bimap = { version = "0.6.3", optional = true }
33
37
  pollster = { version = "1.0.1", optional = true }
34
38
  smallvec = "1.15.2"
@@ -44,8 +48,9 @@ crate-type = ["cdylib", "rlib"]
44
48
  strip = true
45
49
 
46
50
  [features]
47
- default = ["dense", "sparse", "gpu"]
48
- gpu = ["block", "cubecl", "pollster"]
51
+ default = ["dense", "sparse"]
52
+ gpu = ["block", "cubecl/wgpu", "pollster"]
53
+ cuda = ["block", "cubecl/cuda", "dep:cudarc", "pollster"]
49
54
  dense = []
50
55
  sparse = ["rustc-hash"]
51
56
  block = ["bimap"]
@@ -0,0 +1,26 @@
1
+ // SPDX-FileCopyrightText: 2024 Evandro Chagas Ribeiro da Rosa <evandro@quantuloop.com>
2
+ //
3
+ // SPDX-License-Identifier: Apache-2.0
4
+
5
+ fn main() {
6
+ build_info_build::build_script();
7
+
8
+ let mut accelerators = Vec::new();
9
+
10
+ if std::env::var("CARGO_FEATURE_GPU").is_ok() {
11
+ accelerators.push("GPU");
12
+ }
13
+
14
+ if std::env::var("CARGO_FEATURE_CUDA").is_ok() {
15
+ accelerators.push("CUDA");
16
+ }
17
+
18
+ if accelerators.is_empty() {
19
+ println!("cargo:rustc-env=KBW_ACCELERATORS=", );
20
+ } else {
21
+ println!(
22
+ "cargo:rustc-env=KBW_ACCELERATORS=[{}]",
23
+ accelerators.join(", ")
24
+ );
25
+ }
26
+ }
@@ -25,7 +25,7 @@ extern "C" {
25
25
  * * `num_qubits`: number of qubits to allocate.
26
26
  * * `simulator`: NUL-terminated C string naming the backend. Recognised
27
27
  * values (case-insensitive, whitespace ignored): `"dense"`, `"densev2"`,
28
- * `"densegpu"`, `"sparse"`, `"sparsev2"`.
28
+ * `"densegpu"`, `"densecuda"`, `"sparse"`, `"sparsev2"`.
29
29
  * * `use_live`: `true` for live (gate-by-gate) mode; `false` for batch mode.
30
30
  * * `gradient`: enable the parameter-shift-rule gradient strategy (batch
31
31
  * mode only).
@@ -23,6 +23,9 @@ use crate::{Dense, DenseV2};
23
23
  #[cfg(feature = "gpu")]
24
24
  use crate::{DenseGPU, DenseGPUBlock};
25
25
 
26
+ #[cfg(feature = "cuda")]
27
+ use crate::DenseCUDA;
28
+
26
29
  #[cfg(feature = "sparse")]
27
30
  use crate::{Sparse, SparseV2};
28
31
  use ket::{error::KetError, process::QPUConfig};
@@ -37,7 +40,7 @@ use crate::quantum_execution::QubitManager;
37
40
  /// * `num_qubits`: number of qubits to allocate.
38
41
  /// * `simulator`: NUL-terminated C string naming the backend. Recognised
39
42
  /// values (case-insensitive, whitespace ignored): `"dense"`, `"densev2"`,
40
- /// `"densegpu"`, `"sparse"`, `"sparsev2"`.
43
+ /// `"densegpu"`, `"densecuda"`, `"sparse"`, `"sparsev2"`.
41
44
  /// * `use_live`: `true` for live (gate-by-gate) mode; `false` for batch mode.
42
45
  /// * `gradient`: enable the parameter-shift-rule gradient strategy (batch
43
46
  /// mode only).
@@ -108,6 +111,10 @@ pub unsafe extern "C" fn kbw_make_configuration(
108
111
  )
109
112
  }
110
113
  }
114
+ #[cfg(feature = "cuda")]
115
+ "densecuda" => {
116
+ make_config::<DenseCUDA>(num_qubits, use_live, decompose, coupling_graph, gradient)
117
+ }
111
118
  #[cfg(feature = "sparse")]
112
119
  "sparse" => {
113
120
  make_config::<Sparse>(num_qubits, use_live, decompose, coupling_graph, gradient)
@@ -146,7 +153,7 @@ where
146
153
  }
147
154
  }
148
155
 
149
- const BUILD_INFO: &str = build_info::format!("{} v{} [{} {}]", $.crate_info.name, $.crate_info.version, $.compiler, $.target);
156
+ const BUILD_INFO: &str = build_info::format!("{} v{} {} [{} {}]", $.crate_info.name, $.crate_info.version, env!("KBW_ACCELERATORS"), $.compiler, $.target);
150
157
 
151
158
  /// Return a static string describing the KBW build.
152
159
  ///
@@ -84,8 +84,8 @@ pub(super) const fn compute_ket(
84
84
 
85
85
  #[cube(launch_unchecked)]
86
86
  pub(super) fn gate_x<F: Float>(
87
- state_real: &mut Array<F>,
88
- state_imag: &mut Array<F>,
87
+ state_real: &mut [F],
88
+ state_imag: &mut [F],
89
89
  offset: usize,
90
90
  control_mask: u32,
91
91
  half_block_size: u32,
@@ -103,20 +103,22 @@ pub(super) fn gate_x<F: Float>(
103
103
  );
104
104
 
105
105
  if ket.2 {
106
- let old0 = state_real[ket.0];
107
- state_real[ket.0] = state_real[ket.1];
108
- state_real[ket.1] = old0;
106
+ let r0 = state_real[ket.0];
107
+ let i0 = state_imag[ket.0];
108
+ let r1 = state_real[ket.1];
109
+ let i1 = state_imag[ket.1];
109
110
 
110
- let old0 = state_imag[ket.0];
111
- state_imag[ket.0] = state_imag[ket.1];
112
- state_imag[ket.1] = old0;
111
+ state_real[ket.0] = r1;
112
+ state_imag[ket.0] = i1;
113
+ state_real[ket.1] = r0;
114
+ state_imag[ket.1] = i0;
113
115
  }
114
116
  }
115
117
 
116
118
  #[cube(launch_unchecked)]
117
119
  pub(super) fn gate_y<F: Float>(
118
- state_real: &mut Array<F>,
119
- state_imag: &mut Array<F>,
120
+ state_real: &mut [F],
121
+ state_imag: &mut [F],
120
122
  offset: usize,
121
123
  control_mask: u32,
122
124
  half_block_size: u32,
@@ -150,8 +152,8 @@ pub(super) fn gate_y<F: Float>(
150
152
 
151
153
  #[cube(launch_unchecked)]
152
154
  pub(super) fn gate_z<F: Float>(
153
- state_real: &mut Array<F>,
154
- state_imag: &mut Array<F>,
155
+ state_real: &mut [F],
156
+ state_imag: &mut [F],
155
157
  offset: usize,
156
158
  control_mask: u32,
157
159
  half_block_size: u32,
@@ -176,8 +178,8 @@ pub(super) fn gate_z<F: Float>(
176
178
 
177
179
  #[cube(launch_unchecked)]
178
180
  pub(super) fn gate_h<F: Float + LaunchArg + ConstantFloat>(
179
- state_real: &mut Array<F>,
180
- state_imag: &mut Array<F>,
181
+ state_real: &mut [F],
182
+ state_imag: &mut [F],
181
183
  offset: usize,
182
184
  control_mask: u32,
183
185
  half_block_size: u32,
@@ -226,8 +228,8 @@ fn complex_mul<F: Float>(a_r: F, a_i: F, b_r: F, b_i: F) -> (F, F) {
226
228
 
227
229
  #[cube(launch_unchecked)]
228
230
  pub(super) fn gate_p<F: Float + LaunchArg>(
229
- state_real: &mut Array<F>,
230
- state_imag: &mut Array<F>,
231
+ state_real: &mut [F],
232
+ state_imag: &mut [F],
231
233
  offset: usize,
232
234
  control_mask: u32,
233
235
  half_block_size: u32,
@@ -255,8 +257,8 @@ pub(super) fn gate_p<F: Float + LaunchArg>(
255
257
 
256
258
  #[cube(launch_unchecked)]
257
259
  pub(super) fn gate_rx<F: Float + LaunchArg + ConstantFloat>(
258
- state_real: &mut Array<F>,
259
- state_imag: &mut Array<F>,
260
+ state_real: &mut [F],
261
+ state_imag: &mut [F],
260
262
  offset: usize,
261
263
  control_mask: u32,
262
264
  half_block_size: u32,
@@ -291,8 +293,8 @@ pub(super) fn gate_rx<F: Float + LaunchArg + ConstantFloat>(
291
293
 
292
294
  #[cube(launch_unchecked)]
293
295
  pub(super) fn gate_ry<F: Float + LaunchArg + ConstantFloat>(
294
- state_real: &mut Array<F>,
295
- state_imag: &mut Array<F>,
296
+ state_real: &mut [F],
297
+ state_imag: &mut [F],
296
298
  offset: usize,
297
299
  control_mask: u32,
298
300
  half_block_size: u32,
@@ -327,8 +329,8 @@ pub(super) fn gate_ry<F: Float + LaunchArg + ConstantFloat>(
327
329
 
328
330
  #[cube(launch_unchecked)]
329
331
  pub(super) fn gate_rz<F: Float + LaunchArg>(
330
- state_real: &mut Array<F>,
331
- state_imag: &mut Array<F>,
332
+ state_real: &mut [F],
333
+ state_imag: &mut [F],
332
334
  offset: usize,
333
335
  control_mask: u32,
334
336
  half_block_size: u32,
@@ -365,11 +367,11 @@ pub(super) fn gate_rz<F: Float + LaunchArg>(
365
367
 
366
368
  #[cube(launch_unchecked)]
367
369
  pub(super) fn measure_p1<F: Float>(
368
- state_real: &Array<F>,
369
- state_imag: &Array<F>,
370
+ state_real: &[F],
371
+ state_imag: &[F],
370
372
  iter_offset: usize,
371
373
  block_offset: usize,
372
- prob: &mut Array<F>,
374
+ prob: &mut [F],
373
375
  target: u32,
374
376
  mask: u32,
375
377
  ) {
@@ -387,8 +389,8 @@ pub(super) fn measure_p1<F: Float>(
387
389
 
388
390
  #[cube(launch_unchecked)]
389
391
  pub(super) fn measure_collapse<F: Float + LaunchArg + ConstantFloat>(
390
- state_real: &mut Array<F>,
391
- state_imag: &mut Array<F>,
392
+ state_real: &mut [F],
393
+ state_imag: &mut [F],
392
394
  offset: usize,
393
395
  target_mask: u32,
394
396
  result: u32,
@@ -398,8 +400,8 @@ pub(super) fn measure_collapse<F: Float + LaunchArg + ConstantFloat>(
398
400
  let state_index = state as usize;
399
401
 
400
402
  if (state & target_mask) == result {
401
- state_real[state_index] = state_real[state_index] * p;
402
- state_imag[state_index] = state_imag[state_index] * p;
403
+ state_real[state_index] *= p;
404
+ state_imag[state_index] *= p;
403
405
  } else {
404
406
  state_real[state_index] = F::ZERO;
405
407
  state_imag[state_index] = F::ZERO;
@@ -419,10 +421,10 @@ pub(super) const fn parity_u32(x: u32) -> u32 {
419
421
 
420
422
  #[cube(launch_unchecked)]
421
423
  pub(super) fn exp_value<F: Float + ConstantFloat>(
422
- state_real: &Array<F>,
423
- state_imag: &Array<F>,
424
+ state_real: &[F],
425
+ state_imag: &[F],
424
426
  offset: usize,
425
- prob: &mut Array<F>,
427
+ prob: &mut [F],
426
428
  target_mask: u32,
427
429
  ) {
428
430
  let state = ABSOLUTE_POS_X + offset as u32;
@@ -436,8 +438,8 @@ pub(super) fn exp_value<F: Float + ConstantFloat>(
436
438
 
437
439
  #[cube(launch_unchecked)]
438
440
  pub(super) fn in_place_swap<F: Float>(
439
- state_real: &mut Array<F>,
440
- state_imag: &mut Array<F>,
441
+ state_real: &mut [F],
442
+ state_imag: &mut [F],
441
443
  offset: u32,
442
444
  global_index: u32,
443
445
  local_index: u32,
@@ -467,8 +469,8 @@ pub(super) fn in_place_swap<F: Float>(
467
469
 
468
470
  #[cube(launch_unchecked)]
469
471
  pub(super) fn init_state<F: Float + ConstantFloat>(
470
- state_real: &mut Array<F>,
471
- state_imag: &mut Array<F>,
472
+ state_real: &mut [F],
473
+ state_imag: &mut [F],
472
474
  offset: u32,
473
475
  ) {
474
476
  let state = (offset + ABSOLUTE_POS_X) as usize;