static void substituteDestruct(void *pvt) { subInfo *psubInfo = (subInfo *)pvt; freeSubFile(psubInfo); freePattern(psubInfo); free((void *)psubInfo); return; }
static char *substituteGetReplacements(void *pvt) { subInfo *psubInfo = (subInfo *)pvt; subFile *psubFile = psubInfo->psubFile; patternNode *ppatternNode; if(psubInfo->macroReplacements) psubInfo->macroReplacements[0] = 0; psubInfo->curLength = 0; while(psubFile->token==tokenSeparater) subGetNextToken(psubFile); if(psubFile->token==tokenRBrace && psubInfo->isFile) { psubInfo->isFile = 0; free((void *)psubInfo->filename); psubInfo->filename = 0; freePattern(psubInfo); subGetNextToken(psubFile); return(0); } if(psubFile->token==tokenEOF) return(0); if(psubFile->token!=tokenLBrace) return(0); if(psubInfo->isPattern) { int gotFirstPattern = 0; while(subGetNextToken(psubFile)==tokenSeparater); ppatternNode = (patternNode *)ellFirst(&psubInfo->patternList); while(1) { if(psubFile->token==tokenRBrace) { if(ppatternNode) subFileErrPrint(psubFile,"less values than patterns"); subGetNextToken(psubFile); return(psubInfo->macroReplacements); } if(psubFile->token!=tokenString) { subFileErrPrint(psubFile,"Illegal token"); exit(-1); } if(gotFirstPattern) catMacroReplacements(psubInfo,","); gotFirstPattern = 1; if(ppatternNode) { catMacroReplacements(psubInfo,ppatternNode->var); catMacroReplacements(psubInfo,"="); catMacroReplacements(psubInfo,psubFile->string); ppatternNode = (patternNode *)ellNext(&ppatternNode->node); } else { subFileErrPrint(psubFile,"more values than patterns"); } while(subGetNextToken(psubFile)==tokenSeparater); } } else while(1) { switch(subGetNextToken(psubFile)) { case tokenRBrace: subGetNextToken(psubFile); return(psubInfo->macroReplacements); case tokenSeparater: catMacroReplacements(psubInfo,","); break; case tokenString: catMacroReplacements(psubInfo,psubFile->string); break; default: subFileErrPrint(psubFile,"Illegal token"); exit(1); } } }
static int substituteGetNextSet(void *pvt,char **filename) { subInfo *psubInfo = (subInfo *)pvt; subFile *psubFile = psubInfo->psubFile; patternNode *ppatternNode; *filename = 0; while(psubFile->token==tokenSeparater) subGetNextToken(psubFile); if(psubFile->token==tokenEOF) return(0); if(psubFile->token==tokenString && strcmp(psubFile->string,"file")==0) { psubInfo->isFile = 1; if(subGetNextToken(psubFile)!=tokenString) { subFileErrPrint(psubFile,"Expecting filename"); exit(1); } freePattern(psubInfo); free((void *)psubInfo->filename); if(psubFile->string[0]=='"'&&psubFile->string[strlen(psubFile->string)-1]=='"') { psubFile->string[strlen(psubFile->string)-1]='\0'; psubInfo->filename = macEnvExpand(psubFile->string+1); } else { psubInfo->filename = macEnvExpand(psubFile->string); } while(subGetNextToken(psubFile)==tokenSeparater); if(psubFile->token!=tokenLBrace) { subFileErrPrint(psubFile,"Expecting {"); exit(1); } subGetNextToken(psubFile); } *filename = psubInfo->filename; while(psubFile->token==tokenSeparater) subGetNextToken(psubFile); if(psubFile->token==tokenLBrace) return(1); if(psubFile->token==tokenRBrace) return(0); if(psubFile->token!=tokenString || strcmp(psubFile->string,"pattern")!=0) { subFileErrPrint(psubFile,"Expecting pattern"); exit(1); } freePattern(psubInfo); psubInfo->isPattern = 1; while(subGetNextToken(psubFile)==tokenSeparater); if(psubFile->token!=tokenLBrace) { subFileErrPrint(psubFile,"Expecting {"); exit(1); } while(1) { while(subGetNextToken(psubFile)==tokenSeparater); if(psubFile->token!=tokenString) break; ppatternNode = calloc(1,sizeof(patternNode)); ellAdd(&psubInfo->patternList,&ppatternNode->node); ppatternNode->var = calloc(strlen(psubFile->string)+1,sizeof(char)); strcpy(ppatternNode->var,psubFile->string); } if(psubFile->token!=tokenRBrace) { subFileErrPrint(psubFile,"Expecting }"); exit(1); } subGetNextToken(psubFile); return(1); }
int main(int argc, char **argv) { Perceptron perceptron; FILE *output = NULL; FILE *input = NULL; float fractionLearn = 0; float learnRate = 0.1; float errorTolerance = 0.1; int i; float threshold = 0.8; Pattern patterns; /* comprueba la linea de comandos */ for (i = 1; i < argc; i++) { if (strcmp("-input", argv[i])==0) { input = fopen(argv[i+1], "r"); } else if (strcmp("-output", argv[i])==0) { output = fopen(argv[i+1], "w"); } else if (strcmp("-part", argv[i])==0) { fractionLearn = atof(argv[i+1]); } else if (strcmp("-learnrate", argv[i])==0) { learnRate = atof(argv[i+1]); } else if (strcmp("-threshold", argv[i])==0) { threshold = atof(argv[i+1]); } else if (strcmp("-tolerance", argv[i])==0) { errorTolerance = atof(argv[i+1]); } } if (input == NULL || output == NULL) { printf("USO: %s -input <f_entrada> -output <f_salida> [-part <porcentaje_aprendizaje>] [-learnrate <tasa_aprendizaje>] [-threshold <umbral>]\n", argv[0]); exit(0); } if ((fractionLearn < 0.0 || fractionLearn > 1) || (learnRate <= 0)) { fprintf(stderr, "ERROR: Valor de porcentaje de aprendizaje (0,1] o factor de aprendizaje ( >0 )\n"); exit(0); } if (!createPattern(input, &patterns)) { fprintf(stderr, "ERROR: Error en la lectura de patrones\n"); exit(0); } fclose(input); fclose(output); createPerceptron(&perceptron, 0, patterns.numAttributes, 1); initWeightsAdaline(&perceptron); printf("\n##################LEARN##################\n"); learnAdaline(&perceptron, learnRate, threshold, &patterns, patterns.numPatterns*fractionLearn, errorTolerance); printf("\n##################TEST##################\n"); test(&perceptron, &patterns, ((int)(patterns.numPatterns*fractionLearn)) % patterns.numPatterns); deletePerceptron(&perceptron); freePattern(&patterns); return 0; }