#14154: Random freezes with @parallel decorator
-----------------------------+----------------------------------------------
Reporter: mmarco | Owner: rlm
Type: PLEASE CHANGE | Status: new
Priority: minor | Milestone: sage-5.8
Component: memleak | Keywords: parallel
Work issues: | Report Upstream: N/A
Reviewers: | Authors:
Merged in: | Dependencies:
Stopgaps: |
-----------------------------+----------------------------------------------
I get random freezes of a parallel process with the following code:
{{{
def trenza(f,points,exact=True,step=0.1,precision=53):
if len(points)>2:
return
trenza(f,points[:2],exact,step,precision)*trenza(f,points[1:],exact,step,precision)
F=ComplexField(precision)
x0=F(points[0])
x1=F(points[1])
d=abs(F(x0)-F(x1))
(x,y)=f.parent().gens()
y0s=f(x0,QQbar[y].gen()).roots(multiplicities=False)
dfx=f.derivative(x)
dfy=f.derivative(y)
RX=PolynomialRing(F,'x')
RY=PolynomialRing(F,'y')
R=PolynomialRing(F,'x,y')
Rext=PolynomialRing(F,'X0,Y0,x,y,D')
diffs=filter(lambda a:a!=0,[f.derivative(y,k) for k in
range(f.degree()+1)])
Ak=[Rext(g(Rext('x'),Rext('Y0')+Rext('D')*(x-Rext('X0')))) for g in
diffs]
args=[(f,x0,x1,y0,d,Ak,R,F,RX,x.change_ring(F),y.change_ring(F),RY,dfx,dfy,exact,step)
for y0 in y0s]
l=list(siguehilo(args))
#return
siguehilo(f,x0,x1,y0s[2],d,Ak,R,F,RX,x.change_ring(F),y.change_ring(F),RY,dfx,dfy,exact,step)
#return
#print "calculado l"
L=[a[1] for a in l]
i=min([L[k][1][0] for k in range(len(L))])
puntostot=[[[a[0][1].real(),a[0][1].imag()]] for a in L]
indices=[1 for a in range(len(l))]
while i<F(1):
for j in range(len(L)):
if L[j][indices[j]][0]>i:
xaux=L[j][indices[j]-1][1]
yaux=L[j][indices[j]][1]
aaux=L[j][indices[j]-1][0]
baux=L[j][indices[j]][0]
interpola=xaux+(yaux-xaux)*(i-aaux)/(baux-aaux)
puntostot[j].append([interpola.real(),interpola.imag()])
else:
puntostot[j].append([L[j][indices[j]][1].real(),L[j][indices[j]][1].imag()])
indices[j]=indices[j]+1
i=min([L[k][indices[k]][0] for k in range(len(L))])
for j in range(len(L)):
puntostot[j].append([L[j][-1][1].real(),L[j][-1][1].imag()])
tren=[]
G=SymmetricGroup(len(puntostot))
for i in range(len(puntostot[0])-1):
l1=[puntostot[j][i] for j in range(len(L))]
l2=[puntostot[j][i+1] for j in range(len(L))]
M=[[l1[s],l2[s]] for s in range(len(l1))]
M.sort()
l1=[a[0] for a in M]
l2=[a[1] for a in M]
cruces=[]
for j in range(len(l2)):
for k in range(j):
if l2[j]<l2[k]:
t=(l1[j][0]-l1[k][0])/(l2[k][0]-l1[k][0]+l1[j][0]-l2[j][0])
s=cmp(l1[k][1]*(1-t)+t*l2[k][1],l1[j][1]*(1-t)+t*l2[j][1])
cruces.append([t,k,j,-s])
cruces.sort()
P=G(Permutation([]))
for c in cruces:
tren.append(c[3]*min(map(P,[c[1]+1,c[2]+1])))
P=G(Permutation([(c[1]+1,c[2]+1)]))*P
B=BraidGroup(len(y0s))
return B(tren)
@parallel
def siguehilo(f,x0,x1,y0a,d,Ak,R,F,RX,x,y,RY,dfx,dfy,exact,stepx):
t=F(0)
y0=F(y0a)
xi=x0
puntos=[]
sigue=True
uno=False
pr=F(2)^-(F.precision()-2)
while t<F(1) or sigue:
g=f(xi,y).polynomial(y)
y2=RY(g).newton_raphson(8,y0)
#while abs(y1-y2)>pr*16:
# [y1,y2]=RY(g).newton_raphson(2,y2)
y0=y2[-1]
puntos.append([t,y0])
d0=F(-dfx(xi,y0)/dfy(xi,y0))
h=1
if exact:
pr=2^-(F.precision()-1)
FR=RealIntervalField(F.precision())
FC=ComplexIntervalField(F.precision())
R=PolynomialRing(FC,'x,y')
RX=PolynomialRing(FC,'x')
xx0=FC(FR(xi.real()-pr,xi.real()+pr)+FC(I)*FR(xi.imag()-pr,xi.imag()+pr))
yy0=FC(FR(y0.real()-pr,y0.real()+pr)+FC(I)*FR(y0.imag()-pr,y0.imag()+pr))
dd=FC(d0)
Aka=[j.change_ring(FC) for j in Ak]
akt=[(j(xx0,yy0,x.change_ring(FC)+xx0,0,dd)) for j in Aka]
akt=[sum([a[0].abs()*RX(a[1]) for a in R(hh)]) for hh in akt]
a1t=-akt[1]+2*akt[1].coeffs()[0]
akt[1]=a1t
L=filter(lambda a: a!=0,akt)
chequea=False
h=1
while not chequea:
chequea=True
k=2
while chequea and k<len(L):
L1=(L[k](h)*L[0](h)^(k-1))
L2=(QQ(0.157670780786)^k*factorial(k)*L[1](h))
if not L2>=L1:
chequea=False
k+=1
h=h/2
else:
h=F(stepx)
t+=h/d
if uno:
sigue=False
if t>F(1):
t=F(1)
uno=True
xj=x0*(1-t)+x1*t
y0+=d0*(xj-xi)
xi=xj
return puntos
}}}
It is a code i am writing for computing braid monodromy of curves.
If i run it with, for example, this input:
{{{
R.<x,y>=QQ[]
f=-y^3+x^2
time trenza(f,[1,I,-1,-I,1],exact=False,step=0.5)
}}}
I usually get the answer in a few seconds, but if i repeat several times
the same computation, at some point it freezes, as if it was computing for
a long time.
When i interrupt the computation i get the following traceback:
{{{
^C
^CTraceback (most recent call last):
File "<stdin>", line 1, in <module>
File "_sage_input_33.py", line 10, in <module>
exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8
-*-\\n" +
_support_.preparse_worksheet_cell(base64.b64decode("dGltZSB0cmVuemEoZixbMSxJLC0xLC1JLDFdLGV4YWN0PUZhbHNlLHN0ZXA9MC41KQ=="),globals())+"\\n");
execfile(os.path.abspath("___code___.py"))
File "", line 1, in <module>
File "/tmp/tmpFpew9q/___code___.py", line 3, in <module>
exec compile(u'__time__=misc.cputime(); __wall__=misc.walltime();
trenza(f,[_sage_const_1 ,I,-_sage_const_1 ,-I,_sage_const_1
],exact=False,step=_sage_const_0p5 ); print "Time: CPU %.2f s, Wall: %.2f
s"%(misc.cputime(__time__), misc.walltime(__wall__))
File "", line 1, in <module>
File "/tmp/tmpOfjSpn/___code___.py", line 5, in trenza
return trenza(f,points[:_sage_const_2
],exact,step,precision)*trenza(f,points[_sage_const_1
:],exact,step,precision)
File "/tmp/tmpOfjSpn/___code___.py", line 21, in trenza
l=list(siguehilo(args))
File "/home/mmarco/sage-5.7.beta3/local/lib/python2.7/site-
packages/sage/parallel/use_fork.py", line 189, in __call__
os.wait()
File "c_lib.pyx", line 68, in sage.ext.c_lib.sage_python_check_interrupt
(sage/ext/c_lib.c:736)
KeyboardInterrupt
__SAGE__
}}}
I really don't know how to catch the bug, and how to debug it.
--
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/14154>
Sage <http://www.sagemath.org>
Sage: Creating a Viable Open Source Alternative to Magma, Maple, Mathematica,
and MATLAB
--
You received this message because you are subscribed to the Google Groups
"sage-trac" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sage-trac?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.