File size: 1,209 Bytes
8094c0c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Finite reference distributions for verification, never model selection."""
import torch


def inverse_empirical_cdf(values,probabilities):
    """Quantiles of a finite uniform law; no interpolation between support points."""
    assert values.ndim==1 and probabilities.ndim==1 and len(values)>0
    assert values.device.type=='cuda' and probabilities.device==values.device
    assert torch.all((probabilities>=0)&(probabilities<=1))
    ordered=values.sort().values
    indices=torch.ceil(probabilities*len(values)).long().clamp(1,len(values))-1
    return ordered[indices]


def sign_flip_pvalues(daily_differences):
    """Enumerate the exact sign-symmetric null for independent paired days."""
    assert daily_differences.ndim==1 and daily_differences.device.type=='cuda'
    n=len(daily_differences)
    code=torch.arange(2**n,device=daily_differences.device)
    bit=torch.arange(n,device=daily_differences.device)
    signs=(((code[:,None]>>bit)&1)*2-1).to(daily_differences.dtype)
    simulated=(signs*daily_differences).mean(1);observed=daily_differences.mean()
    one=(simulated>=observed-1e-12).double().mean()
    two=(simulated.abs()>=observed.abs()-1e-12).double().mean()
    return one,two