#include "serial_gs_pagerank_functions.h" const char *CONVERGENCE_ARGUMENT = "-c"; const char *MAX_ITERATIONS_ARGUMENT = "-m"; const char *DAMPING_FACTOR_ARGUMENT = "-a"; const char *VERBAL_OUTPUT_ARGUMENT = "-v"; const int NUMERICAL_BASE = 10; void validUsage(char *programName) { printf("%s [-c convergence] [-m max_iterations] [-a alpha] [-v] \ \n-c convergence\ \n\tthe convergence criterion\ \n-m max_iterations\ \n\tmaximum number of iterations to perform\ \n-a alpha\ \n\tthe damping factor\ \n-v enable verbal output\ \n", programName); exit(EXIT_FAILURE); } int checkIncrement(int previousIndex, int maxIndex, char *programName) { if (previousIndex == maxIndex) { validUsage(programName); exit(EXIT_FAILURE); } return ++previousIndex; } void parseArguments(int argumentCount, char **argumentVector, Parameters *parameters) { if (argumentCount < 2 || argumentCount > 10) { validUsage(argumentVector[0]); } (*parameters).numberOfPages = 0; (*parameters).maxIterations = 0; (*parameters).convergenceCriterion = 1; (*parameters).dampingFactor = 0.85; (*parameters).verbose = false; char *endPointer; int argumentIndex = 1; while (argumentIndex < argumentCount) { if (!strcmp(argumentVector[argumentIndex], CONVERGENCE_ARGUMENT)) { argumentIndex = checkIncrement(argumentIndex, argumentCount, argumentVector[0]); double convergenceInput = strtod(argumentVector[argumentIndex], &endPointer); if (convergenceInput == 0) { printf("Invalid convergence argument\n"); exit(EXIT_FAILURE); } (*parameters).convergenceCriterion = convergenceInput; } else if (!strcmp(argumentVector[argumentIndex], MAX_ITERATIONS_ARGUMENT)) { argumentIndex = checkIncrement(argumentIndex, argumentCount, argumentVector[0]); size_t iterationsInput = strtol(argumentVector[argumentIndex], &endPointer, NUMERICAL_BASE); if (iterationsInput == 0 && endPointer) { printf("Invalid iterations argument\n"); exit(EXIT_FAILURE); } (*parameters).maxIterations = iterationsInput; } else if (!strcmp(argumentVector[argumentIndex], DAMPING_FACTOR_ARGUMENT)) { argumentIndex = checkIncrement(argumentIndex, argumentCount, argumentVector[0]); double alphaInput = strtod(argumentVector[argumentIndex], &endPointer); if ((alphaInput == 0 || alphaInput > 1) && endPointer) { printf("Invalid alpha argument\n"); exit(EXIT_FAILURE); } (*parameters).dampingFactor = alphaInput; } else if (!strcmp(argumentVector[argumentIndex], VERBAL_OUTPUT_ARGUMENT)) { (*parameters).verbose = true; } else if (argumentIndex == argumentCount - 1) { (*parameters).graphFilename = argumentVector[argumentIndex]; } else { validUsage(argumentVector[0]); exit(EXIT_FAILURE); } ++argumentIndex; } } void readGraphFromFile(int ***directedWebGraph, Parameters *parameters) { FILE *graphFile; // Opens the file for reading graphFile = fopen((*parameters).graphFilename, "r+"); if (!graphFile) { printf("Error opening file \n"); exit(EXIT_FAILURE); } // Reads the dimensions of the (square) array from the file int readChar, numberOfLines=0; while((readChar = fgetc(graphFile))) { // Breaks if end of file if (readChar == EOF) break; // Otherwise, if the character is a break line, adds one to the count of lines if (readChar == '\n') { ++numberOfLines; } } if ((*parameters).verbose) { printf("Line count of file is %d \n", numberOfLines); } // Each line of the file represents one page of the graph (*parameters).numberOfPages = numberOfLines; rewind(graphFile); // Allocates memory and loads values into directedWebGraph (matrix A) // Allocates memory for the rows (*directedWebGraph) = (int **) malloc((*parameters).numberOfPages * sizeof(int *)); for (int i=0; i<(*parameters).numberOfPages; ++i) { // Allocates memory for the columns of this row (*directedWebGraph)[i] = (int *) malloc((*parameters).numberOfPages * sizeof(int)); // Reads values from the file for (int j=0; j<(*parameters).numberOfPages; ++j) { if (!fscanf(graphFile, "%d ", &(*directedWebGraph)[i][j])) { break; } //printf("directedWebGraph[%d][%d] = %d", i , j, (*directedWebGraph)[i][j]); } } fclose(graphFile); } void generateNormalizedTransitionMatrix(double ***transitionMatrix, int **directedWebGraph, Parameters parameters) { // Allocates memory for the transitionMatrix rows (*transitionMatrix) = (double **) malloc(parameters.numberOfPages * sizeof(double *)); for (int i=0; i parameters.convergenceCriterion && (parameters.maxIterations != 0 || iterations < parameters.maxIterations)); return iterations; }