This is an automated email from the ASF dual-hosted git repository.
guan404ming pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/mahout.git
The following commit(s) were added to refs/heads/main by this push:
new 2cc80072d docs: add missing QDP Python API docstrings (#1334)
2cc80072d is described below
commit 2cc80072d5fea9864c03b6595136a5e4eeda0a83
Author: Vic Wen <[email protected]>
AuthorDate: Mon Jun 1 12:51:15 2026 +0800
docs: add missing QDP Python API docstrings (#1334)
---
qdp/qdp-python/qumat_qdp/api.py | 22 ++++++++++++
qdp/qdp-python/qumat_qdp/backend.py | 10 ++++++
qdp/qdp-python/qumat_qdp/tensor.py | 19 ++++++++++
qdp/qdp-python/qumat_qdp/triton_amd.py | 63 ++++++++++++++++++++++++++++++++++
4 files changed, 114 insertions(+)
diff --git a/qdp/qdp-python/qumat_qdp/api.py b/qdp/qdp-python/qumat_qdp/api.py
index e1e8b20e3..c593e5d41 100644
--- a/qdp/qdp-python/qumat_qdp/api.py
+++ b/qdp/qdp-python/qumat_qdp/api.py
@@ -102,14 +102,31 @@ class QdpBenchmark:
self._backend_name: str = "rust"
def qubits(self, n: int) -> QdpBenchmark:
+ """Set the number of qubits for benchmarked encodings.
+
+ :param n: Number of qubits in each encoded output state.
+ :returns: This builder for fluent chaining.
+ """
self._num_qubits = n
return self
def encoding(self, method: str) -> QdpBenchmark:
+ """Set the encoding method to benchmark.
+
+ :param method: Encoding name, for example ``"amplitude"``,
+ ``"angle"``, ``"basis"``, ``"iqp"``, or ``"iqp-z"``.
+ :returns: This builder for fluent chaining.
+ """
self._encoding_method = method
return self
def batches(self, total: int, size: int = 64) -> QdpBenchmark:
+ """Set the number and size of benchmark batches.
+
+ :param total: Number of timed batches to process.
+ :param size: Number of vectors in each batch.
+ :returns: This builder for fluent chaining.
+ """
self._total_batches = total
self._batch_size = size
return self
@@ -119,6 +136,11 @@ class QdpBenchmark:
return self
def warmup(self, n: int) -> QdpBenchmark:
+ """Set the number of warmup batches run before timing.
+
+ :param n: Number of batches to execute before measurements begin.
+ :returns: This builder for fluent chaining.
+ """
self._warmup_batches = n
return self
diff --git a/qdp/qdp-python/qumat_qdp/backend.py
b/qdp/qdp-python/qumat_qdp/backend.py
index ea889fed8..098662d88 100644
--- a/qdp/qdp-python/qumat_qdp/backend.py
+++ b/qdp/qdp-python/qumat_qdp/backend.py
@@ -92,4 +92,14 @@ class QdpEngine:
num_qubits: int,
encoding_method: str = "amplitude",
) -> Any:
+ """Encode input samples with the configured backend.
+
+ :param data: Input samples accepted by the selected backend.
+ :param num_qubits: Number of qubits in the output state vector.
+ :param encoding_method: Encoding strategy, such as ``"amplitude"``,
+ ``"angle"``, ``"basis"``, ``"iqp"``, ``"iqp-z"``, or
+ ``"phase"`` when supported by the backend.
+ :returns: Backend-native encoded tensor or tensor-like result.
+ :raises ValueError: If the backend does not support
``encoding_method``.
+ """
return self._engine_adapter.encode(data, num_qubits, encoding_method)
diff --git a/qdp/qdp-python/qumat_qdp/tensor.py
b/qdp/qdp-python/qumat_qdp/tensor.py
index 4c8b26680..c9d651a73 100644
--- a/qdp/qdp-python/qumat_qdp/tensor.py
+++ b/qdp/qdp-python/qumat_qdp/tensor.py
@@ -30,6 +30,14 @@ class QdpTensor:
backend: str
def __dlpack__(self, stream: int | None = None) -> Any:
+ """Return a DLPack capsule for the wrapped backend tensor.
+
+ :param stream: Optional consumer stream to pass through to the wrapped
+ tensor's ``__dlpack__`` implementation.
+ :returns: A DLPack capsule representing ``value``.
+ :raises RuntimeError: If the wrapped value does not implement
+ ``__dlpack__``.
+ """
if not hasattr(self.value, "__dlpack__"):
raise RuntimeError(
f"Backend '{self.backend}' returned object without __dlpack__
support: "
@@ -40,6 +48,12 @@ class QdpTensor:
return self.value.__dlpack__(stream=stream)
def __dlpack_device__(self) -> Any:
+ """Return the DLPack device descriptor for the wrapped tensor.
+
+ :returns: The ``(device_type, device_id)`` tuple reported by ``value``.
+ :raises RuntimeError: If the wrapped value does not implement
+ ``__dlpack_device__``.
+ """
if not hasattr(self.value, "__dlpack_device__"):
raise RuntimeError(
f"Backend '{self.backend}' returned object without
__dlpack_device__ support: "
@@ -48,6 +62,11 @@ class QdpTensor:
return self.value.__dlpack_device__()
def to_torch(self) -> Any:
+ """Convert the wrapped tensor to a PyTorch tensor via DLPack.
+
+ :returns: A ``torch.Tensor`` sharing storage with the backend tensor
+ when the backend's DLPack producer supports zero-copy exchange.
+ """
import torch
return torch.from_dlpack(self)
diff --git a/qdp/qdp-python/qumat_qdp/triton_amd.py
b/qdp/qdp-python/qumat_qdp/triton_amd.py
index 8bcbd5d02..678fb49a5 100644
--- a/qdp/qdp-python/qumat_qdp/triton_amd.py
+++ b/qdp/qdp-python/qumat_qdp/triton_amd.py
@@ -47,6 +47,11 @@ def _is_rocm_runtime() -> bool:
def is_triton_amd_available() -> bool:
+ """Return whether the Triton AMD backend appears usable.
+
+ :returns: ``True`` when PyTorch reports a ROCm device, Triton imports, and
+ the active Triton target is HIP or cannot be queried reliably.
+ """
if not _is_rocm_runtime() or triton_mod is None:
return False
try:
@@ -148,6 +153,10 @@ class TritonAmdEngine:
)
def check_runtime(self) -> None:
+ """Validate that the process can use the Triton AMD backend.
+
+ :raises RuntimeError: If PyTorch ROCm support or Triton is unavailable.
+ """
if not _is_rocm_runtime():
raise RuntimeError(
"Triton AMD backend unavailable: no PyTorch ROCm device
detected."
@@ -230,6 +239,14 @@ class TritonAmdEngine:
return pairs
def encode_amplitude(self, data: Any, num_qubits: int) -> Any:
+ """Encode real-valued samples as normalized amplitudes.
+
+ :param data: One- or two-dimensional samples with width at most
+ ``2**num_qubits``.
+ :param num_qubits: Number of qubits in the encoded state.
+ :returns: Complex tensor of shape ``(batch, 2**num_qubits)``.
+ :raises ValueError: If the sample width exceeds the state length.
+ """
torch_mod = self._require_torch()
x = self._to_2d(data, dtype=self._real_dtype())
batch, sample_size = x.shape
@@ -250,6 +267,14 @@ class TritonAmdEngine:
return amp.to(self._complex_dtype())
def encode_angle(self, data: Any, num_qubits: int) -> Any:
+ """Encode samples with product-state angle encoding.
+
+ :param data: One- or two-dimensional angle samples with exactly
+ ``num_qubits`` values per sample.
+ :param num_qubits: Number of qubits in the encoded state.
+ :returns: Complex tensor of shape ``(batch, 2**num_qubits)``.
+ :raises ValueError: If the sample width is not ``num_qubits``.
+ """
torch_mod = self._require_torch()
real_dtype = self._real_dtype()
angles = self._to_2d(data, dtype=real_dtype)
@@ -273,6 +298,14 @@ class TritonAmdEngine:
return amp.to(self._complex_dtype())
def encode_basis(self, data: Any, num_qubits: int) -> Any:
+ """Encode integer basis-state indices as one-hot quantum states.
+
+ :param data: One-dimensional indices or a two-dimensional column of
+ indices in ``[0, 2**num_qubits - 1]``.
+ :param num_qubits: Number of qubits in the encoded state.
+ :returns: Complex one-hot tensor of shape ``(batch, 2**num_qubits)``.
+ :raises ValueError: If indices are empty, malformed, or out of range.
+ """
torch_mod = self._require_torch()
idx = torch_mod.as_tensor(data, device=self._device(),
dtype=torch_mod.int64)
if idx.ndim == 2:
@@ -352,6 +385,17 @@ class TritonAmdEngine:
*,
enable_zz: bool = True,
) -> Any:
+ """Encode samples with the IQP feature map.
+
+ :param data: IQP parameters. With ``enable_zz=True``, each sample must
+ contain ``num_qubits + num_qubits * (num_qubits - 1) // 2`` values;
+ otherwise each sample must contain ``num_qubits`` values.
+ :param num_qubits: Number of qubits in the encoded state.
+ :param enable_zz: Include pairwise ZZ interactions when ``True``.
+ :returns: Complex tensor of shape ``(batch, 2**num_qubits)``.
+ :raises ValueError: If the parameter width does not match the IQP
+ variant.
+ """
torch_mod = self._require_torch()
real_dtype = self._real_dtype()
params = self._to_2d(data, dtype=real_dtype)
@@ -443,6 +487,14 @@ class TritonAmdEngine:
return out
def encode_phase(self, data: Any, num_qubits: int) -> Any:
+ """Encode samples as equal-magnitude states with data-dependent phase.
+
+ :param data: One- or two-dimensional phase samples with exactly
+ ``num_qubits`` values per sample.
+ :param num_qubits: Number of qubits in the encoded state.
+ :returns: Complex tensor of shape ``(batch, 2**num_qubits)``.
+ :raises ValueError: If the sample width is not ``num_qubits``.
+ """
torch_mod = self._require_torch()
real_dtype = self._real_dtype()
phases = self._to_2d(data, dtype=real_dtype)
@@ -473,6 +525,17 @@ class TritonAmdEngine:
num_qubits: int,
encoding_method: str = "amplitude",
) -> Any:
+ """Encode input samples using a named Triton AMD encoding.
+
+ :param data: Input samples for the selected encoding method.
+ :param num_qubits: Number of qubits in the encoded state.
+ :param encoding_method: One of ``"amplitude"``, ``"angle"``,
+ ``"basis"``, ``"iqp"``, ``"iqp-z"``, or ``"phase"``.
+ :returns: Complex tensor of shape ``(batch, 2**num_qubits)``.
+ :raises RuntimeError: If the Triton AMD runtime is unavailable.
+ :raises ValueError: If ``encoding_method`` is unsupported or inputs are
+ invalid for the selected encoder.
+ """
self.check_runtime()
method = encoding_method.lower()