
/*
 * Copyright (1987) Jeff Elman.  University of California, San Diego
 * This software may be redistributed without charge; this notice
 * should be preserved.
 */

#include <stdio.h>
#include "defs.h"

extern	int debug;

saveweights2(fileroot)
	char	*fileroot;
{
	FILE	*fopen();
	FILE	*fp;
	int	i;
	int	j;

	extern	float **weightp;
	extern	float *biasp;
	extern	long run;
	extern	int numtotal;
	float	**wpp;
	float	*wp;
	float	*bp;
	char	filename[128];

#ifdef ibmpc
	sprintf(filename, "%ld.%.3s", run, fileroot);
#else
	sprintf(filename, "%s.%ld.wts", fileroot, run);
#endif
	if ((fp=fopen(filename, "w+")) == NULL) {
		perror(filename);
		exit(1);
	}
	fprintf(fp, "NETWORK CONFIGURED BY HAND\n");
	fprintf(fp, "# weights after %ld runs\n", run);
	fprintf(fp, "# WEIGHTS\n");
	/*
	 * new way, weights from bottom up
	 */
	for (i=0, wpp=weightp; i<numtotal; i++, wpp++) {
		fprintf(fp, " from unit %d\n", i);
		for (j=0, wp= *wpp; j<numtotal; j++, wp++) {
			fprintf(fp, "%f\n", *wp);
		}
	}
	fprintf(fp, "# BIASES\n");
	for (i=0, bp=biasp; i<numtotal; i++, bp++) {
		fprintf(fp, "%f\n", *bp);
	}
		
	fflush(fp);
	fclose(fp);
}


loadweights2(loadfile)
	char	*loadfile;
{
	extern	float **weightp;
	extern	float *biasp;
	extern	long run;
	extern	long sweeps;
	extern	int numtotal;
	FILE	*fopen();
	FILE	*fp;
	register int i;
	register int j;
	float	**wpp;
	float	*wp;
	float	*bp;
	char	hand[10];
	int	nread;

	if ((fp=fopen(loadfile, "r")) == NULL) {
		perror(loadfile);
		exit(1);
	}
	if (fscanf(fp, "NETWORK CONFIGURED BY %s\n", hand) != 1)
		inputerr(loadfile, "header");
	if (strcmp(hand, "HAND") != 0) {
		fprintf(stdout, "Saved weights not for hand-configured network\n");
		exit(1);
	}
	fscanf(fp, "# weights after %ld runs\n", &run);
	fscanf(fp, "# WEIGHTS\n");
	sweeps += run;
	/*
	 * new way, weights from bottom up
	 */
	for (i=0, wpp=weightp; i<numtotal; i++, wpp++) {
		nread = 0;
		if (fscanf(fp, " from unit %*d\n") == EOF)
			inputerr(loadfile, "premature EOF");
		for (j=0, wp= *wpp; j<numtotal; j++, wp++) {
			nread += fscanf(fp, "%f\n", wp);
			if (debug > 10)
				fprintf(stdout, "%f ", *wp);
		}
		if (nread != numtotal)
			inputerr(loadfile, "weights");
		if (debug > 10)
			fprintf(stdout, "\n");
	}
	if (fscanf(fp, "# BIASES\n") == EOF)
		inputerr(loadfile, "premature EOF");
	nread = 0;
	for (i=0, bp=biasp; i<numtotal; i++, bp++) {
		nread += fscanf(fp, "%f\n", bp);
		if (debug > 10)
			fprintf(stdout, "%f\n", *bp);
	}
	if (nread != numtotal)
		inputerr(loadfile, "bias values");
}
