pysiglib.sig_kernel

pysiglib.sig_kernel#

sig_kernel(path1, path2, dyadic_order, *, static_kernel=None, time_aug=False, lead_lag=False, end_time=1.0, n_jobs=1, return_grid=False, normalize=False)[source]#

Computes a single signature kernel or a batch of signature kernels. The signature kernel of two \(d\)-dimensional paths \(x,y\) is defined as

\[k_{x,y}(s,t) := \left< S(x)_{[0,s]}, S(y)_{[0, t]} \right>_{T((\mathbb{R}^d))}\]

where the inner product is defined as

\[\left< A, B \right> := \sum_{k=0}^{\infty} \left< A_k, B_k \right>_{\left(\mathbb{R}^d\right)^{\otimes k}}\]
\[\left< u, v \right>_{\left(\mathbb{R}^d\right)^{\otimes k}} := \prod_{i=1}^k \left< u_i, v_i \right>_{\mathbb{R}^d}.\]

Optionally, a static kernel can be specified. For details, see the documentation on static kernels.

Parameters:
  • path1 (numpy.ndarray | torch.tensor) – The first underlying path or batch of paths, of shape (..., length_1, dimension).

  • path2 (numpy.ndarray | torch.tensor) – The second underlying path or batch of paths, of shape (..., length_2, dimension). Leading batch dimensions must match those of path1.

  • dyadic_order (int | tuple) – If set to a positive integer \(\lambda\), will refine the paths by a factor of \(2^\lambda\). If set to a tuple of positive integers \((\lambda_1, \lambda_2)\), will refine the first path by \(2^{\lambda_1}\) and the second path by \(2^{\lambda_2}\).

  • static_kernel (None | pysiglib.StaticKernel) – Static kernel. If None (default), the linear kernel will be used. For details, see the documentation on static kernels.

  • time_aug (bool) – If set to True, will compute the signature of the time-augmented path, \(\hat{x}_t := (t, x_t)\), defined as the original path with an extra channel set to time, \(t\). This channel spans \([0, t_L]\), where \(t_L\) is given by the parameter end_time.

  • lead_lag (bool) – If set to True, will compute the signature of the path after applying the lead-lag transformation.

  • end_time (float) – End time for time-augmentation, \(t_L\).

  • n_jobs (int) – (Only applicable to CPU computation) Number of threads to run in parallel. If n_jobs = 1, the computation is run serially. If set to -1, all available threads are used. For n_jobs below -1, (max_threads + 1 + n_jobs) threads are used. For example if n_jobs = -2, all threads but one are used.

  • return_grid (bool) – If True, returns the entire PDE grid.

  • normalize (bool) – If True, normalizes the signature kernel so that \(k(x, x) = 1\) by dividing by \(\sqrt{k(x, x) \cdot k(y, y)}\). Cannot be used with return_grid=True.

Returns:

Single signature kernel or batch of signature kernels

Return type:

numpy.ndarray | torch.tensor

Example:#

import torch
import pysiglib

path1 = torch.rand((10, 100, 5))
path2 = torch.rand((10, 100, 5))
k = pysiglib.sig_kernel(path1, path2, dyadic_order=2)
print(k)
# Using an RBF static kernel with time augmentation
import torch
import pysiglib

path1 = torch.rand((10, 100, 5))
path2 = torch.rand((10, 100, 5))
rbf = pysiglib.RBFKernel(sigma=1.0)
k = pysiglib.sig_kernel(
    path1, path2,
    dyadic_order=2,
    static_kernel=rbf,
    time_aug=True,
)
print(k)
# Asymmetric dyadic orders and returning the PDE grid
import torch
import pysiglib

path1 = torch.rand((100, 5))
path2 = torch.rand((80, 5))
grid = pysiglib.sig_kernel(
    path1, path2,
    dyadic_order=(2, 3),
    return_grid=True,
)
print(grid.shape)

Citation#

If you found this library useful in your research, please consider citing the paper:

@article{shmelev2025pysiglib,
  title={pySigLib-Fast Signature-Based Computations on CPU and GPU},
  author={Shmelev, Daniil and Salvi, Cristopher},
  journal={arXiv preprint arXiv:2509.10613},
  year={2025}
}