ket-lang 0.9.2.dev5__tar.gz → 0.9.2.dev6__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 (116) hide show
  1. {ket_lang-0.9.2.dev5/src/ket_lang.egg-info → ket_lang-0.9.2.dev6}/PKG-INFO +1 -1
  2. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/__init__.py +1 -1
  3. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/src/bitwise.rs +2 -2
  4. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/src/c_api.rs +7 -6
  5. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/src/convert.rs +1 -1
  6. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/src/dense.rs +7 -4
  7. ket_lang-0.9.2.dev6/src/ket/clib/libs/kbw/src/dense_gpu/kernel.rs +368 -0
  8. ket_lang-0.9.2.dev5/src/ket/clib/libs/kbw/src/dense_gpu.rs → ket_lang-0.9.2.dev6/src/ket/clib/libs/kbw/src/dense_gpu/mod.rs +45 -407
  9. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/src/dense_v2.rs +7 -4
  10. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/src/error.rs +5 -3
  11. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/src/quantum_execution.rs +32 -13
  12. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/src/sparse.rs +12 -7
  13. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6/src/ket_lang.egg-info}/PKG-INFO +1 -1
  14. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket_lang.egg-info/SOURCES.txt +2 -1
  15. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/LICENSE +0 -0
  16. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/MANIFEST.in +0 -0
  17. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/README.md +0 -0
  18. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/pyproject.toml +0 -0
  19. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/setup.cfg +0 -0
  20. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/setup.py +0 -0
  21. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/amazon.py +0 -0
  22. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/base.py +0 -0
  23. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/__init__.py +0 -0
  24. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/kbw.py +0 -0
  25. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libket.py +0 -0
  26. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/__init__.py +0 -0
  27. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/.git +0 -0
  28. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/.gitignore +0 -0
  29. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/.gitlab-ci.yml +0 -0
  30. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/.pre-commit-config.yaml +0 -0
  31. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/CHANGELOG.md +0 -0
  32. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/Cargo.toml +0 -0
  33. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/LICENSE +0 -0
  34. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/LICENSES/Apache-2.0.txt +0 -0
  35. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/README.md +0 -0
  36. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/REUSE.toml +0 -0
  37. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/build.rs +0 -0
  38. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/examples/grover.rs +0 -0
  39. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/examples/grover_gpu.rs +0 -0
  40. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/kbw/src/lib.rs +0 -0
  41. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/.git +0 -0
  42. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/.gitignore +0 -0
  43. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/.gitlab-ci.yml +0 -0
  44. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/.pre-commit-config.yaml +0 -0
  45. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/CHANGELOG.md +0 -0
  46. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/Cargo.toml +0 -0
  47. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/LICENSE +0 -0
  48. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/LICENSES/Apache-2.0.txt +0 -0
  49. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/README.md +0 -0
  50. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/REUSE.toml +0 -0
  51. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/build.rs +0 -0
  52. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/examples/grover.rs +0 -0
  53. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/examples/qft.rs +0 -0
  54. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/c_api/error.rs +0 -0
  55. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/c_api/execution.rs +0 -0
  56. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/c_api/mod.rs +0 -0
  57. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/c_api/objects.rs +0 -0
  58. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/c_api/process.rs +0 -0
  59. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/circuit.rs +0 -0
  60. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/decompose/mod.rs +0 -0
  61. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/decompose/network.rs +0 -0
  62. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/decompose/su2.rs +0 -0
  63. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/decompose/u2.rs +0 -0
  64. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/decompose/util.rs +0 -0
  65. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/decompose/x/c2to4x.rs +0 -0
  66. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/decompose/x/mod.rs +0 -0
  67. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/decompose/x/single_aux.rs +0 -0
  68. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/decompose/x/v_chain.rs +0 -0
  69. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/error.rs +0 -0
  70. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/ex_arch.rs +0 -0
  71. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/execution.rs +0 -0
  72. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/graph.rs +0 -0
  73. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/ir/gate.rs +0 -0
  74. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/ir/hamiltonian.rs +0 -0
  75. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/ir/instructions.rs +0 -0
  76. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/ir/mod.rs +0 -0
  77. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/ir/qubit.rs +0 -0
  78. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/lib.rs +0 -0
  79. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/mapping/allocation.rs +0 -0
  80. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/mapping/graph.rs +0 -0
  81. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/mapping/map.rs +0 -0
  82. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/mapping/mcpe.rs +0 -0
  83. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/mapping/mod.rs +0 -0
  84. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/prelude.rs +0 -0
  85. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/process/aux.rs +0 -0
  86. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/process/ctrl.rs +0 -0
  87. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/process/execution.rs +0 -0
  88. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/process/measure.rs +0 -0
  89. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/process/mod.rs +0 -0
  90. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/process/util.rs +0 -0
  91. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/libs/libket/src/util.rs +0 -0
  92. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/clib/wrapper.py +0 -0
  93. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/expv.py +0 -0
  94. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/gates.py +0 -0
  95. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/ibm.py +0 -0
  96. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/npsim.py +0 -0
  97. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/operations.py +0 -0
  98. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/quantumstate.py +0 -0
  99. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/quforge.py +0 -0
  100. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/qulib/__init__.py +0 -0
  101. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/qulib/gates.py +0 -0
  102. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/qulib/ham.py +0 -0
  103. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/qulib/math.py +0 -0
  104. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/qulib/oracle.py +0 -0
  105. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/qulib/prepare.py +0 -0
  106. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket/remote.py +0 -0
  107. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket_lang.egg-info/dependency_links.txt +0 -0
  108. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket_lang.egg-info/not-zip-safe +0 -0
  109. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket_lang.egg-info/requires.txt +0 -0
  110. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/src/ket_lang.egg-info/top_level.txt +0 -0
  111. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/tests/test_decompose.py +0 -0
  112. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/tests/test_gates.py +0 -0
  113. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/tests/test_grover.py +0 -0
  114. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/tests/test_phase_estimation.py +0 -0
  115. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/tests/test_u3_gate.py +0 -0
  116. {ket_lang-0.9.2.dev5 → ket_lang-0.9.2.dev6}/tests/test_unitaty_gate.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ket-lang
