int main(int argc, char **argv) { long l; unsigned char uc; int k, w, i, j, m; int *matrix; char **data, **coding, **dcopy, **ccopy; int *erasures, *erased; uint32_t seed; if (argc != 4) usage(NULL); if (sscanf(argv[1], "%d", &k) == 0 || k <= 0) usage("Bad k"); if (sscanf(argv[2], "%d", &w) == 0 || (w != 8 && w != 16 && w != 32)) usage("Bad w"); if (sscanf(argv[3], "%d", &seed) == 0) usage("Bad seed"); m = 2; if (w <= 16 && k + m > (1 << w)) usage("k + m is too big"); MOA_Seed(seed); matrix = reed_sol_r6_coding_matrix(k, w); printf("<HTML><TITLE>reed_sol_03 %d %d %d</title>\n", k, w, seed); printf("<h3>reed_sol_03 %d %d %d</h3>\n", k, w, seed); printf("<pre>\n"); printf("Last 2 rows of the Generator Matrix:\n\n"); jerasure_print_matrix(matrix, m, k, w); printf("\n"); data = talloc(char *, k); dcopy = talloc(char *, k); for (i = 0; i < k; i++) { data[i] = talloc(char, sizeof(long)); dcopy[i] = talloc(char, sizeof(long)); for (j = 0; j < sizeof(long); j++) { uc = MOA_Random_W(8, 1) %256; data[i][j] = (char) uc; } memcpy(dcopy[i], data[i], sizeof(long)); } coding = talloc(char *, m); ccopy = talloc(char *, m); for (i = 0; i < m; i++) { coding[i] = talloc(char, sizeof(long)); ccopy[i] = talloc(char, sizeof(long)); } reed_sol_r6_encode(k, w, data, coding, sizeof(long)); for (i = 0; i < m; i++) { memcpy(ccopy[i], coding[i], sizeof(long)); } printf("Encoding Complete:\n\n"); print_data_and_coding(k, m, w, sizeof(long), data, coding); erasures = talloc(int, (m+1)); erased = talloc(int, (k+m)); for (i = 0; i < m+k; i++) erased[i] = 0; l = 0; for (i = 0; i < m; ) { erasures[i] = ((unsigned int) MOA_Random_W(w, 1))%(k+m); if (erased[erasures[i]] == 0) { erased[erasures[i]] = 1; memcpy((erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], &l, sizeof(long)); i++; } } erasures[i] = -1; printf("Erased %d random devices:\n\n", m); print_data_and_coding(k, m, w, sizeof(long), data, coding); i = jerasure_matrix_decode(k, m, w, matrix, 1, erasures, data, coding, sizeof(long)); printf("State of the system after decoding:\n\n"); print_data_and_coding(k, m, w, sizeof(long), data, coding); for (i = 0; i < k; i++) if (memcmp(data[i], dcopy[i], sizeof(long)) != 0) { printf("ERROR: D%x after decoding does not match its state before decoding!<br>\n", i); } for (i = 0; i < m; i++) if (memcmp(coding[i], ccopy[i], sizeof(long)) != 0) { printf("ERROR: C%x after decoding does not match its state before decoding!<br>\n", i); } return 0; }
int main(int argc, char **argv) { long l; int k, w, i, j, m; int *matrix; char **data, **coding; int *erasures, *erased; int *decoding_matrix, *dm_ids; if (argc != 3) usage(NULL); if (sscanf(argv[1], "%d", &k) == 0 || k <= 0) usage("Bad k"); if (sscanf(argv[2], "%d", &w) == 0 || (w != 8 && w != 16 && w != 32)) usage("Bad w"); m = 2; if (w <= 16 && k + m > (1 << w)) usage("k + m is too big"); matrix = reed_sol_r6_coding_matrix(k, w); printf("Last 2 rows of the Distribution Matrix:\n\n"); jerasure_print_matrix(matrix, m, k, w); printf("\n"); srand48(0); data = talloc(char *, k); for (i = 0; i < k; i++) { data[i] = talloc(char, sizeof(long)); l = lrand48(); memcpy(data[i], &l, sizeof(long)); } coding = talloc(char *, m); for (i = 0; i < m; i++) { coding[i] = talloc(char, sizeof(long)); } reed_sol_r6_encode(k, w, data, coding, sizeof(long)); printf("Encoding Complete:\n\n"); print_data_and_coding(k, m, w, sizeof(long), data, coding); erasures = talloc(int, (m+1)); erased = talloc(int, (k+m)); for (i = 0; i < m+k; i++) erased[i] = 0; l = 0; for (i = 0; i < m; ) { erasures[i] = lrand48()%(k+m); if (erased[erasures[i]] == 0) { erased[erasures[i]] = 1; memcpy((erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], &l, sizeof(long)); i++; } } erasures[i] = -1; printf("Erased %d random devices:\n\n", m); print_data_and_coding(k, m, w, sizeof(long), data, coding); i = jerasure_matrix_decode(k, m, w, matrix, 1, erasures, data, coding, sizeof(long)); printf("State of the system after decoding:\n\n"); print_data_and_coding(k, m, w, sizeof(long), data, coding); return 0; }
int main (int argc, char **argv) { FILE *fp; // File pointer char *dummy; int err; /* Jerasure arguments */ char **data; char **coding; int *erasures; int *erased; int *matrix; int *bitmatrix; /* Parameters */ int k, m, w, packetsize, buffersize; enum Coding_Technique tech; char *c_tech; int i, j; // loop control variables int blocksize; // size of individual files int origsize; // size of file before padding int total; // used to write data, not padding to file struct stat status; // used to find size of individual files int numerased; // number of erased files /* Used to recreate file names */ char *temp; char *cs1, *cs2, *extension; char *fname; int md; char *curdir; /* Used to time decoding */ struct timeval t1, t2, t3, t4; struct timezone tz; double tsec; double totalsec; signal(SIGQUIT, ctrl_bs_handler); matrix = NULL; bitmatrix = NULL; totalsec = 0.0; blocksize = -1; /* Start timing */ gettimeofday(&t1, &tz); /* Error checking parameters */ if (argc != 2) { fprintf(stderr, "usage: inputfile\n"); exit(0); } curdir = (char *)malloc(sizeof(char)*100); dummy = getcwd(curdir, 100); /* Begin recreation of file names */ cs1 = (char*)malloc(sizeof(char)*strlen(argv[1])); cs2 = strrchr(argv[1], '/'); if (cs2 != NULL) { cs2++; strcpy(cs1, cs2); } else { strcpy(cs1, argv[1]); } cs2 = strchr(cs1, '.'); if (cs2 != NULL) { extension = strdup(cs2); *cs2 = '\0'; } else { extension = strdup(""); } fname = (char *)malloc(sizeof(char*)*(100+strlen(argv[1])+10)); /* Read in parameters from metadata file */ sprintf(fname, "%s/Coding/%s_meta.txt", curdir, cs1); fp = fopen(fname, "rb"); if (fp == NULL) { fprintf(stderr, "Error: no metadata file %s\n", fname); exit(1); } temp = (char *)malloc(sizeof(char)*(strlen(argv[1])+10)); err = fscanf(fp, "%s", temp); if (fscanf(fp, "%d", &origsize) != 1) { fprintf(stderr, "Original size is not valid\n"); exit(0); } if (fscanf(fp, "%d %d %d %d %d", &k, &m, &w, &packetsize, &buffersize) != 5) { fprintf(stderr, "Parameters are not correct\n"); exit(0); } c_tech = (char *)malloc(sizeof(char)*(strlen(argv[1])+10)); err = fscanf(fp, "%s", c_tech); err = fscanf(fp, "%d", &tech); method = tech; err = fscanf(fp, "%d", &readins); fclose(fp); /* Allocate memory */ erased = (int *)malloc(sizeof(int)*(k+m)); for (i = 0; i < k+m; i++) erased[i] = 0; erasures = (int *)malloc(sizeof(int)*(k+m)); data = (char **)malloc(sizeof(char *)*k); coding = (char **)malloc(sizeof(char *)*m); if (buffersize != origsize) { for (i = 0; i < k; i++) { data[i] = (char *)malloc(sizeof(char)*(buffersize/k)); } for (i = 0; i < m; i++) { coding[i] = (char *)malloc(sizeof(char)*(buffersize/k)); } blocksize = buffersize/k; } sprintf(temp, "%d", k); md = strlen(temp); gettimeofday(&t3, &tz); /* Create coding matrix or bitmatrix */ switch(tech) { case No_Coding: case RDP: case EVENODD: break; case Reed_Sol_Van: matrix = reed_sol_vandermonde_coding_matrix(k, m, w); break; case Reed_Sol_R6_Op: matrix = reed_sol_r6_coding_matrix(k, w); break; case Cauchy_Orig: matrix = cauchy_original_coding_matrix(k, m, w); bitmatrix = jerasure_matrix_to_bitmatrix(k, m, w, matrix); break; case Cauchy_Good: matrix = cauchy_good_general_coding_matrix(k, m, w); bitmatrix = jerasure_matrix_to_bitmatrix(k, m, w, matrix); break; case Liberation: bitmatrix = liberation_coding_bitmatrix(k, w); break; case Blaum_Roth: bitmatrix = blaum_roth_coding_bitmatrix(k, w); break; case Liber8tion: bitmatrix = liber8tion_coding_bitmatrix(k); break; default: fprintf(stderr, "unsupported coding technique used\n"); break; } gettimeofday(&t4, &tz); tsec = 0.0; tsec += t4.tv_usec; tsec -= t3.tv_usec; tsec /= 1000000.0; tsec += t4.tv_sec; tsec -= t3.tv_sec; totalsec += tsec; /* Begin decoding process */ total = 0; n = 1; while (n <= readins) { numerased = 0; /* Open files, check for erasures, read in data/coding */ for (i = 1; i <= k; i++) { sprintf(fname, "%s/Coding/%s_k%0*d%s", curdir, cs1, md, i, extension); fp = fopen(fname, "rb"); if (fp == NULL) { erased[i-1] = 1; erasures[numerased] = i-1; numerased++; //printf("%s failed\n", fname); } else { if (buffersize == origsize) { stat(fname, &status); blocksize = status.st_size; data[i-1] = (char *)malloc(sizeof(char)*blocksize); err = fread(data[i-1], sizeof(char), blocksize, fp); } else { fseek(fp, blocksize*(n-1), SEEK_SET); err = fread(data[i-1], sizeof(char), buffersize/k, fp); } fclose(fp); } } for (i = 1; i <= m; i++) { sprintf(fname, "%s/Coding/%s_m%0*d%s", curdir, cs1, md, i, extension); fp = fopen(fname, "rb"); if (fp == NULL) { erased[k+(i-1)] = 1; erasures[numerased] = k+i-1; numerased++; //printf("%s failed\n", fname); } else { if (buffersize == origsize) { stat(fname, &status); blocksize = status.st_size; coding[i-1] = (char *)malloc(sizeof(char)*blocksize); err = fread(coding[i-1], sizeof(char), blocksize, fp); } else { fseek(fp, blocksize*(n-1), SEEK_SET); err = fread(coding[i-1], sizeof(char), blocksize, fp); } fclose(fp); } } /* Finish allocating data/coding if needed */ if (n == 1) { for (i = 0; i < numerased; i++) { if (erasures[i] < k) { data[erasures[i]] = (char *)malloc(sizeof(char)*blocksize); } else { coding[erasures[i]-k] = (char *)malloc(sizeof(char)*blocksize); } } } erasures[numerased] = -1; gettimeofday(&t3, &tz); /* Choose proper decoding method */ if (tech == Reed_Sol_Van || tech == Reed_Sol_R6_Op) { i = jerasure_matrix_decode(k, m, w, matrix, 1, erasures, data, coding, blocksize); } else if (tech == Cauchy_Orig || tech == Cauchy_Good || tech == Liberation || tech == Blaum_Roth || tech == Liber8tion) { i = jerasure_schedule_decode_lazy(k, m, w, bitmatrix, erasures, data, coding, blocksize, packetsize, 1); } else { fprintf(stderr, "Not a valid coding technique.\n"); exit(0); } gettimeofday(&t4, &tz); /* Exit if decoding was unsuccessful */ if (i == -1) { fprintf(stderr, "Unsuccessful!\n"); exit(0); } /* Create decoded file */ sprintf(fname, "%s/Coding/%s_decoded%s", curdir, cs1, extension); if (n == 1) { fp = fopen(fname, "wb"); } else { fp = fopen(fname, "ab"); } for (i = 0; i < k; i++) { if (total+blocksize <= origsize) { fwrite(data[i], sizeof(char), blocksize, fp); total+= blocksize; } else { for (j = 0; j < blocksize; j++) { if (total < origsize) { fprintf(fp, "%c", data[i][j]); total++; } else { break; } } } } n++; fclose(fp); tsec = 0.0; tsec += t4.tv_usec; tsec -= t3.tv_usec; tsec /= 1000000.0; tsec += t4.tv_sec; tsec -= t3.tv_sec; totalsec += tsec; } /* Free allocated memory */ free(cs1); free(extension); free(fname); free(data); free(coding); free(erasures); free(erased); /* Stop timing and print time */ gettimeofday(&t2, &tz); tsec = 0; tsec += t2.tv_usec; tsec -= t1.tv_usec; tsec /= 1000000.0; tsec += t2.tv_sec; tsec -= t1.tv_sec; printf("Decoding (MB/sec): %0.10f\n", (origsize/1024/1024)/totalsec); printf("De_Total (MB/sec): %0.10f\n\n", (origsize/1024/1024)/tsec); return(0); }