/* Modified by CKM on 10/1/96 from gdrnet.c */ /* Implements backprop algorithm */ #include #include #include #ifndef VAX /* for declaration of calloc() on PC or compatible */ #include #endif #define MAX_NUM_OF_HIDDEN_LAYERS 5 #define MAX_NUM_OF_OUTPUT_NODES 50 #define MAX_NUM_OF_INPUT_SAMPLES 3000 #define MAX_NUM_OF_INPUT_NODES 50 #define EXIT_WITH_SUCCESS 3 #define RESTART 2 #define EXIT_WITH_FAILURE 1 #define CONTINUE_CALCULATION 0 float learning_rate; float momentum_rate; float normalized_error; float max_total_error; float max_error_per_pattern; /** max allowed pattern error **/ float *wtptr[MAX_NUM_OF_HIDDEN_LAYERS+1]; float *outptr[MAX_NUM_OF_HIDDEN_LAYERS+2]; float *errptr[MAX_NUM_OF_HIDDEN_LAYERS+2]; float *delw[MAX_NUM_OF_HIDDEN_LAYERS+1]; float target[MAX_NUM_OF_INPUT_SAMPLES][MAX_NUM_OF_OUTPUT_NODES]; float input [MAX_NUM_OF_INPUT_SAMPLES] [MAX_NUM_OF_INPUT_NODES], ep[MAX_NUM_OF_INPUT_SAMPLES]; float outpt [MAX_NUM_OF_INPUT_SAMPLES] [MAX_NUM_OF_OUTPUT_NODES]; int nunit[MAX_NUM_OF_HIDDEN_LAYERS+2], nhlayer, ninput, ninattr, noutattr; int result, cnt, cnt_num; int nsnew, nsold; char task_name[20]; FILE *fp1, *fp2, *fp3, *fopen(); int fplot10; /* pseudo-random number generator */ long randseed = 568731L; int random() { randseed = 15625L * randseed + 22221L; return((randseed >> 16) & 0x7FFF); } /* allocate dynamic storage for the net */ init() { int len1, len2, i, k; float *p1, *p2, *p3, *p4; len1 = len2 = 0; nunit[nhlayer+2] = 0; for (i=0; i<(nhlayer + 2); i++) { len1 += (nunit[i] +1) * nunit[i+1]; len2 += nunit[i] + 1; } /* weights */ p1=(float *) calloc(len1+1,sizeof(float)); /* output */ p2=(float *) calloc(len2+1,sizeof(float)); /* errors */ p3=(float *) calloc(len2+1,sizeof(float)); /* delw */ p4=(float *) calloc(len1+1,sizeof(float)); /* set up initial pointers */ wtptr[0] = p1; outptr[0] = p2; errptr[0] = p3; delw[0] = p4; /* set up the rest of pointers */ for (i=1 ; i<(nhlayer +1) ; i++) { wtptr[i] = wtptr[i-1] + nunit[i] * (nunit[i-1] +1); delw[i] = delw[i-1] + nunit[i] * (nunit[i-1] +1); } for (i = 1; i < (nhlayer+2); i++) { outptr[i] = outptr[i-1] + nunit[i-1] + 1; errptr[i] = errptr[i-1] + nunit[i-1] + 1; } /* set up threshold outputs */ for (i = 0; i < nhlayer +1; i++) { *(outptr[i] + nunit[i]) = 1.0; } } /* initialize weights with random numbers between -0.5 and +0.5 */ initwt() { int i,j; for (j = 0; j