3
- Version: 0.9.2.dev5
3
+ Version: 0.9.2.dev6
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
@@ -91,7 +91,7 @@ from .quantumstate import *
91
91
  from .quantumstate import __all__ as all_state
92
92
  from . import qulib
93
93
 
94
- __version__ = "0.9.2dev5"
94
+ __version__ = "0.9.2dev6"
95
95
 
96
96
  __all__ = all_base + all_func + all_gate + all_expv + all_state + ["qulib"]
97
97
 
@@ -17,7 +17,7 @@ pub(crate) fn get_ctrl_mask<T: Integer + BitOrAssign + Shl<usize, Output = T>>(
17
17
  control_mask
18
18
  }
19
19
 
20
- pub(crate) fn bit_flip(state: usize, index: usize) -> usize {
20
+ pub(crate) const fn bit_flip(state: usize, index: usize) -> usize {
21
21
  state ^ (1 << index)
22
22
  }
23
23
 
@@ -27,7 +27,7 @@ pub(crate) fn bit_flip_vec(mut state: Vec<u64>, index: usize) -> Vec<u64> {
27
27
  state
28
28
  }
29
29
 
30
- pub(crate) fn is_one_at(state: usize, target: usize) -> bool {
30
+ pub(crate) const fn is_one_at(state: usize, target: usize) -> bool {
31
31
  state & (1 << target) != 0
32
32
  }
33
33
 
@@ -54,9 +54,10 @@ pub mod error {
54
54
  }
55
55
  }
56
56
 
57
- pub fn wrapper(error: Result<()>) -> i32 {
57
+ #[must_use]
58
+ pub const fn wrapper(error: Result<()>) -> i32 {
58
59
  match error {
59
- Ok(_) => KBWError::Success.error_code(),
60
+ Ok(()) => KBWError::Success.error_code(),
60
61
  Err(error) => error.error_code(),
61
62
  }
62
63
  }
@@ -83,11 +84,11 @@ pub unsafe extern "C" fn kbw_make_configuration(
83
84
  Some(coupling_graph.to_vec())
84
85
  };
85
86
 
86
- let classical_shadows = if !classical_shadows.is_null() {
87
+ let classical_shadows = if classical_shadows.is_null() {
88
+ None
89
+ } else {
87
90
  let cs = unsafe { std::slice::from_raw_parts(classical_shadows, 5) };
88
91
  Some(((cs[0] as u8, cs[1] as u8, cs[2] as u8), cs[3], cs[4]))
89
- } else {
90
- None
91
92
  };
92
93
 
93
94
  let sample_base = if sample_base == 0 {
@@ -138,7 +139,7 @@ pub unsafe extern "C" fn kbw_make_configuration(
138
139
  const BUILD_INFO: &str = build_info::format!("{} v{} [{} {}]", $.crate_info.name, $.crate_info.version, $.compiler, $.target);
139
140
 
140
141
  #[no_mangle]
141
- pub extern "C" fn kbw_build_info(msg: &mut *const u8, size: &mut usize) -> i32 {
142
+ pub const extern "C" fn kbw_build_info(msg: &mut *const u8, size: &mut usize) -> i32 {
142
143
  let bytes = BUILD_INFO.as_bytes();
143
144
  *size = bytes.len();
144
145
  *msg = bytes.as_ptr();
@@ -22,7 +22,7 @@ pub(crate) fn from_dump_to_prob(data: DumpData) -> DumpProbability {
22
22
  .amplitudes_real
23
23
  .par_iter()
24
24
  .zip(&data.amplitudes_imag)
25
- .map(|(real, imag)| Complex64::new(*real, *imag).abs().powf(2.0))
25
+ .map(|(real, imag)| Complex64::new(*real, *imag).abs().powi(2))
26
26
  .collect();
27
27
 
28
28
  DumpProbability {
@@ -5,9 +5,12 @@
5
5
 
6
6
  use crate::error::{KBWError, Result};
7
7
  use crate::quantum_execution::{ExecutionFeatures, QuantumExecution};
8
- use crate::{bitwise::*, FloatOps};
8
+ use crate::{
9
+ bitwise::{bit_flip, get_ctrl_mask, is_one_at},
10
+ FloatOps,
11
+ };
9
12
  use itertools::Itertools;
10
- use ket::execution::*;
13
+ use ket::execution::Capability;
11
14
  use ket::process::DumpData;
12
15
  use log::error;
13
16
  use num::complex::Complex;
@@ -59,7 +62,7 @@ impl<F: FloatOps> QuantumExecution for Dense<F> {
59
62
 
60
63
  state_0[0] = Complex::<F>::one();
61
64
 
62
- Ok(Dense {
65
+ Ok(Self {
63
66
  state: true,
64
67
  state_0,
65
68
  state_1,
@@ -334,7 +337,7 @@ impl<F: FloatOps> QuantumExecution for Dense<F> {
334
337
  .iter()
335
338
  .rev()
336
339
  .enumerate()
337
- .map(|(index, qubit)| (is_one_at(state, *qubit) as usize) << index)
340
+ .map(|(index, qubit)| usize::from(is_one_at(state, *qubit)) << index)
338
341
  .reduce(|a, b| a | b)
339
342
  .unwrap_or(0);
340
343
 
@@ -0,0 +1,368 @@
1
+ // SPDX-FileCopyrightText: 2026 Evandro Chagas Ribeiro da Rosa <evandro@quantuloop.com>
2
+ //
3
+ // SPDX-License-Identifier: Apache-2.0
4
+
5
+ use cubecl::prelude::*;
6
+
7
+ pub(super) fn compute_cube_size(
8
+ num_qubits: usize,
9
+ target: usize,
10
+ ) -> (u32, u32, CubeCount, CubeDim) {
11
+ let half_block_size = 1u32 << target;
12
+ let full_block_size = target + 1;
13
+ let num_blocks = 1u32 << (num_qubits - target - 1);
14
+
15
+ let mut cube_count_x = 1;
16
+ let mut cube_count_y = 1;
17
+ let mut cube_dim_x = num_blocks;
18
+ let mut cube_dim_y = half_block_size;
19
+
20
+ while cube_dim_x * cube_dim_y > 1024 {
21
+ if cube_dim_x > cube_dim_y {
22
+ cube_dim_x >>= 1;
23
+ cube_count_x <<= 1;
24
+ } else {
25
+ cube_dim_y >>= 1;
26
+ cube_count_y <<= 1;
27
+ }
28
+ }
29
+
30
+ (
31
+ half_block_size,
32
+ full_block_size as u32,
33
+ CubeCount::new_2d(cube_count_x, cube_count_y),
34
+ CubeDim::new_2d(cube_dim_x, cube_dim_y),
35
+ )
36
+ }
37
+
38
+ #[cube]
39
+ pub(super) const fn compute_ket(
40
+ control_mask: u32,
41
+ half_block_size: u32,
42
+ full_block_size: u32,
43
+ ) -> (u32, u32, bool) {
44
+ let ket0 = (ABSOLUTE_POS_X << full_block_size) + ABSOLUTE_POS_Y;
45
+ let ket1 = ket0 + half_block_size;
46
+
47
+ (ket0, ket1, ket0 & control_mask == control_mask)
48
+ }
49
+
50
+ #[cube(launch_unchecked)]
51
+ pub(super) fn gate_x<F: Float>(
52
+ state_real: &mut Array<F>,
53
+ state_imag: &mut Array<F>,
54
+ control_mask: u32,
55
+ half_block_size: u32,
56
+ full_block_size: u32,
57
+ ) {
58
+ let ket = compute_ket(control_mask, half_block_size, full_block_size);
59
+
60
+ if ket.2 {
61
+ let old0 = state_real[ket.0];
62
+ state_real[ket.0] = state_real[ket.1];
63
+ state_real[ket.1] = old0;
64
+
65
+ let old0 = state_imag[ket.0];
66
+ state_imag[ket.0] = state_imag[ket.1];
67
+ state_imag[ket.1] = old0;
68
+ }
69
+ }
70
+
71
+ #[cube(launch_unchecked)]
72
+ pub(super) fn gate_y<F: Float>(
73
+ state_real: &mut Array<F>,
74
+ state_imag: &mut Array<F>,
75
+ control_mask: u32,
76
+ half_block_size: u32,
77
+ full_block_size: u32,
78
+ ) {
79
+ let ket = compute_ket(control_mask, half_block_size, full_block_size);
80
+
81
+ if ket.2 {
82
+ let old0_real = state_real[ket.0];
83
+ let old0_imag = state_imag[ket.0];
84
+
85
+ state_real[ket.0] = state_imag[ket.1];
86
+ state_imag[ket.0] = -state_real[ket.1];
87
+
88
+ state_real[ket.1] = -old0_imag;
89
+ state_imag[ket.1] = old0_real;
90
+ }
91
+ }
92
+
93
+ #[cube(launch_unchecked)]
94
+ pub(super) fn gate_z<F: Float>(
95
+ state_real: &mut Array<F>,
96
+ state_imag: &mut Array<F>,
97
+ control_mask: u32,
98
+ half_block_size: u32,
99
+ full_block_size: u32,
100
+ ) {
101
+ let ket = compute_ket(control_mask, half_block_size, full_block_size);
102
+
103
+ if ket.2 {
104
+ state_real[ket.1] = -state_real[ket.1];
105
+ state_imag[ket.1] = -state_imag[ket.1];
106
+ }
107
+ }
108
+
109
+ #[cube(launch_unchecked)]
110
+ pub(super) fn gate_h<F: Float>(
111
+ state_real: &mut Array<F>,
112
+ state_imag: &mut Array<F>,
113
+ control_mask: u32,
114
+ half_block_size: u32,
115
+ full_block_size: u32,
116
+ frac_1_sqrt_2: F,
117
+ ) {
118
+ let ket = compute_ket(control_mask, half_block_size, full_block_size);
119
+
120
+ if ket.2 {
121
+ let old0_real = state_real[ket.0];
122
+ let old0_imag = state_imag[ket.0];
123
+
124
+ let old1_real = state_real[ket.1];
125
+ let old1_imag = state_imag[ket.1];
126
+
127
+ state_real[ket.0] = (old0_real + old1_real) * frac_1_sqrt_2;
128
+ state_imag[ket.0] = (old0_imag + old1_imag) * frac_1_sqrt_2;
129
+
130
+ state_real[ket.1] = (old0_real - old1_real) * frac_1_sqrt_2;
131
+ state_imag[ket.1] = (old0_imag - old1_imag) * frac_1_sqrt_2;
132
+ }
133
+ }
134
+
135
+ #[cube]
136
+ pub(super) fn complex_mul<F: Float>(lhs_real: F, lhs_imag: F, rhs_real: F, rhs_imag: F) -> (F, F) {
137
+ (
138
+ lhs_real * rhs_real - lhs_imag * rhs_imag,
139
+ lhs_real * rhs_imag + lhs_imag * rhs_real,
140
+ )
141
+ }
142
+
143
+ #[cube]
144
+ pub(super) fn complex_add<F: Float>(lhs_real: F, lhs_imag: F, rhs_real: F, rhs_imag: F) -> (F, F) {
145
+ (lhs_real + rhs_real, lhs_imag + rhs_imag)
146
+ }
147
+
148
+ #[cube(launch_unchecked)]
149
+ pub(super) fn gate_p<F: Float>(
150
+ state_real: &mut Array<F>,
151
+ state_imag: &mut Array<F>,
152
+ control_mask: u32,
153
+ half_block_size: u32,
154
+ full_block_size: u32,
155
+ angle_real: F,
156
+ angle_imag: F,
157
+ ) {
158
+ let ket = compute_ket(control_mask, half_block_size, full_block_size);
159
+
160
+ if ket.2 {
161
+ let (r, i) = complex_mul::<F>(state_real[ket.1], state_imag[ket.1], angle_real, angle_imag);
162
+ state_real[ket.1] = r;
163
+ state_imag[ket.1] = i;
164
+ }
165
+ }
166
+
167
+ #[cube(launch_unchecked)]
168
+ pub(super) fn gate_rx<F: Float>(
169
+ state_real: &mut Array<F>,
170
+ state_imag: &mut Array<F>,
171
+ control_mask: u32,
172
+ half_block_size: u32,
173
+ full_block_size: u32,
174
+ cos_theta_2: F,
175
+ sin_theta_2: F,
176
+ ) {
177
+ let ket = compute_ket(control_mask, half_block_size, full_block_size);
178
+
179
+ if ket.2 {
180
+ let (ket0_cos_real, ket0_cos_imag) = complex_mul::<F>(
181
+ cos_theta_2,
182
+ F::new(0.0),
183
+ state_real[ket.0],
184
+ state_imag[ket.0],
185
+ );
186
+
187
+ let (ket1_sin_real, ket1_sin_imag) = complex_mul::<F>(
188
+ F::new(0.0),
189
+ sin_theta_2,
190
+ state_real[ket.1],
191
+ state_imag[ket.1],
192
+ );
193
+
194
+ let (ket0_sin_real, ket0_sin_imag) = complex_mul::<F>(
195
+ F::new(0.0),
196
+ sin_theta_2,
197
+ state_real[ket.0],
198
+ state_imag[ket.0],
199
+ );
200
+
201
+ let (ket1_cos_real, ket1_cos_imag) = complex_mul::<F>(
202
+ cos_theta_2,
203
+ F::new(0.0),
204
+ state_real[ket.1],
205
+ state_imag[ket.1],
206
+ );
207
+
208
+ let (r, i) = complex_add::<F>(ket0_cos_real, ket0_cos_imag, ket1_sin_real, ket1_sin_imag);
209
+ state_real[ket.0] = r;
210
+ state_imag[ket.0] = i;
211
+
212
+ let (r, i) = complex_add::<F>(ket0_sin_real, ket0_sin_imag, ket1_cos_real, ket1_cos_imag);
213
+ state_real[ket.1] = r;
214
+ state_imag[ket.1] = i;
215
+ }
216
+ }
217
+
218
+ #[cube(launch_unchecked)]
219
+ pub(super) fn gate_ry<F: Float>(
220
+ state_real: &mut Array<F>,
221
+ state_imag: &mut Array<F>,
222
+ control_mask: u32,
223
+ half_block_size: u32,
224
+ full_block_size: u32,
225
+ cos_theta_2: F,
226
+ sin_theta_2: F,
227
+ ) {
228
+ let ket = compute_ket(control_mask, half_block_size, full_block_size);
229
+
230
+ if ket.2 {
231
+ let (ket0_cos_real, ket0_cos_imag) = complex_mul::<F>(
232
+ cos_theta_2,
233
+ F::new(0.0),
234
+ state_real[ket.0],
235
+ state_imag[ket.0],
236
+ );
237
+
238
+ let (ket1_sin_real, ket1_sin_imag) = complex_mul::<F>(
239
+ -sin_theta_2,
240
+ F::new(0.0),
241
+ state_real[ket.1],
242
+ state_imag[ket.1],
243
+ );
244
+
245
+ let (ket0_sin_real, ket0_sin_imag) = complex_mul::<F>(
246
+ sin_theta_2,
247
+ F::new(0.0),
248
+ state_real[ket.0],
249
+ state_imag[ket.0],
250
+ );
251
+
252
+ let (ket1_cos_real, ket1_cos_imag) = complex_mul::<F>(
253
+ cos_theta_2,
254
+ F::new(0.0),
255
+ state_real[ket.1],
256
+ state_imag[ket.1],
257
+ );
258
+
259
+ let (r, i) = complex_add::<F>(ket0_cos_real, ket0_cos_imag, ket1_sin_real, ket1_sin_imag);
260
+ state_real[ket.0] = r;
261
+ state_imag[ket.0] = i;
262
+
263
+ let (r, i) = complex_add::<F>(ket0_sin_real, ket0_sin_imag, ket1_cos_real, ket1_cos_imag);
264
+ state_real[ket.1] = r;
265
+ state_imag[ket.1] = i;
266
+ }
267
+ }
268
+
269
+ #[cube(launch_unchecked)]
270
+ pub(super) fn gate_rz<F: Float>(
271
+ state_real: &mut Array<F>,
272
+ state_imag: &mut Array<F>,
273
+ control_mask: u32,
274
+ half_block_size: u32,
275
+ full_block_size: u32,
276
+ angle_real: F,
277
+ angle_imag: F,
278
+ ) {
279
+ let ket = compute_ket(control_mask, half_block_size, full_block_size);
280
+
281
+ if ket.2 {
282
+ let (r, i) = complex_mul::<F>(
283
+ state_real[ket.0],
284
+ state_imag[ket.0],
285
+ angle_real,
286
+ -angle_imag,
287
+ );
288
+ state_real[ket.0] = r;
289
+ state_imag[ket.0] = i;
290
+
291
+ let (r, i) = complex_mul::<F>(state_real[ket.1], state_imag[ket.1], angle_real, angle_imag);
292
+ state_real[ket.1] = r;
293
+ state_imag[ket.1] = i;
294
+ }
295
+ }
296
+
297
+ #[cube(launch_unchecked)]
298
+ pub(super) fn measure_p1<F: Float>(
299
+ state_real: &Array<F>,
300
+ state_imag: &Array<F>,
301
+ prob: &mut Array<F>,
302
+ target: u32,
303
+ mask: u32,
304
+ ) {
305
+ let state = ((((ABSOLUTE_POS_X >> target) << 1) | 1) << target) | (ABSOLUTE_POS_X & mask);
306
+
307
+ prob[ABSOLUTE_POS_X] =
308
+ state_real[state] * state_real[state] + state_imag[state] * state_imag[state]
309
+ }
310
+
311
+ #[cube(launch_unchecked)]
312
+ pub(super) fn measure_collapse<F: Float>(
313
+ state_real: &mut Array<F>,
314
+ state_imag: &mut Array<F>,
315
+ target_mask: u32,
316
+ result: u32,
317
+ p: F,
318
+ ) {
319
+ let state = ABSOLUTE_POS_X;
320
+ state_real[state] = if (state & target_mask) == result {
321
+ state_real[state] * p
322
+ } else {
323
+ F::new(0.0)
324
+ };
325
+ state_imag[state] = if (state & target_mask) == result {
326
+ state_imag[state] * p
327
+ } else {
328
+ F::new(0.0)
329
+ };
330
+ }
331
+
332
+ #[cube(launch_unchecked)]
333
+ pub(super) fn init_state<F: Float>(state_real: &mut Array<F>, state_imag: &mut Array<F>) {
334
+ state_real[ABSOLUTE_POS_X] = if ABSOLUTE_POS_X == 0 {
335
+ F::new(1.0)
336
+ } else {
337
+ F::new(0.0)
338
+ };
339
+ state_imag[ABSOLUTE_POS_X] = F::new(0.0);
340
+ }
341
+
342
+ #[cube]
343
+ pub(super) const fn parity_u32(x: u32) -> u32 {
344
+ let mut v = x;
345
+ v ^= v >> 16;
346
+ v ^= v >> 8;
347
+ v ^= v >> 4;
348
+ v ^= v >> 2;
349
+ v ^= v >> 1;
350
+ v & 1
351
+ }
352
+
353
+ #[cube(launch_unchecked)]
354
+ pub(super) fn exp_value<F: Float>(
355
+ state_real: &Array<F>,
356
+ state_imag: &Array<F>,
357
+ prob: &mut Array<F>,
358
+ target_mask: u32,
359
+ ) {
360
+ let state = ABSOLUTE_POS_X;
361
+ prob[state] = if parity_u32(state & target_mask) == 1 {
362
+ F::new(-1.0)
363
+ } else {
364
+ F::new(1.0)
365
+ } * state_real[state]
366
+ * state_real[state]
367
+ + state_imag[state] * state_imag[state];
368
+ }