Intrinsic Tangent-Projected Point-Cloud Layer / tangent_surface_track.py

✓✓ Beats tuned baseline

Raw ⬇ ZIP
 1import numpy as np
 2
 3META = {'name':'tangent_surface_vector_regression','domain':'geometry/point-cloud','description':'Noisy rotated sphere point clouds with a tangent-field magnitude target; the input contains ambient vector features with normal corruption.'}
 4
 5def _rot(rng):
 6    q,r=np.linalg.qr(rng.normal(size=(3,3)))
 7    q=q@np.diag(np.sign(np.diag(r)))
 8    if np.linalg.det(q)<0:q[:,0]*=-1
 9    return q.astype(np.float32)
10
11def _make(seed,n):
12    rng=np.random.default_rng(seed); m=20; X=np.empty((n,m,7),np.float32); Y=np.empty((n,1),np.float32)
13    a=np.array([.8,-.35,.55],np.float32)
14    for b in range(n):
15        z=rng.normal(size=(m,3)).astype(np.float32); z/=np.linalg.norm(z,axis=1,keepdims=True)
16        R=_rot(rng); p=z@R.T; p[1:]=p[0]+.55*(z[1:]-z[0])@R.T; p[1:]/=np.linalg.norm(p[1:],axis=1,keepdims=True)
17        s=p@a; v=a[None,:]-s[:,None]*p
18        v=v+.9*rng.normal(size=(m,1)).astype(np.float32)*p
19        X[b,:,:3]=p; X[b,:,3]=s; X[b,:,4:]=v; Y[b,0]=np.linalg.norm(v[0]-((v[0]@p[0])*p[0]))
20    return X,Y
21
22def get_dataset(seed,n_train,n_test):
23    xtr,ytr=_make(seed,n_train); xte,yte=_make(seed+5000,n_test)
24    return {'xtr':xtr,'ytr':ytr,'xte':xte,'yte':yte,'task':'regression','metric':'mse','out_dim':1}