/*
 * 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 <signal.h>
#include <math.h>
#include <sys/types.h>
#include <sys/file.h>
#include <sys/types.h>
#ifdef X
#include "X/box.h"
#endif
#include "defs.h"
#include <signal.h>

extern int     nolearn;
extern int     sequential;
extern int     printout;
extern int     interactive;
extern int     update;
extern int     rbp;
extern int     pcomp;
extern int     all_linear;
extern int     context;
extern int     nobias;
extern int     bipolar;
extern int     decayflag;
extern int     width;
extern int     only;
extern int     height;
extern int     dispout;
extern int     disphid;
extern int     linflag;
extern int     errsig;
extern int     debug;
extern int     array;
extern int     continuous;
extern int     advance;
extern long     check;
extern char    fileroot[128];
extern char    loadfile[128];
extern long     sweeps;
extern int     printhid;
extern float   momentum;
extern float   rate;
extern int     box;
extern char    title[80];
extern float   noise;
extern int     autoen;
extern int     testall;
extern int     no_cmd;
extern long     seed;
extern int     pat_err;
extern int     ecount;


argvec(argc, argv)
	int     argc;
	char  **argv;
{
	extern	long atol();
	extern char *optarg;
	int     c;

	while ((c = getopt(argc, argv,
	    "oUMFWtIim:X:PBbSR:h:w:OLeD:aNC:c:l:f:s:r:dgG:p:T:n:E:A")) != EOF) {
		switch (c) {
		case 't':		    /* test all patterns */
			testall++;
			nolearn++;
			sequential++;
			printout++;
			break;
		case 'I':		    /* interactive */
			interactive = 1;
			break;
		case 'U':
			update = 1;
			sequential++;
			break;
		case 'F':
			rbp = 1;
			break;
		case 'W':
			pcomp = 1;
			break;
		case 'M':
			all_linear = 1;
			break;
		case 'X':
			context = atoi(optarg);
			break;
		case 'B':
			nobias++;
			break;
		case 'b':
			bipolar++;
			break;
		case 'S':
			sequential++;
			break;
		case 'i':
			no_cmd++;
			break;
		case 'd':
			decayflag++;
			break;
		case 'w':
			width = atoi(optarg);
			break;
		case 'o':
			only = 1;
			break;
		case 'h':
			height = atoi(optarg);
			break;
		case 'O':
			dispout = 1;
			disphid = 0;
			break;
		case 'R':
			seed = atol(optarg);
			break;
		case 'L':
			linflag = LINEAR;
			break;
		case 'P':
			pat_err = 1;
			break;
		case 'E':
			ecount = atoi(optarg);
			errsig++;
			break;
		case 'e':
			errsig++;
			break;
		case 'D':
			debug = atoi(optarg);
			/*print_rc(name, "/usr/local/lib/rlearn.defs");*/
			break;
		case 'a':
			array++;
			break;
		case 'N':
			nolearn++;
			break;
		case 'C':
			continuous++;
			advance = atoi(optarg);
			break;
		case 'c':
			check = atol(optarg);
			break;
		case 'f':
			strcpy(fileroot, optarg);
			break;
		case 'l':
			strcpy(loadfile, optarg);
			break;
		case 's':
			sweeps = atol(optarg);
			break;
		case 'p':
			if (optarg[0]=='o')
				printout++;
			else if (optarg[0]=='h')
				printhid++;
			break;
		case 'm':
			momentum = (float) atof(optarg);
			break;
		case 'r':
			rate = (float) atof(optarg);
			break;
		case 'g':
			box++;
			disphid = 1;
			break;
		case 'T':
			strcpy(title, optarg);
			break;
		case 'n':
			noise = (float) atof(optarg);
			break;
		case 'A':
			autoen++;
			break;
		case '?':
		default:
			usage();
			exit(2);
			break;
		}
	}
}

usage()
{
	fprintf(stderr, "-f \tfileroot: specify fileroot\n");
	fprintf(stderr, "-c #: \tcheckpoint weights file every # sweeps\n");
	fprintf(stderr, "-s #:\trun for # sweeps\n");
	fprintf(stderr, "-l \tweightfile:\tload in weightfile\n");
	fprintf(stderr, "-N:\tno learning\n");
	fprintf(stderr, "-po:\tprint output activations on every trial\n");
	fprintf(stderr, "-ph:\tprint hidden unit activations on every trial\n");
	fprintf(stderr, "-r #:\tuse learning rate #\n");
	fprintf(stderr, "-R #:\tuse # to seed random() \n");
	fprintf(stderr, "-i:\tignore .cmd file \n");
	fprintf(stderr, "-t:\ttest all patterns = -N -S -po -s#_of_tokens\n");
	fprintf(stderr, "-B:\tdon't compute biases\n");
	fprintf(stderr, "-b:\tbipolar - output ranges from -1 to 1\n");
	fprintf(stderr, "-S:\tscan through patterns sequentially\n");
	fprintf(stderr, "-T \ttitle:\ttitle for box display\n");
	fprintf(stderr, "-L:\tlinear output units\n");
	fprintf(stderr, "-d:\tdecays specified in .cf file\n");
	fprintf(stderr, "-e:\trecord mean squared error in .err file every 1000 cyc\n");
	fprintf(stderr, "-E #:\trecord mean squared error in .err file every # cyc\n");
	fprintf(stderr, "-D #:\trun with debug level #\n");
	fprintf(stderr, "-m #:\tset momentum to # (between 0 and 1)\n");
	fprintf(stderr, "-a:\t.cf specifies network by hand\n");
	fprintf(stderr, "-C #:\tadvance thru patterns # bits at a time\n");
	fprintf(stderr, "-P :\tprint pattern (mean squared) error\n");
	fprintf(stderr, "-w #:\twidth of graphics boxes\n");
	fprintf(stderr, "-h #:\theight of graphics boxes\n");
	fprintf(stderr, "-O:\tgraphic display of output units\n");
	fprintf(stderr, "-U:\tupdate error only after each epoch\n");
	fprintf(stderr, "-F:\tfully interconnect network (rbp algorithm)\n");
	fprintf(stderr, "-o:\tread .only file learn (requires -a)\n");
	fprintf(stderr, "-M:\tall units linear (requires -a)\n");
	/*
	fprintf(stderr, "-W:\tdo pattern completion\n");
	*/
	fprintf(stderr, "-n #:\tadd in # noise factor\n");
	fprintf(stderr, "-A:\tautoencoding mode\n");
}
