File size: 1,567 Bytes
4fcc185
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import os
os.environ.setdefault('MPLCONFIGDIR',os.path.abspath('.cache/matplotlib'))
import json,hashlib,numpy as np
from pathlib import Path
from bci_data import cached
assert Path('reports/frozen_selection.json').exists(),'Audit test data only after freeze'
rows=[]
global_hashes=set()
for subject in range(1,16):
 for split in ['train','validation']:
  xx,_,_=cached(subject,split);global_hashes.update(hashlib.sha256(q.tobytes()).hexdigest() for q in xx)
for s in range(1,16):
 train,_,_=cached(s,'train');val,_,_=cached(s,'validation');test,_,_=cached(s,'test',evaluation=True)
 a=np.concatenate([train,val]);ha={hashlib.sha256(q.tobytes()).hexdigest() for q in a};duplicates=sum(hashlib.sha256(q.tobytes()).hexdigest() in ha for q in test)
 # Demeaned downsampled cross-trial raw waveform cosine similarity, no labels.
 af=a[:,:,::4].reshape(len(a),-1).astype(float);tf=test[:,:,::4].reshape(len(test),-1).astype(float);af-=af.mean(1,keepdims=True);tf-=tf.mean(1,keepdims=True);af/=np.linalg.norm(af,axis=1,keepdims=True);tf/=np.linalg.norm(tf,axis=1,keepdims=True);mx=(tf@af.T).max(1)
 rows.append({'subject':s,'exact_test_duplicates_with_train_validation':duplicates,'exact_duplicates_any_training_subject':sum(hashlib.sha256(q.tobytes()).hexdigest() in global_hashes for q in test),'max_test_to_training_raw_correlation':float(mx.max()),'n_test_correlation_gt_0_99':int((mx>.99).sum())})
json.dump(rows,open('reports/final_leakage_audit.json','w'),indent=2);print('Exact duplicate count:',sum(r['exact_test_duplicates_with_train_validation'] for r in rows))