From 9a888d99df82da25733cfa0ec009cb21f86c26f0 Mon Sep 17 00:00:00 2001 From: kbecke23 Date: Wed, 23 May 2018 11:04:00 +0200 Subject: [PATCH] updated cpp src-code and uploading cpp .exe and renamed cs .exe --- bin/CPP_NLMS.exe | Bin 0 -> 61440 bytes ...S_NMLS_with_UI.exe => CS_NLMS_with_UI.exe} | Bin src/cpp_implementation/NLMSvariants.cpp | 495 +++++++++--------- 3 files changed, 250 insertions(+), 245 deletions(-) create mode 100644 bin/CPP_NLMS.exe rename bin/{CS_NMLS_with_UI.exe => CS_NLMS_with_UI.exe} (100%) diff --git a/bin/CPP_NLMS.exe b/bin/CPP_NLMS.exe new file mode 100644 index 0000000000000000000000000000000000000000..c5573c5360c572c04c66f7a5e024329e534524fb GIT binary patch literal 61440 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 TU0GU8jQz$qFvfv@EeHM|opMSQ literal 0 HcmV?d00001 diff --git a/bin/CS_NMLS_with_UI.exe b/bin/CS_NLMS_with_UI.exe similarity index 100% rename from bin/CS_NMLS_with_UI.exe rename to bin/CS_NLMS_with_UI.exe diff --git a/src/cpp_implementation/NLMSvariants.cpp b/src/cpp_implementation/NLMSvariants.cpp index a6ad46e..806ec2e 100644 --- a/src/cpp_implementation/NLMSvariants.cpp +++ b/src/cpp_implementation/NLMSvariants.cpp @@ -11,7 +11,6 @@ Created by Stefan Friese on 26.04.2018 #include #include #include -//#include // DBL_MAX #include "nlms_types.h" // added types #define RGB_COLOR 255 @@ -24,45 +23,45 @@ double *xSamples; // Input values mldata_t *mlData = NULL; // Machine learning point_t *points = NULL; // Graphing -/* *graph building* */ + /* *graph building* */ static imagePixel_t * rdPPM(char *fileName); // Read PPM file format void mkPpmFile(char *fileName, imagePixel_t *image); // Writes PPM file int ppmColorChannel(FILE* fp, imagePixel_t *image, // Writes colorChannel from PPM file to log file - char *colorChannel, mldata_t *mlData); + char *colorChannel, mldata_t *mlData); void colorSamples(FILE* fp, mldata_t *mlData); // Stores color channel values in xSamples -/* *file handling* */ -char * mkFileName ( char* buffer, - size_t max_len, int suffixId ); -char *fileSuffix ( int id ); -char *fileHeader ( int id ); // Header inside the logfiles -//void myLogger ( FILE* fp, point_t points[] ); + /* *file handling* */ +char * mkFileName(char* buffer, + size_t max_len, int suffixId); +char *fileSuffix(int id); +char *fileHeader(int id); // Header inside the logfiles + //void myLogger ( FILE* fp, point_t points[] ); void bufferLogger(char *buffer, point_t points[]); // Writes points to graph template -void mkSvgGraph ( point_t points[] ); // Parses graph template and calls bufferLogger() -void weightsLogger ( double *weights, int suffix ); // Writes updated weights to a file +void mkSvgGraph(point_t points[]); // Parses graph template and calls bufferLogger() +void weightsLogger(double *weights, int suffix); // Writes updated weights to a file -/* *rand seed* */ -double r2 ( void ); // Random val between 0 and 1 -double rndm ( void ); + /* *rand seed* */ +double r2(void); // Random val between 0 and 1 +double rndm(void); /* *args parser* */ -void usage ( char **argv ); // Help text called by args parser +void usage(char **argv); // Help text called by args parser -/* *math* */ + /* *math* */ mldata_t * init_mldata_t(unsigned windowSize, unsigned samplesCount, double learnrate); double sum_array(double x[], int length); -void localMean ( mldata_t *mlData,point_t points[] ); // First, -void directPredecessor ( mldata_t *mlData, point_t points[] ); // Second, -void differentialPredecessor ( mldata_t *mlData, point_t points[] ); // Third filter implementation +void localMean(mldata_t *mlData, point_t points[]); // First, +void directPredecessor(mldata_t *mlData, point_t points[]); // Second, +void differentialPredecessor(mldata_t *mlData, point_t points[]); // Third filter implementation double *popNAN(double *xError); // Returns array without NAN values, if any exist double windowXMean(int _arraylength, int xCount); // Returns mean value of given window -int main( int argc, char **argv ) { - char *colorChannel = (char *) malloc(sizeof(char)* 32); +int main(int argc, char **argv) { + char *colorChannel = (char *)malloc(sizeof(char) * 32); char *inputfile = (char *)malloc(sizeof(char) * 32); unsigned *seed = NULL; unsigned k, xclude = 0; @@ -72,68 +71,68 @@ int main( int argc, char **argv ) { colorChannel = stdcolor; unsigned int uint_buffer[1], windowBuffer[1]; double learnrate = 0.4; - - - while( (argc > 1) && (argv[1][0] == '-') ) { // Parses parameters from stdin - switch( argv[1][1] ) { - case 'i': - inputfile = &argv[1][3]; - ++argv; - --argc; - break; - case 'w': - sscanf(&argv[1][3], "%u", windowBuffer); - windowSize = windowBuffer[0]; - ++argv; - --argc; - break; - case 'c': - colorChannel = &argv[1][3]; - ++argv; - --argc; - break; - case 's': - sscanf(&argv[1][3], "%u", uint_buffer); - seed = &uint_buffer[0]; - ++argv; - --argc; - break; - case 'n': - sscanf(&argv[1][3], "%u", &samplesCount); - ++argv; - --argc; - break; - case'h': - printf("Program name: %s\n", argv[0]); - usage(argv); - break; - case 'l': - sscanf(&argv[1][3], "%lf", &learnrate); - ++argv; - --argc; - break; - case 'x': - sscanf(&argv[1][3], "%s", xBuffer); - xclude = 1; - ++argv; - --argc; - break; - default: - printf("Wrong Arguments: %s\n", argv[1]); - usage(argv); - } - + + + while ((argc > 1) && (argv[1][0] == '-')) { // Parses parameters from stdin + switch (argv[1][1]) { + case 'i': + inputfile = &argv[1][3]; + ++argv; + --argc; + break; + case 'w': + sscanf(&argv[1][3], "%u", windowBuffer); + windowSize = windowBuffer[0]; + ++argv; + --argc; + break; + case 'c': + colorChannel = &argv[1][3]; + ++argv; + --argc; + break; + case 's': + sscanf(&argv[1][3], "%u", uint_buffer); + seed = &uint_buffer[0]; + ++argv; + --argc; + break; + case 'n': + sscanf(&argv[1][3], "%u", &samplesCount); + ++argv; + --argc; + break; + case'h': + printf("Program name: %s\n", argv[0]); + usage(argv); + break; + case 'l': + sscanf(&argv[1][3], "%lf", &learnrate); + ++argv; + --argc; + break; + case 'x': + sscanf(&argv[1][3], "%s", xBuffer); + xclude = 1; + ++argv; + --argc; + break; + default: + printf("Wrong Arguments: %s\n", argv[1]); + usage(argv); + } + ++argv; --argc; } - init_mldata_t ( windowSize, samplesCount, learnrate ); - xSamples = (double *) malloc ( sizeof(double) * mlData->samplesCount ); // Resize input values - points = (point_t *) malloc ( sizeof(point_t) * mlData->samplesCount); // Resize points - imagePixel_t *image; + init_mldata_t(windowSize, samplesCount, learnrate); + xSamples = (double *)malloc(sizeof(double) * mlData->samplesCount); // Resize input values + points = (point_t *)malloc(sizeof(point_t) * mlData->samplesCount); // Resize points + imagePixel_t *image; image = rdPPM(inputfile); // Set Pointer on input values - printf("window Size: %d\n", mlData->windowSize); + printf("window Size: %d\n", mlData->windowSize); char fileName[50]; // Logfiles and their names mkFileName(fileName, sizeof(fileName), TEST_VALUES); FILE* fp5 = fopen(fileName, "w"); @@ -142,16 +141,17 @@ int main( int argc, char **argv ) { FILE* fp6 = fopen(fileName, "r"); colorSamples(fp6, mlData); - if ( (seed != NULL) ){ - srand( *seed ); // Seed for random number generating + if ((seed != NULL)) { + srand(*seed); // Seed for random number generating printf("srand is reproducable\n"); - } else { - srand( (unsigned int)time(NULL) ); + } + else { + srand((unsigned int)time(NULL)); printf("srand depends on time\n"); // Default seed is time(NULL) } printf("generated weights:\n"); - for (k = 0; k < mlData->windowSize; k++) { + for (k = 0; k < mlData->windowSize; k++) { mlData->weights[k] = rndm(); // Init random weights printf("[%d] %lf\n", k, mlData->weights[k]); } @@ -160,20 +160,20 @@ int main( int argc, char **argv ) { mkFileName(fileName, sizeof(fileName), PURE_WEIGHTS); // Logfile weights FILE *fp0 = fopen(fileName, "w"); for (k = 0; k < mlData->windowSize; k++) { - fprintf(fp0, "[%d]%lf\n", k, mlData->weights[k]); + fprintf(fp0, "[%d]%lf\n", k, mlData->weights[k]); } fclose(fp0); /* *math magic* */ - localMean ( mlData, points ); - directPredecessor ( mlData, points); - differentialPredecessor( mlData, points ); + localMean(mlData, points); + directPredecessor(mlData, points); + differentialPredecessor(mlData, points); - if ( xclude == 0 ) { + if (xclude == 0) { mkSvgGraph(points); // Graph building - - } + + } free(image); free(xSamples); @@ -191,56 +191,56 @@ Variant (1/3), substract local mean. ====================================================================================================== */ -void localMean ( mldata_t *mlData, point_t points[] ) { - double *localWeights = (double *) malloc ( sizeof(double) * mlData->windowSize + 1); - memcpy ( localWeights, mlData->weights, mlData->windowSize ); // Copy weights so they can be changed locally - +void localMean(mldata_t *mlData, point_t points[]) { + double *localWeights = (double *)malloc(sizeof(double) * mlData->windowSize + 1); + localWeights = mlData->weights; // Copy weights so they can be changed locally + char fileName[50]; - double *xError = (double *) malloc ( sizeof(double) * mlData->samplesCount + 1); // Includes e(n) + double *xError = (double *)malloc(sizeof(double) * mlData->samplesCount + 1); // Includes e(n) memset(xError, 0.0, mlData->samplesCount); // Initialize xError-array with Zero - unsigned i, xCount = 0; // Runtime vars + unsigned i, xCount = 0; // Runtime vars mkFileName(fileName, sizeof(fileName), LOCAL_MEAN); // Create Logfile and its filename - FILE* fp4 = fopen(fileName, "w"); - fprintf( fp4, fileHeader(LOCAL_MEAN_HEADER) ); - - mkFileName ( fileName, sizeof(fileName), USED_WEIGHTS_LOCAL_MEAN); + FILE* fp4 = fopen(fileName, "w"); + fprintf(fp4, fileHeader(LOCAL_MEAN_HEADER)); + + mkFileName(fileName, sizeof(fileName), USED_WEIGHTS_LOCAL_MEAN); FILE *fp9 = fopen(fileName, "w"); - + double xMean = xSamples[0]; double xSquared = 0.0; double xPredicted = 0.0; double xActual = 0.0; - for ( xCount = 1; xCount < mlData->samplesCount; xCount++ ) { // First value will not get predicted - unsigned _arrayLength = ( xCount > mlData->windowSize ) ? mlData->windowSize + 1 : xCount; // Ensures corect length at start - xMean = (xCount > 0) ? windowXMean(_arrayLength, xCount) : 0; + for (xCount = 1; xCount < mlData->samplesCount-1; xCount++) { // First value will not get predicted + unsigned _arrayLength = (xCount > mlData->windowSize) ? mlData->windowSize + 1 : xCount; // Ensures corect length at start + xMean = (xCount > 0) ? windowXMean(_arrayLength, xCount) : 0; xPredicted = 0.0; xActual = xSamples[xCount]; - for ( i = 1; i < _arrayLength; i++ ) { // Get predicted value - xPredicted += ( localWeights[i - 1] * (xSamples[xCount - i] - xMean) ); + for (i = 1; i < _arrayLength; i++) { // Get predicted value + xPredicted += (localWeights[i - 1] * (xSamples[xCount - i] - xMean)); } - xPredicted += xMean; + xPredicted += xMean; xError[xCount] = xActual - xPredicted; // Get error value xSquared = 0.0; for (i = 1; i < _arrayLength; i++) { // Get xSquared xSquared += pow(xSamples[xCount - i] - xMean, 2); } - if ( xSquared == 0.0 ) { // Otherwise returns Pred: -1.#IND00 in some occassions + if (xSquared == 0.0) { // Otherwise returns Pred: -1.#IND00 in some occassions xSquared = 1.0; } - for ( i = 1; i < _arrayLength; i++ ) { // Update weights + for (i = 1; i < _arrayLength; i++) { // Update weights localWeights[i] = localWeights[i - 1] + mlData->learnrate * xError[xCount] // Substract localMean - * ( (xSamples[xCount - i] - xMean) / xSquared ); - fprintf( fp9, "%lf\n", localWeights[i] ); + * ((xSamples[xCount - i] - xMean) / xSquared); + fprintf(fp9, "%lf\n", localWeights[i]); } - + fprintf(fp4, "%d\t%f\t%f\t%f\n", xCount, xPredicted, xActual, xError[xCount]); // Write to logfile - + points[xCount].xVal[1] = xCount; // Save points so graph can be build later on - points[xCount].yVal[1] = xPredicted; + points[xCount].yVal[1] = xPredicted; points[xCount].xVal[4] = xCount; points[xCount].yVal[4] = xError[xCount]; @@ -249,8 +249,8 @@ void localMean ( mldata_t *mlData, point_t points[] ) { fclose(fp9); double *xErrorPtr = popNAN(xError); // delete NAN values from xError[] double xErrorLength = *xErrorPtr; // Watch popNAN()! - xErrorPtr[0] = 0.0; -// printf("Xerrorl:%lf", xErrorLength); + xErrorPtr[0] = 0.0; + // printf("Xerrorl:%lf", xErrorLength); double mean = sum_array(xErrorPtr, xErrorLength) / xErrorLength; // Mean double deviation = 0.0; @@ -260,7 +260,7 @@ void localMean ( mldata_t *mlData, point_t points[] ) { deviation /= xErrorLength; // Deviation printf("mean:%lf, devitation:%lf\t\tlocal Mean\n", mean, deviation); fprintf(fp4, "\nQuadratische Varianz(x_error): %f\nMittelwert:(x_error): %f\n\n", deviation, mean); // Write to logfile - free(localWeights); + //free(localWeights); free(xErrorPtr); free(xError); @@ -279,31 +279,32 @@ substract direct predecessor ====================================================================================================== */ -void directPredecessor( mldata_t *mlData, point_t points[]) { - double *localWeights = ( double * ) malloc ( sizeof(double) * mlData->windowSize + 1 ); - memcpy ( localWeights, mlData->weights, mlData->windowSize ); +void directPredecessor(mldata_t *mlData, point_t points[]) { + double *localWeights = (double *)malloc(sizeof(double) * mlData->windowSize + 1); + localWeights = mlData->weights; char fileName[512]; - double *xError = (double *) malloc ( sizeof(double) * mlData->samplesCount + 1 ); + double *xError = (double *)malloc(sizeof(double) * mlData->samplesCount + 1); + memset(xError, 0.0, mlData->samplesCount); unsigned xCount = 0, i; double xActual = 0.0; double xPredicted = 0.0; mkFileName(fileName, sizeof(fileName), DIRECT_PREDECESSOR); // Logfile and name handling FILE *fp3 = fopen(fileName, "w"); - fprintf( fp3, fileHeader(DIRECT_PREDECESSOR_HEADER) ); - - mkFileName ( fileName, sizeof(fileName), USED_WEIGHTS_DIR_PRED); + fprintf(fp3, fileHeader(DIRECT_PREDECESSOR_HEADER)); + + mkFileName(fileName, sizeof(fileName), USED_WEIGHTS_DIR_PRED); FILE *fp9 = fopen(fileName, "w"); - for (xCount = 1; xCount < mlData->samplesCount; xCount++) { // first value will not get predicted - unsigned _arrayLength = ( xCount > mlData->windowSize ) ? mlData->windowSize + 1 : xCount; + for (xCount = 1; xCount < mlData->samplesCount-1; xCount++) { // first value will not get predicted + unsigned _arrayLength = (xCount > mlData->windowSize) ? mlData->windowSize + 1 : xCount; xPredicted = 0.0; xActual = xSamples[xCount]; - + for (i = 1; i < _arrayLength; i++) { - xPredicted += ( localWeights[i - 1] * (xSamples[xCount - 1] - xSamples[xCount - i - 1])); + xPredicted += (localWeights[i - 1] * (xSamples[xCount - 1] - xSamples[xCount - i - 1])); } - + xPredicted += xSamples[xCount - 1]; xError[xCount] = xActual - xPredicted; @@ -311,32 +312,32 @@ void directPredecessor( mldata_t *mlData, point_t points[]) { for (i = 1; i < _arrayLength; i++) { xSquared += pow(xSamples[xCount - 1] - xSamples[xCount - i - 1], 2); // substract direct predecessor } - if ( xSquared == 0.0 ) { // Otherwise returns Pred: -1.#IND00 in some occassions + if (xSquared == 0.0) { // Otherwise returns Pred: -1.#IND00 in some occassions xSquared = 1.0; } - for ( i = 1; i < _arrayLength; i++ ) { // Update weights - localWeights[i] = localWeights[i-1] + mlData->learnrate * xError[xCount] - * ( (xSamples[xCount - 1] - xSamples[xCount - i - 1]) / xSquared); - fprintf( fp9, "%lf\n", localWeights[i] ); + for (i = 1; i < _arrayLength; i++) { // Update weights + localWeights[i] = localWeights[i - 1] + mlData->learnrate * xError[xCount] + * ((xSamples[xCount - 1] - xSamples[xCount - i - 1]) / xSquared); + fprintf(fp9, "%lf\n", localWeights[i]); } - - fprintf(fp3, "%d\t%f\t%f\t%f\n", xCount, xPredicted, xActual, xError[xCount]); // Write to logfile + + fprintf(fp3, "%d\t%f\t%f\t%f\n", xCount, xPredicted, xActual, xError[xCount]); // Write to logfile points[xCount].xVal[2] = xCount; // Fill point_t array for graph building points[xCount].yVal[2] = xPredicted; points[xCount].xVal[5] = xCount; points[xCount].yVal[5] = xError[xCount]; - // weightsLogger( fp, localWeights, USED_WEIGHTS ); + // weightsLogger( fp, localWeights, USED_WEIGHTS ); } fclose(fp9); double *xErrorPtr = popNAN(xError); // delete NAN values from xError[] double xErrorLength = *xErrorPtr; // Watch popNAN()! - xErrorPtr[0] = 0.0; // Stored length in [0] , won't be used anyway. Bit dirty - //printf("Xerrorl:%lf", xErrorLength); + xErrorPtr[0] = 0.0; // Stored length in [0] , won't be used anyway. Bit dirty + //printf("Xerrorl:%lf", xErrorLength); double mean = sum_array(xErrorPtr, xErrorLength) / xErrorLength; // Mean - double deviation = 0.0; + double deviation = 0.0; for (i = 1; i < xErrorLength; i++) { @@ -346,7 +347,7 @@ void directPredecessor( mldata_t *mlData, point_t points[]) { printf("mean:%lf, devitation:%lf\t\tdirect Predecessor\n", mean, deviation); fprintf(fp3, "\nQuadratische Varianz(x_error): %f\nMittelwert:(x_error): %f\n\n", deviation, mean); fclose(fp3); - free(localWeights); + //free(localWeights); free(xErrorPtr); free(xError); } @@ -361,30 +362,31 @@ differential predecessor. ====================================================================================================== */ -void differentialPredecessor ( mldata_t *mlData, point_t points[] ) { - double *localWeights = (double *) malloc ( sizeof(double) * mlData->windowSize + 1 ); - memcpy( localWeights, mlData->weights, mlData->windowSize ); +void differentialPredecessor(mldata_t *mlData, point_t points[]) { + double *localWeights = (double *)malloc(sizeof(double) * mlData->windowSize + 1); + localWeights = mlData->weights; char fileName[512]; - double *xError = (double *) malloc ( sizeof(double) * mlData->samplesCount + 1); + double *xError = (double *)malloc(sizeof(double) * mlData->samplesCount + 1); + memset(xError, 0.0, mlData->samplesCount); unsigned xCount = 0, i; double xPredicted = 0.0; double xActual = 0.0; mkFileName(fileName, sizeof(fileName), DIFFERENTIAL_PREDECESSOR); // File handling FILE *fp6 = fopen(fileName, "w"); - fprintf(fp6, fileHeader(DIFFERENTIAL_PREDECESSOR_HEADER) ); + fprintf(fp6, fileHeader(DIFFERENTIAL_PREDECESSOR_HEADER)); - mkFileName ( fileName, sizeof(fileName), USED_WEIGHTS_DIFF_PRED); + mkFileName(fileName, sizeof(fileName), USED_WEIGHTS_DIFF_PRED); FILE *fp9 = fopen(fileName, "w"); - for (xCount = 1; xCount < mlData->samplesCount; xCount++) { // First value will not get predicted + for (xCount = 1; xCount < mlData->samplesCount-1; xCount++) { // First value will not get predicted unsigned _arrayLength = (xCount > mlData->windowSize) ? mlData->windowSize + 1 : xCount; xPredicted = 0.0; xActual = xSamples[xCount]; for (i = 1; i < _arrayLength; i++) { - xPredicted += ( localWeights[i - 1] * (xSamples[xCount - i] - xSamples[xCount - i - 1])); + xPredicted += (localWeights[i - 1] * (xSamples[xCount - i] - xSamples[xCount - i - 1])); } xPredicted += xSamples[xCount - 1]; xError[xCount] = xActual - xPredicted; @@ -393,18 +395,18 @@ void differentialPredecessor ( mldata_t *mlData, point_t points[] ) { for (i = 1; i < _arrayLength; i++) { xSquared += pow(xSamples[xCount - i] - xSamples[xCount - i - 1], 2); // Substract direct predecessor } - if ( xSquared == 0.0 ) { // Otherwise returns Pred: -1.#IND00 in some occassions + if (xSquared == 0.0) { // Otherwise returns Pred: -1.#IND00 in some occassions xSquared = 1.0; } for (i = 1; i < _arrayLength; i++) { - localWeights[i] = localWeights[i-1] + mlData->learnrate * xError[xCount] + localWeights[i] = localWeights[i - 1] + mlData->learnrate * xError[xCount] * ((xSamples[xCount - i] - xSamples[xCount - i - 1]) / xSquared); - fprintf( fp9, "%lf\n", localWeights[i] ); + fprintf(fp9, "%lf\n", localWeights[i]); } - fprintf(fp6, "%d\t%f\t%f\t%f\n", xCount, xPredicted, xActual, xError[xCount]); // Write to logfile - + fprintf(fp6, "%d\t%f\t%f\t%f\n", xCount, xPredicted, xActual, xError[xCount]); // Write to logfile + points[xCount].xVal[3] = xCount; points[xCount].yVal[3] = xPredicted; points[xCount].xVal[6] = xCount; @@ -414,13 +416,13 @@ void differentialPredecessor ( mldata_t *mlData, point_t points[] ) { fclose(fp9); double *xErrorPtr = popNAN(xError); // delete NAN values from xError[] double xErrorLength = *xErrorPtr; // Watch popNAN()! - xErrorPtr[0] = 0.0; -// printf("Xerrorl:%lf", xErrorLength); + xErrorPtr[0] = 0.0; + // printf("Xerrorl:%lf", xErrorLength); double mean = sum_array(xErrorPtr, xErrorLength) / xErrorLength; double deviation = 0.0; - + for (i = 1; i < xErrorLength; i++) { // Mean square deviation += pow(xError[i] - mean, 2); } @@ -428,12 +430,12 @@ void differentialPredecessor ( mldata_t *mlData, point_t points[] ) { printf("mean:%lf, devitation:%lf\t\tdifferential Predecessor\n", mean, deviation); fprintf(fp6, "\nQuadratische Varianz(x_error): %f\nMittelwert:(x_error): %f\n\n", deviation, mean); fclose(fp6); - free(localWeights); + //free(localWeights); free(xErrorPtr); free(xError); -// weightsLogger( localWeights, USED_WEIGHTS ); + // weightsLogger( localWeights, USED_WEIGHTS ); } /* @@ -451,7 +453,7 @@ char *mkFileName(char* buffer, size_t max_len, int suffixId) { const char * format_str = "%Y-%m-%d_%H_%M_%S"; // Date formatting size_t date_len; const char * suffix = fileSuffix(suffixId); - time_t now = time(NULL); + time_t now = time(NULL); strftime(buffer, max_len, format_str, localtime(&now)); // Get Date date_len = strlen(buffer); @@ -468,16 +470,16 @@ Contains and returns every suffix for all existing filenames ====================================================================================================== */ -char * fileSuffix ( int id ) { - char * suffix[] = { "_weights_pure.txt", - "_weights_used_dir_pred_.txt", - "_direct_predecessor.txt", - "_ergebnisse.txt", - "_localMean.txt", - "_testvalues.txt", - "_differential_predecessor.txt", - "_weights_used_local_mean", - "_weights_used_diff_pred", +char * fileSuffix(int id) { + char * suffix[] = { "_weights_pure.txt", + "_weights_used_dir_pred_.txt", + "_direct_predecessor.txt", + "_ergebnisse.txt", + "_localMean.txt", + "_testvalues.txt", + "_differential_predecessor.txt", + "_weights_used_local_mean", + "_weights_used_diff_pred", }; return suffix[id]; } @@ -487,14 +489,14 @@ char * fileSuffix ( int id ) { fileHeader -Contains and returns header from logfiles +Contains and returns header from logfiles ====================================================================================================== */ -char * fileHeader ( int id ) { - char * header[] = { "\n=========================== Local Mean ===========================\nNo.\txPredicted\txAcutal\t\txError\n", - "\n=========================== Direct Predecessor ===========================\nNo.\txPredicted\txAcutal\t\txError\n", - "\n=========================== Differential Predecessor ===========================\nNo.\txPredicted\txAcutal\t\txError\n" +char * fileHeader(int id) { + char * header[] = { "\n=========================== Local Mean ===========================\nNo.\txPredicted\txAcutal\t\txError\n", + "\n=========================== Direct Predecessor ===========================\nNo.\txPredicted\txAcutal\t\txError\n", + "\n=========================== Differential Predecessor ===========================\nNo.\txPredicted\txAcutal\t\txError\n" }; return header[id]; } @@ -508,7 +510,7 @@ Logs used weights to logfile ====================================================================================================== */ -void weightsLogger (double *weights, int val ) { +void weightsLogger(double *weights, int val) { char fileName[512]; unsigned i; mkFileName(fileName, sizeof(fileName), val); @@ -524,37 +526,37 @@ void weightsLogger (double *weights, int val ) { bufferLogger -formats output of mkSvgGraph -- Please open graphResults.html to see the output-- - [0] = xActual, - [1] = xPredicted from localMean, - [2] = xPredicted from directPredecessor, - [3] = xPredicted from differentialpredecessor, - [4] = xError from localMean, - [5] = xError from directPredecessor, - [6] = xError from differentialPredecessor +formats output of mkSvgGraph -- Please open graphResults.html to see the output-- +[0] = xActual, +[1] = xPredicted from localMean, +[2] = xPredicted from directPredecessor, +[3] = xPredicted from differentialpredecessor, +[4] = xError from localMean, +[5] = xError from directPredecessor, +[6] = xError from differentialPredecessor ====================================================================================================== */ void bufferLogger(char *buffer, point_t points[]) { unsigned i; char _buffer[512] = ""; // TODO: resize buffer and _buffer so greater sampleval can be choosen -// char *_buffer = (char *) malloc ( sizeof(char) * 512 + 1); - for (i = 0; i < mlData->samplesCount - 1; i++) { // xActual + // char *_buffer = (char *) malloc ( sizeof(char) * 512 + 1); + for (i = 1; i < mlData->samplesCount - 1; i++) { // xActual sprintf(_buffer, "L %f %f\n", points[i].xVal[0], points[i].yVal[0]); strcat(buffer, _buffer); } strcat(buffer, "\" fill=\"none\" id=\"svg_1\" stroke=\"black\" stroke-width=\"0.4px\"/>\nsamplesCount - 1; i++) { // xPredicted from localMean + for (i = 1; i < mlData->samplesCount - 1; i++) { // xPredicted from localMean sprintf(_buffer, "L %f %f\n", points[i].xVal[1], points[i].yVal[1]); strcat(buffer, _buffer); } strcat(buffer, "\" fill=\"none\" id=\"svg_2\" stroke=\"green\" stroke-width=\"0.4px\"/>\nsamplesCount - 1; i++) { //xPredicted from directPredecessor + for (i = 1; i <= mlData->samplesCount - 1; i++) { //xPredicted from directPredecessor sprintf(_buffer, "L %f %f\n", points[i].xVal[2], points[i].yVal[2]); strcat(buffer, _buffer); } strcat(buffer, "\" fill=\"none\" id=\"svg_3\" stroke=\"blue\" stroke-width=\"0.4px\"/>\nsamplesCount - 1; i++) { //xPredicted from diff Pred + for (i = 1; i < mlData->samplesCount - 1; i++) { //xPredicted from diff Pred sprintf(_buffer, "L %f %f\n", points[i].xVal[3], points[i].yVal[3]); strcat(buffer, _buffer); } @@ -587,7 +589,7 @@ double sum_array(double x[], int xlength) { popNan -returns new array without NAN values +returns new array without NAN values ====================================================================================================== */ @@ -597,21 +599,21 @@ double *popNAN(double *xError) { double *tmp = NULL; double *more_tmp = NULL; - for ( i = 0; i < mlData->samplesCount - 1; i++ ) { - counter ++; - more_tmp = (double *) realloc ( tmp, counter*(sizeof(double) )); - if ( !isnan(xError[i]) ) { - tmp = more_tmp; - tmp[counter - 1] = xError[i]; - //printf("xERROR:%lf\n", tmp[counter - 1]); - tmpLength++; - } + for (i = 0; i < mlData->samplesCount - 1; i++) { + counter++; + more_tmp = (double *)realloc(tmp, counter*(sizeof(double))); + if (!isnan(xError[i])) { + tmp = more_tmp; + tmp[counter - 1] = xError[i]; + //printf("xERROR:%lf\n", tmp[counter - 1]); + tmpLength++; + } } counter += 1; - more_tmp = (double *) realloc ( tmp, counter * sizeof(double) ); + more_tmp = (double *)realloc(tmp, counter * sizeof(double)); tmp = more_tmp; *tmp = tmpLength; // Length of array is stored inside tmp[0]. tmp[0] is never used anyways - + return tmp; } @@ -666,14 +668,14 @@ void mkSvgGraph(point_t points[]) { fseek(input, 0, SEEK_END); long fpLength = ftell(input); fseek(input, 0, SEEK_SET); - + char buffer[131072] = ""; // Bit dirty -// char *buffer = (char *) malloc ( sizeof(char) * ( ( 3 * mlData->samplesCount ) + fpLength + 1 ) ); + // char *buffer = (char *) malloc ( sizeof(char) * ( ( 3 * mlData->samplesCount ) + fpLength + 1 ) ); memset(buffer, '\0', sizeof(buffer)); while (!feof(input)) { // parses file until "firstGraph" has been found - fgets(line, 512, input); + fgets(line, 512, input); strncat(buffer, line, strlen(line)); if (strstr(line, firstGraph) != NULL) { // Compares line <-> "firstGraph" bufferLogger(buffer, points); // write points @@ -721,30 +723,30 @@ static imagePixel_t *rdPPM(char *fileName) { c = getc(fp); } ungetc(c, fp); - if ( fscanf(fp, "%d %d", &image->x, &image->y) != 2 ) { + if (fscanf(fp, "%d %d", &image->x, &image->y) != 2) { fprintf(stderr, "Invalid image size in %s\n", fileName); exit(EXIT_FAILURE); } - if ( fscanf(fp, "%d", &rgbColor) != 1 ) { + if (fscanf(fp, "%d", &rgbColor) != 1) { fprintf(stderr, "Invalid rgb component in %s\n", fileName); } - if ( rgbColor != RGB_COLOR ) { + if (rgbColor != RGB_COLOR) { fprintf(stderr, "Invalid image color range in %s\n", fileName); exit(EXIT_FAILURE); } - while ( fgetc(fp) != '\n' ); + while (fgetc(fp) != '\n'); image->data = (colorChannel_t *)malloc(image->x * image->y * sizeof(imagePixel_t)); if (!image) { fprintf(stderr, "malloc() on image->data failed"); exit(EXIT_FAILURE); } - if ( (image->x * image->y) < mlData->samplesCount) { - printf("Changing \"-n\" to %d, image max data size\n", ( image->x * image->y ) ); - tmp = (double *) realloc ( xSamples, sizeof(double) * (image->x * image->y) ); + if ((image->x * image->y) < mlData->samplesCount) { + printf("Changing \"-n\" to %d, image max data size\n", (image->x * image->y)); + tmp = (double *)realloc(xSamples, sizeof(double) * (image->x * image->y)); xSamples = tmp; - mlData->samplesCount = (image->x * image->y ) / sizeof(double); + mlData->samplesCount = (image->x * image->y) / sizeof(double); } - if ( fread( image->data, 3 * image->x, image->y, fp) != image->y) { + if (fread(image->data, 3 * image->x, image->y, fp) != image->y) { fprintf(stderr, "Loading image failed"); exit(EXIT_FAILURE); } @@ -788,23 +790,26 @@ int ppmColorChannel(FILE* fp, imagePixel_t *image, char *colorChannel, mldata_t unsigned i = 0; printf("colorChannel : %s\n", colorChannel); - if ( image ) { // RGB channel can be set through args from cli - if ( strcmp(colorChannel, "green") == 0 ){ - for ( i = 0; i < mlData->samplesCount - 1; i++ ) { - fprintf ( fp, "%d\n", image->data[i].green ); + if (image) { // RGB channel can be set through args from cli + if (strcmp(colorChannel, "green") == 0) { + for (i = 0; i < mlData->samplesCount - 1; i++) { + fprintf(fp, "%d\n", image->data[i].green); } - } else if ( strcmp(colorChannel, "red") == 0 ){ - for ( i = 0; i < mlData->samplesCount - 1; i++ ) { - fprintf ( fp, "%d\n", image->data[i].red ); - } - - } else if ( strcmp(colorChannel, "blue") == 0 ) { - for ( i = 0; i < mlData->samplesCount - 1; i++ ) { - fprintf ( fp, "%d\n", image->data[i].blue ); + } + else if (strcmp(colorChannel, "red") == 0) { + for (i = 0; i < mlData->samplesCount - 1; i++) { + fprintf(fp, "%d\n", image->data[i].red); } - } else { + + } + else if (strcmp(colorChannel, "blue") == 0) { + for (i = 0; i < mlData->samplesCount - 1; i++) { + fprintf(fp, "%d\n", image->data[i].blue); + } + } + else { printf("Colorchannels are red, green and blue. Pick one of them!"); - exit( EXIT_FAILURE ); + exit(EXIT_FAILURE); } } fclose(fp); @@ -821,12 +826,12 @@ creating the SVG graph ====================================================================================================== */ -void colorSamples ( FILE* fp, mldata_t *mlData ) { +void colorSamples(FILE* fp, mldata_t *mlData) { int i = 0; - char *buffer = (char *) malloc(sizeof(char) * mlData->samplesCount + 1); + char *buffer = (char *)malloc(sizeof(char) * mlData->samplesCount + 1); while (!feof(fp)) { - if (fgets(buffer, mlData->samplesCount, fp) != NULL) { + if (fgets(buffer, mlData->samplesCount, fp) != NULL) { sscanf(buffer, "%lf", &xSamples[i]); //printf("%lf\n", xSamples[i] ); points[i].yVal[0] = xSamples[i]; // Fills points so actual input values can be seen as a graph @@ -842,7 +847,7 @@ void colorSamples ( FILE* fp, mldata_t *mlData ) { windowXMean -returns mean value of given input +returns mean value of given input ====================================================================================================== */ @@ -851,7 +856,7 @@ double windowXMean(int _arraylength, int xCount) { double *ptr; for (ptr = &xSamples[xCount - _arraylength]; ptr != &xSamples[xCount]; ptr++) { // Set ptr to beginning of window - sum += *ptr; + sum += *ptr; } return sum / (double)_arraylength; } @@ -859,43 +864,43 @@ double windowXMean(int _arraylength, int xCount) { /* ====================================================================================================== - usage - - used in conjunction with the args parser. Returns help section of "-h" +usage + +used in conjunction with the args parser. Returns help section of "-h" ====================================================================================================== */ -void usage ( char **argv ) { +void usage(char **argv) { printf("Usage: %s [POSIX style options] -i file ...\n", &argv[0][0]); printf("POSIX options:\n"); printf("\t-h\t\t\tDisplay this information.\n"); printf("\t-i \t\tName of inputfile. Must be PPM image.\n"); - printf("\t-n \t\tAmount of input data used.\n"); + printf("\t-n \t\tAmount of input data used.\n"); printf("\t-c \t\tUse this color channel from inputfile.\n"); printf("\t-w \t\tCount of used weights (windowSize).\n"); - printf("\t-l \t\tLearnrate, 0 < learnrate < 1.\n"); + printf("\t-l \t\tLearnrate, 0 < learnrate < 1.\n"); printf("\t-x true\t\t\tLogfiles only, no graph building.\n\t\t\t\tChoose for intense amount of input data.\n"); - printf("\t-s \t\tDigit for random seed generator.\n\t\t\t\tSame Digits produce same random values. Default is srand by time.\n"); + printf("\t-s \t\tDigit for random seed generator.\n\t\t\t\tSame Digits produce same random values. Default is srand by time.\n"); printf("\n\n"); - printf("%s compares prediction methods of least mean square filters.\nBy default it reads ppm file format and return logfiles as well\nas an svg graphs as an output of said least mean square methods.\n\nExample:\n\t%s -i myimage.ppm -w 3 -c green -s 5 -x true\n", &argv[0][0], &argv[0][0]); + printf("%s compares prediction methods of least mean square filters.\nBy default it reads ppm file format and return logfiles as well\nas an svg graphs as an output of said least mean square methods.\n\nExample:\n\t%s -i myimage.ppm -w 3 -c green -s 5 -x true\n", &argv[0][0], &argv[0][0]); exit(8); } /* ====================================================================================================== - init_mldata_t - - - Contains meachine learning data +init_mldata_t + + +Contains meachine learning data ====================================================================================================== */ mldata_t * init_mldata_t(unsigned windowSize, unsigned samplesCount, double learnrate) { - mlData = (mldata_t *) malloc( sizeof(mldata_t) ); + mlData = (mldata_t *)malloc(sizeof(mldata_t)); mlData->windowSize = windowSize; mlData->samplesCount = samplesCount; mlData->learnrate = learnrate; - mlData->weights = (double *) malloc ( sizeof(double) * windowSize + 1 ); + mlData->weights = (double *)malloc(sizeof(double) * windowSize + 1); return mlData; }