drt@chinet.chi.il.us (Donald Tveter) (11/25/90)
Here are some bugs and oversights for my fast back-propagation
source that was posted a few months ago:
First, someone found that on some machines that doing a second 'n'
command to erase old patterns and replace them with new ones causes
a core dump. This doesn't happen everywhere and not on SysV, I guess,
although it ought to happen everywhere! The problem was that a pointer
becomes NULL. The following procedure, nullpatterns now has the bug
fixed so you can just replace the old nullpatterns (file misc.c) with
this new one:
void nullpatterns() /* dispose of any patterns before reading more */
{
PATLIST *pl, *nextpl;
PATNODE *pn, *nextpn;
if (start->patstart != NULL)
{
pl = start->patstart;
while (pl != NULL)
{
nextpl = pl->next;
pn = pl->pats;
while (pn != NULL)
{
nextpn = pn->next;
free(pn);
pn = nextpn;
};
free(pl);
pl = nextpl;
};
pl = last->patstart;
while (pl != NULL)
{
nextpl = pl->next;
pn = pl->pats;
while (pn != NULL)
{
nextpn = pn->next;
free(pn);
pn = nextpn;
};
free(pl);
pl = nextpl;
};
};
start->patstart = NULL;
last->patstart = NULL;
npats = 0;
prevnpats = 0;
}
-------------------
Second, someone found that when you set the output format to be
the summary format you can't set it back to the non-summary format.
The problem is due to the following line in the file bp.c, in the
procedure cmdloop under case 'f':
if (ch == '+' || summary == '-') summary = ch;
This should be changed to:
if (ch == '+' || ch == '-') summary = ch;
-------------------
Third, there are commands where you can get a core dump if
there is no network or no patterns. My philosophy has been that
anyone that does something like this deserves a core dump :-)
but I suppose I should become sensitive to users, so I wrote two
little functions to detect these conditions and give a helpful
message. These two functions can be placed before the procedure
cmdloop in the file bp.c:
int nonetwork()
{
if (start != NULL) return(0);
printf("there is no network\n");
return(1);
}
int nopatterns()
{
if (npats != 0) return(0);
printf("there are no patterns\n");
return(1);
}
Then for the commands C,c,H,k,l,n,p,R,T,W,w and x (not all of these
will core dump but I guess a warning is appropriate) I added a line
at the beginning of the command like this one for C:
case 'C': if (nonetwork()) break;
Furthermore, for the P and r commands I added this:
if (nonetwork() || nopatterns()) break;
Then for the S command I changed the code to the following:
if (itemp == 0)
if(nonetwork()) break; else saveweights();
else saverate = itemp;
-------------------
Don Tveter
5228 N. Nashville Ave.
Chicago, Illinois 60656
drt@chinet.chi.il.us