| David Bremner on Sun, 3 Dec 2000 10:58:00 -0400 (AST) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| excessive gp heap usage? |
I have a gp script whose heap usage seems to grow uncontrollably.
I am very new to gp, so I am hoping someone can see right away
what I am doing wrong. I am running under FreeBSD; both 2.0.20 (beta)
and 2.1 exhibit the same behaviour. I looked at all the references
to heap I could find in the manual, but nothing jumped out at me.
If you want to see the problem, read in the attached script, and
run search(6); actually even search(5) leaves about 70000 objects in
the heap.
Thanks for any suggestions.
global(M,nodes,Sol,fullfacet,topfacet,botfacet);
init(d)=
{
M=matrix(2*d,d);
nodes=0;
Sol=listcreate(10);
M[d+1,2]=-1;
for(i=1,d, [ M[d+i,1]=1, M[i,1]=-1, M[1,i]=-1 ]);
for(i=2,d, [ M[i,i]=1, M[d+i,i]=-1 ]);
fullfacet=1;
topfacet=vector(d,j,compmask(component(M,j),1));
botfacet=vector(d,j,compmask(component(M,j),-1));
}
search(d)=
{
init(d);
complete(M,1,1,fullfacet,topfacet,botfacet);
}
compmask(v,val)=
{
local(mask);
mask=0;
for(i=1,matsize(v)[1],mask=bitor(mask,(v[i]==val)*2^(i-1)));
return(mask);
}
checkrank(Mp,j,rowmask,tfacet,bfacet)=
{
local(T,B);
T=mattranspose(vecextract(mattranspose(Mp),bitand(rowmask,tfacet[j])));
B=mattranspose(vecextract(mattranspose(Mp),bitand(rowmask,bfacet[j])));
return( ( matrank(T)==matsize(T)[1] && matrank(B)==matsize(B)[1] ));
}
checkopposite(Mp,rowmask)=
{
local(F);
F=mattranspose(vecextract(mattranspose(Mp),rowmask));
return( matrank(F) == matsize(F)[1] );
}
check(Mp,rowmask,tfacet,bfacet)=
{
local(jj);
ok=checkopposite(Mp,rowmask);
if (!ok, return(0));
for (jj=1,matsize(Mp)[2],
if (!checkrank(Mp,jj,rowmask,tfacet,bfacet), return(0)));
return(1);
}
complete(Mp,i,j,rowmask,tfacet,bfacet)=
{
local(rowfinished);
rowfinished=0;
nodes++;
if (nodes % 1000 == 0,
print(nodes,";",i,";",j,";",rowmask,tfacet,bfacet,getheap()));
\\ Boundary conditions for recursion
if (j==matsize(Mp)[2], rowmask=bitor(rowmask, 2^(i-1)); rowfinished=1);
if (j>matsize(Mp)[2], return(complete(Mp,i+1,1,rowmask,tfacet,bfacet) ));
if (i>matsize(Mp)[1], listput(Sol,Mp); return(1) );
if(Mp[i,j]!=0, return(complete(Mp,i,j+1,rowmask,tfacet,bfacet)));
Mp[i,j]=1;
tfacet[j]=bitor(tfacet[j],2^(i-1));
if ((newrow==0) || check(Mp,rowmask,tfacet,bfacet),
complete(Mp,i,j+1,rowmask,tfacet,bfacet));
tfacet[j]=bitxor(tfacet[j],2^(i-1));
Mp[i,j]=-1;
bfacet[j]=bitor(bfacet[j],2^(i-1));
if ((newrow==0) || check(Mp,rowmask,tfacet,bfacet),
complete(Mp,i,j+1,rowmask,tfacet,bfacet));
bfacet[j]=bitxor(bfacet[j],2^(i-1));
Mp[i,j]=0;
return(0);
}