PyTorch
normwear2
custom_code
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