File size: 853 Bytes
5f7b8bf | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import torch
def mean_centroid(x, sr=1.0, patch_size=16):
# x: nvar, L
f = torch.fft.rfft(x, dim=-1).abs()
freqs = torch.fft.rfftfreq(x.size(-1), 1/sr).to(x.device)
return int(((1 / (((f * freqs).sum(-1) / f.sum(-1)).mean())) // patch_size) * patch_size)
def generate_reservoir_matrix(n, sparsity=0.05, spectral_radius=0.9, seed=None):
if seed is not None:
torch.manual_seed(seed)
# Step 1: Random matrix with values in [-1, 1]
W = torch.rand(n, n) * 2 - 1
# Step 2: Apply sparsity mask
mask = (torch.rand(n, n) < sparsity).float()
W *= mask
# Step 3: Normalize to desired spectral radius
eigenvalues = torch.linalg.eigvals(W).abs()
max_eigenvalue = torch.max(eigenvalues)
if max_eigenvalue > 0:
W *= spectral_radius / max_eigenvalue
return W |