]> AND Private Git Repository - Cipher_code.git/blob - IDA_new/jerasure/Examples/raph.c
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
new hash version
[Cipher_code.git] / IDA_new / jerasure / Examples / raph.c
1 /* *
2  * Copyright (c) 2014, James S. Plank and Kevin Greenan
3  * All rights reserved.
4  *
5  * Jerasure - A C/C++ Library for a Variety of Reed-Solomon and RAID-6 Erasure
6  * Coding Techniques
7  *
8  * Revision 2.0: Galois Field backend now links to GF-Complete
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  *
14  *  - Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  *
17  *  - Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in
19  *    the documentation and/or other materials provided with the
20  *    distribution.
21  *
22  *  - Neither the name of the University of Tennessee nor the names of its
23  *    contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
31  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
32  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
33  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
34  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
36  * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37  * POSSIBILITY OF SUCH DAMAGE.
38  */
39
40 /* Jerasure's authors:
41
42    Revision 2.x - 2014: James S. Plank and Kevin M. Greenan.
43    Revision 1.2 - 2008: James S. Plank, Scott Simmerman and Catherine D. Schuman.
44    Revision 1.0 - 2007: James S. Plank.
45  */
46
47 #include <stdio.h>
48 #include <stdlib.h>
49 #include <string.h>
50 #include "jerasure.h"
51 #include <sys/time.h>
52
53
54 typedef unsigned long mylong;
55 #define LLUI (long long unsigned int)
56
57 double TimeStart()
58 {
59   struct timeval tstart;
60   gettimeofday(&tstart,0);
61   return( (double) (tstart.tv_sec + tstart.tv_usec*1e-6) );
62 }
63
64 double TimeStop(double t)
65 {
66   struct timeval tend;
67
68   gettimeofday(&tend,0);
69   t = (double) (tend.tv_sec + tend.tv_usec*1e-6) - t;
70   return (t);
71 }
72
73 void display(mylong *mat, int r, int c) {
74  for(int i=0;i<r;i++) {
75     for(int j=0;j<c;j++) {
76       printf("%016llu ",LLUI mat[i*c+j]);
77     }
78     printf("\n");
79   }
80  printf("\n");
81 }
82
83 mylong *matrix_multiply(gf_t *gf, mylong *m1, mylong *m2, int r1, int c1, int r2, int c2, int w)
84 {
85   mylong *product;
86   int i, j, k;
87
88   product = (mylong *) malloc(sizeof(mylong)*r1*c2);
89   for (i = 0; i < r1*c2; i++) product[i] = 0;
90
91   for (i = 0; i < r1; i++) {
92     for (j = 0; j < c2; j++) {
93       for (k = 0; k < r2; k++) {
94         product[i*c2+j] ^= gf->multiply.w64(gf,m1[i*c1+k], m2[k*c2+j]);
95       }
96     }
97   }
98   return product;
99 }
100
101
102
103 int invert_matrix(gf_t *gf, mylong *mat, mylong *inv, int rows)
104 {
105   int cols, i, j, k, x, rs2;
106   int row_start;
107   mylong tmp, inverse;
108  
109   cols = rows;
110
111   k = 0;
112   for (i = 0; i < rows; i++) {
113     for (j = 0; j < cols; j++) {
114       inv[k] = (i == j) ? 1 : 0;
115       k++;
116     }
117   }
118 //  display(inv, rows, rows);
119 //  printf("\n");
120   
121   /* First -- convert into upper triangular  */
122   for (i = 0; i < cols; i++) {
123     row_start = cols*i;
124
125     /* Swap rows if we ave a zero i,i element.  If we can't swap, then the
126        matrix was not invertible  */
127
128     if (mat[row_start+i] == 0) {
129       for (j = i+1; j < rows && mat[cols*j+i] == 0; j++) ;
130       if (j == rows) return -1;
131       rs2 = j*cols;
132       for (k = 0; k < cols; k++) {
133         tmp = mat[row_start+k];
134         mat[row_start+k] = mat[rs2+k];
135         mat[rs2+k] = tmp;
136         tmp = inv[row_start+k];
137         inv[row_start+k] = inv[rs2+k];
138         inv[rs2+k] = tmp;
139       }
140     }
141  
142     /* Multiply the row by 1/element i,i  */
143     tmp = mat[row_start+i];
144     if (tmp != 1) {
145       inverse = gf->divide.w64(gf,1, tmp);
146       for (j = 0; j < cols; j++) {
147         mat[row_start+j] = gf->multiply.w64(gf,mat[row_start+j], inverse);
148         inv[row_start+j] = gf->multiply.w64(gf,inv[row_start+j], inverse);
149       }
150     }
151
152     /* Now for each j>i, add A_ji*Ai to Aj  */
153     k = row_start+i;
154     for (j = i+1; j != cols; j++) {
155       k += cols;
156       if (mat[k] != 0) {
157         if (mat[k] == 1) {
158           rs2 = cols*j;
159           for (x = 0; x < cols; x++) {
160             mat[rs2+x] ^= mat[row_start+x];
161             inv[rs2+x] ^= inv[row_start+x];
162           }
163         } else {
164           tmp = mat[k];
165           rs2 = cols*j;
166           for (x = 0; x < cols; x++) {
167             mat[rs2+x] ^= gf->multiply.w64(gf,tmp, mat[row_start+x]);
168             inv[rs2+x] ^= gf->multiply.w64(gf,tmp, inv[row_start+x]);
169           }
170         }
171       }
172     }
173   }
174
175   /* Now the matrix is upper triangular.  Start at the top and multiply down  */
176
177   for (i = rows-1; i >= 0; i--) {
178     row_start = i*cols;
179     for (j = 0; j < i; j++) {
180       rs2 = j*cols;
181       if (mat[rs2+i] != 0) {
182         tmp = mat[rs2+i];
183         mat[rs2+i] = 0;
184         for (k = 0; k < cols; k++) {
185           inv[rs2+k] ^= gf->multiply.w64(gf,tmp, inv[row_start+k]);
186         }
187       }
188     }
189   }
190
191 /*  printf("mat\n");
192   display(mat, rows, rows);
193   printf("\n");
194    printf("inv\n");
195   display(inv, rows, rows);
196   printf("\n");
197 */
198   return 0;
199 }
200
201
202
203
204 int invertible_matrix(gf_t *gf, int *mat, int rows, int w)
205 {
206   int cols, i, j, k, x, rs2;
207   int row_start;
208   ulong tmp, inverse;
209  
210   cols = rows;
211
212   /* First -- convert into upper triangular  */
213   for (i = 0; i < cols; i++) {
214     row_start = cols*i;
215
216     /* Swap rows if we ave a zero i,i element.  If we can't swap, then the 
217        matrix was not invertible  */
218
219     if (mat[row_start+i] == 0) { 
220       for (j = i+1; j < rows && mat[cols*j+i] == 0; j++) ;
221       if (j == rows) return 0;
222       rs2 = j*cols;
223       for (k = 0; k < cols; k++) {
224         tmp = mat[row_start+k];
225         mat[row_start+k] = mat[rs2+k];
226         mat[rs2+k] = tmp;
227       }
228     }
229  
230     /* Multiply the row by 1/element i,i  */
231     tmp = mat[row_start+i];
232     if (tmp != 1) {
233       inverse =  gf->divide.w64(gf,1, tmp);
234       for (j = 0; j < cols; j++) { 
235         mat[row_start+j] =  gf->multiply.w64(gf,mat[row_start+j], inverse);
236       }
237     }
238
239     /* Now for each j>i, add A_ji*Ai to Aj  */
240     k = row_start+i;
241     for (j = i+1; j != cols; j++) {
242       k += cols;
243       if (mat[k] != 0) {
244         if (mat[k] == 1) {
245           rs2 = cols*j;
246           for (x = 0; x < cols; x++) {
247             mat[rs2+x] ^= mat[row_start+x];
248           }
249         } else {
250           tmp = mat[k];
251           rs2 = cols*j;
252           for (x = 0; x < cols; x++) {
253             mat[rs2+x] ^=  gf->multiply.w64(gf,tmp,mat[row_start+x]);
254           }
255         }
256       }
257     }
258   }
259   return 1;
260 }
261
262
263
264 int main(int argc, char **argv)
265 {
266   unsigned int  w;
267   int invert;
268   mylong *matS;
269   mylong *matG;
270   mylong *matC;
271   mylong *inverse;
272   mylong *identity;
273
274
275   int size=5000;
276   int t=4;
277   int n=8;
278   int len=size/t;
279
280   w=64;
281   gf_t gf;
282   gf_init_easy(&gf, w);  
283   
284   matS = malloc(sizeof(mylong)*t*len);
285   matG = malloc(sizeof(mylong)*t*n);
286
287  
288
289   srand48(time(0));
290   for(int i=0;i<t;i++) {
291     for(int j=0;j<len;j++) {
292       matS[i*len+j]=lrand48()<<32|lrand48();
293     }
294   }
295
296   for(int i=0;i<n;i++) { 
297     for(int j=0;j<t;j++) {
298       matG[i*t+j]=lrand48()<<32|lrand48();
299     }
300   }
301
302
303
304   printf("Matrix S:\n");
305   display(matS, t, t);
306
307   printf("Matrix G:\n");
308   display(matG, n, t);
309
310   double tt=TimeStart();
311   matC=matrix_multiply(&gf, matG, matS, n, t, t, len, w);
312   printf("1st multiply %f\n",TimeStop(tt));
313 //  printf("Matrix C:\n");
314 //  display(matC, n, t);
315
316   ulong *matCs = malloc(sizeof(mylong)*t*len);
317   ulong *matGs = malloc(sizeof(mylong)*t*t);
318
319   for(int i=0;i<t;i++) {
320     for(int j=0;j<len;j++) {
321       matCs[i*len+j]=matC[i*len+j];
322     }
323     for(int j=0;j<t;j++) {
324       matGs[i*t+j]=matG[i*t+j];
325     }
326   }
327     
328   printf("Matrix Gs:\n");
329   display(matGs, t, t);
330
331 //  printf("Matrix Cs:\n");
332 //  display(matCs, t, len);
333   
334   ulong* matGs_copy = malloc(sizeof(mylong)* t*t);
335
336   //WARNINT invert changes the matrix
337 //  invert = invertible_matrix(&gf,matGs, t, w);
338 //  printf("\nInvertible Gs: %s\n", (invert == 1) ? "Yes" : "No");
339
340   memcpy(matGs_copy, matGs, sizeof(mylong)*t*t);
341   ulong *matInvGs = malloc(sizeof(mylong)*t*t);
342   invert_matrix(&gf, matGs_copy, matInvGs, t);
343
344   /*
345   WARNING   this changes matGs
346   identity=matrix_multiply(&gf, matInvGs, matGs, t, t, t, t, w);
347   printf("Identity:\n");
348   display(identity, t, t);
349   */
350
351   
352   //printf("Matrix Gs:\n");
353   //display(matGs, t, t);
354   
355   ulong *matS2 = malloc(sizeof(mylong)*t*len);
356   tt=TimeStart();
357   matS2=matrix_multiply(&gf, matInvGs, matCs, t, t, t, len, w);
358   printf("2nd multiply %f\n",TimeStop(tt));
359
360   printf("Matrix S2:\n");
361   display(matS2, t, t);
362   
363   int equal=1;
364   for(int i=0;i<t;i++) {
365     for(int j=0;j<len;j++) {
366       equal=matS[i*len+j]==matS2[i*len+j];
367 //      if(!equal)
368 //      printf("ARGH\n");
369     }
370   }
371   if(equal)
372     printf("EQUAL !!!\n");
373   
374   return 0;
375 }
376
377