from pathlib import Path
import itertools,numpy as np

def predict(features,model_path=None):
 """Input: measured 50D pilot features. No SDF/mesh/angle labels accessed."""
 m=np.load(model_path or Path(__file__).with_name('model.npz'));X=np.atleast_2d(features).copy();side=np.where(X[:,0]>=0,1.,-1.);X[:,0]*=side;X[:,6]*=side;X[:,7]*=side
 for i in range(len(X)):
  if side[i]<0:X[i,9:33]=X[i,9:33][::-1];X[i,33:49]=X[i,33:49].reshape(4,4)[:,::-1].ravel()
 mode=str(m['mode'])
 if mode=='all_linear':Z=X
 elif mode.startswith('rbf'):
  a=np.arctan2(X[:,0],X[:,2]);Z=np.exp(-.5*((a[:,None]-m['rbf_centers'])/float(mode[3:]))**2)
 else:
  v=X[:,:3];cols=[]
  for d in range(1,int(mode[-1])+1):
   for inds in itertools.combinations_with_replacement(range(3),d):cols.append(np.prod(v[:,inds],axis=1))
  Z=np.column_stack(cols)
 coef=((Z-m['mean'])/m['scale'])@m['coef']+m['output_mean'];cut=np.clip(coef@m['basis'].T,0,1)
 return cut,side
