import appuifw,e32
from mls import*
appuifw.app.title=u'\u041c\u0435\u0442\u043e\u0434 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432'
appuifw.app.body=c=appuifw.Canvas()
c.clear((0,255,255))
kortel=appuifw.multi_query(u'list of values x=[...]',u'list of values y=[...]')
X,Y=eval(kortel[0]),eval(kortel[1])
m=appuifw.query(u'm=','number')
A,B,b=[],[],[]
for i in range(m+1):
  a=[]
  for j in range(m+1):
    a.append(reduce(lambda x,y:x+y**(i+j),X,0))
  A.append(a)
for k in range(m+1):
  s=0
  for l in range(len(X)):
    s+=Y[l]*X[l]**k
  b.append(s)
B.append(b)
p=mult(inv(A),B)
if p[0][1]<0:
  st='%5.3f'%p[0][0]+'-'+'%5.3f'%abs(p[0][1])+'x'
else:
  st='%5.3f'%p[0][0]+'+'+'%5.3f'%p[0][1]+'x'


st1='%5.3f'%p[0][0]+'+'+'%5.3f'%p[0][1]+'*x'

for t in range(2,m+1):
  if p[0][t]<0:
    st+='-%5.3f'%abs(p[0][t])+'x**%d'%t
  else:
    st+='+%5.3f'%p[0][t]+'x**%d'%t
  
  st1+='+%5.3f'%p[0][t]+'*x**%d'%t
print 'y='+st
f=lambda x:eval(st1)
lt=[(Y[l]-f(X[l]))**2 for l in range(len(X))]
sigma=((reduce(lambda x,y:x+y,lt))/float(len(X)))**0.5
print 'sigma=%5.3f'%sigma
a,b=float(X[0]),float(X[len(X)-1])
M,m=float(max(Y)),float(min(Y))

def quit():
    app_lock.signal()
appuifw.app.exit_key_handler=\
quit
def Q(x):
 if x<=0:
  return 1.
 else:
  return x
def S(x):
 if x<0:
  return 0
 else:
  return x 
def B(x,y):
 if y<=0:
  return (x-y)/x
 if x<0 and y>0:
  return 1.
 if x>=0:
  return (y-x)/y
def K(x,y):
 if y<=0:
  return 1.
 if x<0 and y>0:
  return x/(x-y)
 if x>=0:
  return 0
def I(x,y,z):
 if y<=0:
  return z/x
 if x<0 and y>0:
  return (y-z)/(y-x)
 if x>=0:
  return (y-z)/y

c=appuifw.Canvas()
appuifw.app.body=c

e32.ao_sleep(0.01)
c.line((5,5+135*(1-K(m,M)),235,5+135*(1-K(m,M))),253)
c.line((5+165*K(a,b),5,5+165*K(a,b),170),253)
c.point((5+165*S(a)/Q(b),5+135*(1-K(m,M))),(253,0,0),width=5)
c.point((5+165*(B(a,b)+S(a)/Q(b)),5+135*(1-K(m,M))),(253,0,0),width=5)
c.text((5+165*S(a)/Q(b),7+135*(1-K(m,M))),u'%f'%a)
c.text((165*(B(a,b)+S(a)/Q(b))-7,7+135*(1-K(m,M))),u'%5.3f'%b)
c.text((5+165*K(a,b),7),u'%5.3f'%M)
c.text((5+165*K(a,b),5+135*I(m,M,m)),u'%5.3f'%m)
c.point((5+165*K(a,b),5+135*I(m,M,m)),(253,0,0),width=3)
for i in range(301):
  x1=165*(S(a)/Q(b)+B(a,b)*i/300.)+5
  x=a+(b-a)*i/300.
  y=5+135*I(m,M,f(x))
  c.point((x1,y),(0,255,0),width=3)
for i in range(len(X)):
  x2=165*(S(a)/Q(b)+B(a,b)*(X[i]-a)/(b-a))+5
  y1=5+135*I(m,M,Y[i])
  c.point((x2,y1),(255,0,0),width=5)
c.text((30,50),u'sigma=%5.3f'%sigma)
c.text((15,30),u'y=%s'%st)  
app_lock=e32.Ao_lock()
app_lock.wait()   