"""Original exact up-zero/FIR/down-index exercise, not a production resampler."""
from fractions import Fraction as F
from itertools import product
import json

def validate(x,h,p,q,phase):
 if any(type(a) is not list or not 1<=len(a)<=8 or any(type(v) not in [int,F] or abs(v)>10 for v in a) for a in [x,h]) or any(type(v) is not int or not 1<=v<=4 for v in [p,q]) or type(phase) is not int or not 0<=phase<q:raise ValueError('exact bounded nonempty vectors, P/Q1..4 and phase0..Q-1')

def stages(x,h,p,q,phase=0):
 validate(x,h,p,q,phase);up=[F(0)]*((len(x)-1)*p+1)
 for i,v in enumerate(x):up[i*p]=F(v)
 filtered=[F(0)]*(len(up)+len(h)-1)
 for i,a in enumerate(up):
  for j,b in enumerate(h):filtered[i+j]+=a*b
 output=filtered[phase::q];rows=[]
 for m,actual in enumerate(output):
  t=phase+m*q;terms=[F(v)*h[t-k*p] if 0<=t-k*p<len(h) else F(0) for k,v in enumerate(x)];expected=sum(terms);assert actual==expected;rows.append({'output_index':m,'high_rate_index':t,'terms':[str(v) for v in terms],'sum':str(expected)})
 assert len(output)==max(0,((len(x)-1)*p+len(h)-1-phase)//q+1)
 return {'up_zero_inserted':[str(v) for v in up],'full_FIR':[str(v) for v in filtered],'output':[str(v) for v in output],'direct_index_oracle':rows,'phase':phase}

def demo():
 x=[1,2,0,-1];h=[F(1,2),F(1),F(1,2)];main=stages(x,h,2,3);assert main['output']==['1/2','2','-1/2'];checks=0
 for n,lh,p,q in product(range(1,5),range(1,5),range(1,5),range(1,5)):
  xx=[F((-1)**i*(i+1),2) for i in range(n)];hh=[F(j+1,4) for j in range(lh)]
  for phase in range(q):stages(xx,hh,p,q,phase);checks+=1
 impulse=stages([1],[F(1,2),1,F(1,2)],1,1);assert impulse['output']==['1/2','1','1/2']
 rejected=[]
 for label,args in [('Pzero',(x,h,0,3,0)),('Qnegative',(x,h,2,-1,0)),('boolratio',(x,h,True,3,0)),('emptyfilter',(x,[],2,3,0)),('NaN',([float('nan')],h,2,3,0)),('invalidphase',(x,h,2,3,3)),('overlength',([0]*9,h,2,3,0))]:
  try:stages(*args)
  except ValueError:rejected.append(label)
  else:raise AssertionError('expected rejection')
 return {'input':x,'FIR':[str(v) for v in h],'P':2,'Q':3,'main':main,'wrong_raw_every_third':x[::3],'all_bounded_length_ratio_phase_oracles':checks,'identity_ratio_impulse':impulse,'invalid_cases_rejected':rejected,'scope':'own finite exact zero-extension/full-convolution/phase-index exercise, not SciPy/polyphase optimization/anti-alias-quality/delay compensation/duration guarantee/real audio or Opera service test'}
if __name__=='__main__':print(json.dumps(demo(),ensure_ascii=True,indent=2))
