void Generate_New_Symbols(){ // copy old symbol data memcpy(old_syms,current_syms,N_SYMBOLS * RS_W); // copy new symbol data into current symbol table memcpy(current_syms,current_point.x,sizeof(current_point.x)); // Generate coding symbol jerasure_matrix_encode(K,M,W,rs_coding_matrix, (char **) curr_data_ptr,(char **) curr_code_ptr, sizeof(long)); }
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 != 4) usage(NULL); if (sscanf(argv[1], "%d", &k) == 0 || k <= 0) usage("Bad k"); if (sscanf(argv[2], "%d", &m) == 0 || m <= 0) usage("Bad m"); if (sscanf(argv[3], "%d", &w) == 0 || (w != 8 && w != 16 && w != 32)) usage("Bad w"); if (w <= 16 && k + m > (1 << w)) usage("k + m is too big"); matrix = reed_sol_vandermonde_coding_matrix(k, m, w); printf("Last m 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)); } jerasure_matrix_encode(k, m, w, matrix, 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) { int k, w, i, m, iterations, bufsize; int *matrix; char **data, **coding, **old_values; int *erasures, *erased; uint32_t seed; double t = 0, total_time = 0; gf_t *gf = NULL; if (argc < 8) usage(NULL); if (sscanf(argv[1], "%d", &k) == 0 || k <= 0) usage("Bad k"); if (sscanf(argv[2], "%d", &m) == 0 || m <= 0) usage("Bad m"); if (sscanf(argv[3], "%d", &w) == 0 || (w != 8 && w != 16 && w != 32)) usage("Bad w"); if (sscanf(argv[4], "%d", &seed) == 0) usage("Bad seed"); if (sscanf(argv[5], "%d", &iterations) == 0) usage("Bad iterations"); if (sscanf(argv[6], "%d", &bufsize) == 0) usage("Bad bufsize"); if (w <= 16 && k + m > (1 << w)) usage("k + m is too big"); MOA_Seed(seed); gf = get_gf(w, argc, argv, 7); if (gf == NULL) { usage("Invalid arguments given for GF!\n"); } galois_change_technique(gf, w); matrix = reed_sol_vandermonde_coding_matrix(k, m, w); printf("<HTML><TITLE>reed_sol_time_gf"); for (i = 1; i < argc; i++) printf(" %s", argv[i]); printf("</TITLE>\n"); printf("<h3>reed_sol_time_gf"); for (i = 1; i < argc; i++) printf(" %s", argv[i]); printf("</h3>\n"); printf("<pre>\n"); printf("Last m rows of the generator matrix (G^T):\n\n"); jerasure_print_matrix(matrix, m, k, w,NULL); printf("\n"); data = talloc(char *, k); for (i = 0; i < k; i++) { data[i] = talloc(char, bufsize); MOA_Fill_Random_Region(data[i], bufsize); } coding = talloc(char *, m); old_values = talloc(char *, m); for (i = 0; i < m; i++) { coding[i] = talloc(char, bufsize); old_values[i] = talloc(char, bufsize); } for (i = 0; i < iterations; i++) { t = timing_now(); jerasure_matrix_encode(k, m, w, matrix, data, coding, bufsize); total_time += timing_now() - t; } printf("Encode throughput for %d iterations: %.2f MB/s (%.2f sec)\n", iterations, (double)(k*iterations*bufsize/1024/1024) / total_time, total_time); erasures = talloc(int, (m+1)); erased = talloc(int, (k+m)); for (i = 0; i < m+k; i++) erased[i] = 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(old_values[i], (erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], bufsize); bzero((erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], bufsize); i++; } } erasures[i] = -1; for (i = 0; i < iterations; i++) { t = timing_now(); jerasure_matrix_decode(k, m, w, matrix, 1, erasures, data, coding, bufsize); total_time += timing_now() - t; } printf("Decode throughput for %d iterations: %.2f MB/s (%.2f sec)\n", iterations, (double)(k*iterations*bufsize/1024/1024) / total_time, total_time); for (i = 0; i < m; i++) { if (erasures[i] < k) { if (memcmp(data[erasures[i]], old_values[i], bufsize)) { fprintf(stderr, "Decoding failed for %d!\n", erasures[i]); exit(1); } } else { if (memcmp(coding[erasures[i]-k], old_values[i], bufsize)) { fprintf(stderr, "Decoding failed for %d!\n", erasures[i]); exit(1); } } } return 0; }
int main(int argc, char **argv) { long l; int k, w, i, j, m; int *matrix; char **data, **coding, **dcopy, **ccopy; unsigned char uc; int *erasures, *erased; int *decoding_matrix, *dm_ids; uint32_t seed; if (argc != 5) usage(NULL); if (sscanf(argv[1], "%d", &k) == 0 || k <= 0) usage("Bad k"); if (sscanf(argv[2], "%d", &m) == 0 || m <= 0) usage("Bad m"); if (sscanf(argv[3], "%d", &w) == 0 || (w != 8 && w != 16 && w != 32)) usage("Bad w"); if (sscanf(argv[4], "%u", &seed) == 0) usage("Bad seed"); if (w <= 16 && k + m > (1 << w)) usage("k + m is too big"); matrix = reed_sol_vandermonde_coding_matrix(k, m, w); printf("<HTML><TITLE>reed_sol_01 %d %d %d %d</title>\n", k, m, w, seed); printf("<h3>reed_sol_01 %d %d %d %d</h3>\n", k, m, w, seed); printf("<pre>\n"); printf("Last m rows of the generator Matrix (G^T):\n\n"); jerasure_print_matrix(matrix, m, k, w); printf("\n"); MOA_Seed(seed); 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); 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)); } jerasure_matrix_encode(k, m, w, matrix, 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] = MOA_Random_W(31, 0)%(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) { FILE *fp, *fp2; // file pointers char *block; // padding file int size, newsize; // size of file and temp size struct stat status; // finding file size enum Coding_Technique tech; // coding technique (parameter) int k, m, w, packetsize; // parameters int buffersize; // paramter int i; // loop control variables int blocksize; // size of k+m files int total; int extra; /* Jerasure Arguments */ char **data; char **coding; int *matrix; int *bitmatrix; int **schedule; /* Creation of file name variables */ char temp[5]; char *s1, *s2, *extension; char *fname; int md; char *curdir; /* Timing variables */ struct timing t1, t2, t3, t4; double tsec; double totalsec; struct timing start; /* Find buffersize */ int up, down; signal(SIGQUIT, ctrl_bs_handler); /* Start timing */ timing_set(&t1); totalsec = 0.0; matrix = NULL; bitmatrix = NULL; schedule = NULL; /* Error check Arguments*/ if (argc != 8) { fprintf(stderr, "usage: inputfile k m coding_technique w packetsize buffersize\n"); fprintf(stderr, "\nChoose one of the following coding techniques: \nreed_sol_van, \nreed_sol_r6_op, \ncauchy_orig, \ncauchy_good, \nliberation, \nblaum_roth, \nliber8tion"); fprintf(stderr, "\n\nPacketsize is ignored for the reed_sol's"); fprintf(stderr, "\nBuffersize of 0 means the buffersize is chosen automatically.\n"); fprintf(stderr, "\nIf you just want to test speed, use an inputfile of \"-number\" where number is the size of the fake file you want to test.\n\n"); exit(0); } /* Conversion of parameters and error checking */ if (sscanf(argv[2], "%d", &k) == 0 || k <= 0) { fprintf(stderr, "Invalid value for k\n"); exit(0); } if (sscanf(argv[3], "%d", &m) == 0 || m < 0) { fprintf(stderr, "Invalid value for m\n"); exit(0); } if (sscanf(argv[5],"%d", &w) == 0 || w <= 0) { fprintf(stderr, "Invalid value for w.\n"); exit(0); } if (argc == 6) { packetsize = 0; } else { if (sscanf(argv[6], "%d", &packetsize) == 0 || packetsize < 0) { fprintf(stderr, "Invalid value for packetsize.\n"); exit(0); } } if (argc != 8) { buffersize = 0; } else { if (sscanf(argv[7], "%d", &buffersize) == 0 || buffersize < 0) { fprintf(stderr, "Invalid value for buffersize\n"); exit(0); } } /* Determine proper buffersize by finding the closest valid buffersize to the input value */ if (buffersize != 0) { if (packetsize != 0 && buffersize%(sizeof(long)*w*k*packetsize) != 0) { up = buffersize; down = buffersize; while (up%(sizeof(long)*w*k*packetsize) != 0 && (down%(sizeof(long)*w*k*packetsize) != 0)) { up++; if (down == 0) { down--; } } if (up%(sizeof(long)*w*k*packetsize) == 0) { buffersize = up; } else { if (down != 0) { buffersize = down; } } } else if (packetsize == 0 && buffersize%(sizeof(long)*w*k) != 0) { up = buffersize; down = buffersize; while (up%(sizeof(long)*w*k) != 0 && down%(sizeof(long)*w*k) != 0) { up++; down--; } if (up%(sizeof(long)*w*k) == 0) { buffersize = up; } else { buffersize = down; } } } /* Setting of coding technique and error checking */ if (strcmp(argv[4], "no_coding") == 0) { tech = No_Coding; } else if (strcmp(argv[4], "reed_sol_van") == 0) { tech = Reed_Sol_Van; if (w != 8 && w != 16 && w != 32) { fprintf(stderr, "w must be one of {8, 16, 32}\n"); exit(0); } } else if (strcmp(argv[4], "reed_sol_r6_op") == 0) { if (m != 2) { fprintf(stderr, "m must be equal to 2\n"); exit(0); } if (w != 8 && w != 16 && w != 32) { fprintf(stderr, "w must be one of {8, 16, 32}\n"); exit(0); } tech = Reed_Sol_R6_Op; } else if (strcmp(argv[4], "cauchy_orig") == 0) { tech = Cauchy_Orig; if (packetsize == 0) { fprintf(stderr, "Must include packetsize.\n"); exit(0); } } else if (strcmp(argv[4], "cauchy_good") == 0) { tech = Cauchy_Good; if (packetsize == 0) { fprintf(stderr, "Must include packetsize.\n"); exit(0); } } else if (strcmp(argv[4], "liberation") == 0) { if (k > w) { fprintf(stderr, "k must be less than or equal to w\n"); exit(0); } if (w <= 2 || !(w%2) || !is_prime(w)) { fprintf(stderr, "w must be greater than two and w must be prime\n"); exit(0); } if (packetsize == 0) { fprintf(stderr, "Must include packetsize.\n"); exit(0); } if ((packetsize%(sizeof(long))) != 0) { fprintf(stderr, "packetsize must be a multiple of sizeof(long)\n"); exit(0); } tech = Liberation; } else if (strcmp(argv[4], "blaum_roth") == 0) { if (k > w) { fprintf(stderr, "k must be less than or equal to w\n"); exit(0); } if (w <= 2 || !((w+1)%2) || !is_prime(w+1)) { fprintf(stderr, "w must be greater than two and w+1 must be prime\n"); exit(0); } if (packetsize == 0) { fprintf(stderr, "Must include packetsize.\n"); exit(0); } if ((packetsize%(sizeof(long))) != 0) { fprintf(stderr, "packetsize must be a multiple of sizeof(long)\n"); exit(0); } tech = Blaum_Roth; } else if (strcmp(argv[4], "liber8tion") == 0) { if (packetsize == 0) { fprintf(stderr, "Must include packetsize\n"); exit(0); } if (w != 8) { fprintf(stderr, "w must equal 8\n"); exit(0); } if (m != 2) { fprintf(stderr, "m must equal 2\n"); exit(0); } if (k > w) { fprintf(stderr, "k must be less than or equal to w\n"); exit(0); } tech = Liber8tion; } else { fprintf(stderr, "Not a valid coding technique. Choose one of the following: reed_sol_van, reed_sol_r6_op, cauchy_orig, cauchy_good, liberation, blaum_roth, liber8tion, no_coding\n"); exit(0); } /* Set global variable method for signal handler */ method = tech; /* Get current working directory for construction of file names */ curdir = (char*)malloc(sizeof(char)*1000); if (! getcwd(curdir, 1000)) { curdir[0] = 0; } if (argv[1][0] != '-') { /* Open file and error check */ fp = fopen(argv[1], "rb"); if (fp == NULL) { fprintf(stderr, "Unable to open file.\n"); exit(0); } /* Create Coding directory */ i = mkdir("Coding", S_IRWXU); if (i == -1 && errno != EEXIST) { fprintf(stderr, "Unable to create Coding directory.\n"); exit(0); } /* Determine original size of file */ stat(argv[1], &status); size = status.st_size; } else { if (sscanf(argv[1]+1, "%d", &size) != 1 || size <= 0) { fprintf(stderr, "Files starting with '-' should be sizes for randomly created input\n"); exit(1); } fp = NULL; MOA_Seed(time(0)); } newsize = size; /* Find new size by determining next closest multiple */ if (packetsize != 0) { if (size%(k*w*packetsize*sizeof(long)) != 0) { while (newsize%(k*w*packetsize*sizeof(long)) != 0) newsize++; } } else { if (size%(k*w*sizeof(long)) != 0) { while (newsize%(k*w*sizeof(long)) != 0) newsize++; } } if (buffersize != 0) { while (newsize%buffersize != 0) { newsize++; } } /* Determine size of k+m files */ blocksize = newsize/k; /* Allow for buffersize and determine number of read-ins */ if (size > buffersize && buffersize != 0) { if (newsize%buffersize != 0) { readins = newsize/buffersize; } else { readins = newsize/buffersize; } block = (char *)malloc(sizeof(char)*buffersize); blocksize = buffersize/k; } else { readins = 1; buffersize = size; block = (char *)malloc(sizeof(char)*newsize); } /* Break inputfile name into the filename and extension */ s1 = (char*)malloc(sizeof(char)*(strlen(argv[1])+20)); s2 = strrchr(argv[1], '/'); if (s2 != NULL) { s2++; strcpy(s1, s2); } else { strcpy(s1, argv[1]); } s2 = strchr(s1, '.'); if (s2 != NULL) { extension = strdup(s2); *s2 = '\0'; } else { extension = strdup(""); } /* Allocate for full file name */ fname = (char*)malloc(sizeof(char)*(strlen(argv[1])+strlen(curdir)+20)); sprintf(temp, "%d", k); md = strlen(temp); /* Allocate data and coding */ data = (char **)malloc(sizeof(char*)*k); coding = (char **)malloc(sizeof(char*)*m); for (i = 0; i < m; i++) { coding[i] = (char *)malloc(sizeof(char)*blocksize); if (coding[i] == NULL) { perror("malloc"); exit(1); } } /* Create coding matrix or bitmatrix and schedule */ timing_set(&t3); switch(tech) { case No_Coding: break; case Reed_Sol_Van: matrix = reed_sol_vandermonde_coding_matrix(k, m, w); break; case Reed_Sol_R6_Op: break; case Cauchy_Orig: matrix = cauchy_original_coding_matrix(k, m, w); bitmatrix = jerasure_matrix_to_bitmatrix(k, m, w, matrix); schedule = jerasure_smart_bitmatrix_to_schedule(k, m, w, bitmatrix); break; case Cauchy_Good: matrix = cauchy_good_general_coding_matrix(k, m, w); bitmatrix = jerasure_matrix_to_bitmatrix(k, m, w, matrix); schedule = jerasure_smart_bitmatrix_to_schedule(k, m, w, bitmatrix); break; case Liberation: bitmatrix = liberation_coding_bitmatrix(k, w); schedule = jerasure_smart_bitmatrix_to_schedule(k, m, w, bitmatrix); break; case Blaum_Roth: bitmatrix = blaum_roth_coding_bitmatrix(k, w); schedule = jerasure_smart_bitmatrix_to_schedule(k, m, w, bitmatrix); break; case Liber8tion: bitmatrix = liber8tion_coding_bitmatrix(k); schedule = jerasure_smart_bitmatrix_to_schedule(k, m, w, bitmatrix); break; case RDP: case EVENODD: assert(0); } timing_set(&start); timing_set(&t4); totalsec += timing_delta(&t3, &t4); /* Read in data until finished */ n = 1; total = 0; while (n <= readins) { /* Check if padding is needed, if so, add appropriate number of zeros */ if (total < size && total+buffersize <= size) { total += jfread(block, sizeof(char), buffersize, fp); } else if (total < size && total+buffersize > size) { extra = jfread(block, sizeof(char), buffersize, fp); for (i = extra; i < buffersize; i++) { block[i] = '0'; } } else if (total == size) { for (i = 0; i < buffersize; i++) { block[i] = '0'; } } /* Set pointers to point to file data */ for (i = 0; i < k; i++) { data[i] = block+(i*blocksize); } timing_set(&t3); /* Encode according to coding method */ switch(tech) { case No_Coding: break; case Reed_Sol_Van: jerasure_matrix_encode(k, m, w, matrix, data, coding, blocksize); break; case Reed_Sol_R6_Op: reed_sol_r6_encode(k, w, data, coding, blocksize); break; case Cauchy_Orig: jerasure_schedule_encode(k, m, w, schedule, data, coding, blocksize, packetsize); break; case Cauchy_Good: jerasure_schedule_encode(k, m, w, schedule, data, coding, blocksize, packetsize); break; case Liberation: jerasure_schedule_encode(k, m, w, schedule, data, coding, blocksize, packetsize); break; case Blaum_Roth: jerasure_schedule_encode(k, m, w, schedule, data, coding, blocksize, packetsize); break; case Liber8tion: jerasure_schedule_encode(k, m, w, schedule, data, coding, blocksize, packetsize); break; case RDP: case EVENODD: assert(0); } timing_set(&t4); /* Write data and encoded data to k+m files */ for (i = 1; i <= k; i++) { if (fp == NULL) { bzero(data[i-1], blocksize); } else { sprintf(fname, "%s/Coding/%s_k%0*d%s", curdir, s1, md, i, extension); if (n == 1) { fp2 = fopen(fname, "wb"); } else { fp2 = fopen(fname, "ab"); } fwrite(data[i-1], sizeof(char), blocksize, fp2); fclose(fp2); } } for (i = 1; i <= m; i++) { if (fp == NULL) { bzero(data[i-1], blocksize); } else { sprintf(fname, "%s/Coding/%s_m%0*d%s", curdir, s1, md, i, extension); if (n == 1) { fp2 = fopen(fname, "wb"); } else { fp2 = fopen(fname, "ab"); } fwrite(coding[i-1], sizeof(char), blocksize, fp2); fclose(fp2); } } n++; /* Calculate encoding time */ totalsec += timing_delta(&t3, &t4); } /* Create metadata file */ if (fp != NULL) { sprintf(fname, "%s/Coding/%s_meta.txt", curdir, s1); fp2 = fopen(fname, "wb"); fprintf(fp2, "%s\n", argv[1]); fprintf(fp2, "%d\n", size); fprintf(fp2, "%d %d %d %d %d\n", k, m, w, packetsize, buffersize); fprintf(fp2, "%s\n", argv[4]); fprintf(fp2, "%d\n", tech); fprintf(fp2, "%d\n", readins); fclose(fp2); } /* Free allocated memory */ free(s1); free(fname); free(block); free(curdir); /* Calculate rate in MB/sec and print */ timing_set(&t2); tsec = timing_delta(&t1, &t2); printf("Encoding (MB/sec): %0.10f\n", (((double) size)/1024.0/1024.0)/totalsec); printf("En_Total (MB/sec): %0.10f\n", (((double) size)/1024.0/1024.0)/tsec); return 0; }
int main(int argc, char **argv) { long l; int k, w, i, j, m; int *matrix; char **data, **coding, **old_values; int *erasures, *erased; int *decoding_matrix, *dm_ids; gf_t *gf = NULL; uint32_t seed; if (argc < 6) usage("Not enough command line arguments"); if (sscanf(argv[1], "%d", &k) == 0 || k <= 0) usage("Bad k"); if (sscanf(argv[2], "%d", &m) == 0 || m <= 0) usage("Bad m"); if (sscanf(argv[3], "%d", &w) == 0 || (w != 8 && w != 16 && w != 32)) usage("Bad w"); if (sscanf(argv[4], "%d", &seed) == 0) usage("Bad seed"); if (w <= 16 && k + m > (1 << w)) usage("k + m is too big"); MOA_Seed(seed); gf = get_gf(w, argc, argv, 5); if (gf == NULL) { usage("Invalid arguments given for GF!\n"); } galois_change_technique(gf, w); matrix = reed_sol_vandermonde_coding_matrix(k, m, w); printf("<HTML><TITLE>reed_sol_test_gf"); for (i = 1; i < argc; i++) printf(" %s", argv[i]); printf("</TITLE>\n"); printf("<h3>reed_sol_test_gf"); for (i = 1; i < argc; i++) printf(" %s", argv[i]); printf("</h3>\n"); printf("<pre>\n"); printf("Last m rows of the generator matrix (G^T):\n\n"); jerasure_print_matrix(matrix, m, k, w); printf("\n"); data = talloc(char *, k); for (i = 0; i < k; i++) { data[i] = talloc(char, BUFSIZE); MOA_Fill_Random_Region(data[i], BUFSIZE); } coding = talloc(char *, m); old_values = talloc(char *, m); for (i = 0; i < m; i++) { coding[i] = talloc(char, BUFSIZE); old_values[i] = talloc(char, BUFSIZE); } jerasure_matrix_encode(k, m, w, matrix, data, coding, BUFSIZE); 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(old_values[i], (erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], BUFSIZE); bzero((erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], BUFSIZE); i++; } } erasures[i] = -1; i = jerasure_matrix_decode(k, m, w, matrix, 1, erasures, data, coding, BUFSIZE); for (i = 0; i < m; i++) { if (erasures[i] < k) { if (memcmp(data[erasures[i]], old_values[i], BUFSIZE)) { fprintf(stderr, "Decoding failed for %d!\n", erasures[i]); exit(1); } } else { if (memcmp(coding[erasures[i]-k], old_values[i], BUFSIZE)) { fprintf(stderr, "Decoding failed for %d!\n", erasures[i]); exit(1); } } } printf("Encoding and decoding were both successful.\n"); return 0; }
int main(int argc, char **argv) { int k, m, w, size; int i, j; int *matrix; char **data, **coding; int *erasures, *erased; int *decoding_matrix, *dm_ids; uint32_t seed; if (argc != 6) usage(NULL); if (sscanf(argv[1], "%d", &k) == 0 || k <= 0) usage("Bad k"); if (sscanf(argv[2], "%d", &m) == 0 || m <= 0) usage("Bad m"); if (sscanf(argv[3], "%d", &w) == 0 || (w != 8 && w != 16 && w != 32)) usage("Bad w"); if (w < 32 && k + m > (1 << w)) usage("k + m must be <= 2 ^ w"); if (sscanf(argv[4], "%d", &size) == 0 || size % sizeof(long) != 0) usage("size must be multiple of sizeof(long)"); if (sscanf(argv[5], "%d", &seed) == 0) usage("Bad seed"); matrix = talloc(int, m*k); for (i = 0; i < m; i++) { for (j = 0; j < k; j++) { matrix[i*k+j] = galois_single_divide(1, i ^ (m + j), w); } } printf("<HTML><TITLE>jerasure_05"); for (i = 1; i < argc; i++) printf(" %s", argv[i]); printf("</TITLE>\n"); printf("<h3>jerasure_05"); for (i = 1; i < argc; i++) printf(" %s", argv[i]); printf("</h3>\n"); printf("<pre>\n"); printf("The Coding Matrix (the last m rows of the Generator Matrix G^T):\n\n"); jerasure_print_matrix(matrix, m, k, w); printf("\n"); MOA_Seed(seed); data = talloc(char *, k); for (i = 0; i < k; i++) { data[i] = talloc(char, size); MOA_Fill_Random_Region(data[i], size); } coding = talloc(char *, m); for (i = 0; i < m; i++) { coding[i] = talloc(char, size); } jerasure_matrix_encode(k, m, w, matrix, data, coding, size); printf("Encoding Complete:\n\n"); print_data_and_coding(k, m, w, size, data, coding); erasures = talloc(int, (m+1)); erased = talloc(int, (k+m)); for (i = 0; i < m+k; i++) erased[i] = 0; for (i = 0; i < m; ) { erasures[i] = (MOA_Random_W(w, 1))%(k+m); if (erased[erasures[i]] == 0) { erased[erasures[i]] = 1; bzero((erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], size); i++; } } erasures[i] = -1; printf("Erased %d random devices:\n\n", m); print_data_and_coding(k, m, w, size, data, coding); i = jerasure_matrix_decode(k, m, w, matrix, 0, erasures, data, coding, size); printf("State of the system after decoding:\n\n"); print_data_and_coding(k, m, w, size, data, coding); decoding_matrix = talloc(int, k*k); dm_ids = talloc(int, k); for (i = 0; i < m; i++) erased[i] = 1; for (; i < k+m; i++) erased[i] = 0; jerasure_make_decoding_matrix(k, m, w, matrix, erased, decoding_matrix, dm_ids); printf("Suppose we erase the first %d devices. Here is the decoding matrix:\n\n", m); jerasure_print_matrix(decoding_matrix, k, k, w); printf("\n"); printf("And dm_ids:\n\n"); jerasure_print_matrix(dm_ids, 1, k, w); bzero(data[0], size); jerasure_matrix_dotprod(k, w, decoding_matrix, dm_ids, 0, data, coding, size); printf("\nAfter calling jerasure_matrix_dotprod, we calculate the value of device #0 to be:\n\n"); printf("D0 :"); for(i=0;i< size; i+=(w/8)) { printf(" "); for(j=0;j < w/8;j++){ printf("%02x", (unsigned char)data[0][i+j]); } } printf("\n\n"); return 0; }