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

Private GIT Repository
new hash
[Cipher_code.git] / IDA_new / jerasure / src / liberation.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
51 #include "galois.h"
52 #include "jerasure.h"
53 #include "liberation.h"
54
55 #define talloc(type, num) (type *) malloc(sizeof(type)*(num))
56
57 int *liberation_coding_bitmatrix(int k, int w)
58 {
59   int *matrix, i, j, index;
60
61   if (k > w) return NULL;
62   matrix = talloc(int, 2*k*w*w);
63   if (matrix == NULL) return NULL;
64   bzero(matrix, sizeof(int)*2*k*w*w);
65   
66   /* Set up identity matrices */
67
68   for(i = 0; i < w; i++) {
69     index = i*k*w+i;
70     for (j = 0; j < k; j++) {
71       matrix[index] = 1;
72       index += w;
73     }
74   }
75
76   /* Set up liberation matrices */
77
78   for (j = 0; j < k; j++) {
79     index = k*w*w+j*w;
80     for (i = 0; i < w; i++) {
81       matrix[index+(j+i)%w] = 1;
82       index += (k*w);
83     }
84     if (j > 0) {
85       i = (j*((w-1)/2))%w;
86       matrix[k*w*w+j*w+i*k*w+(i+j-1)%w] = 1;
87     }
88   }
89   return matrix;
90 }
91   
92
93 int *liber8tion_coding_bitmatrix(int k)
94 {
95   int *matrix, i, j, index;
96   int w;
97
98   w = 8;
99   if (k > w) return NULL;
100   matrix = talloc(int, 2*k*w*w);
101   if (matrix == NULL) return NULL;
102   bzero(matrix, sizeof(int)*2*k*w*w);
103   
104   /* Set up identity matrices */
105
106   for(i = 0; i < w; i++) {
107     index = i*k*w+i;
108     for (j = 0; j < k; j++) {
109       matrix[index] = 1;
110       index += w;
111     }
112   }
113
114   /* Set up liber8tion matrices */
115
116   index = k*w*w;
117
118   if (k == 0) return matrix;
119   matrix[index+0*k*w+0*w+0] = 1;
120   matrix[index+1*k*w+0*w+1] = 1;
121   matrix[index+2*k*w+0*w+2] = 1;
122   matrix[index+3*k*w+0*w+3] = 1;
123   matrix[index+4*k*w+0*w+4] = 1;
124   matrix[index+5*k*w+0*w+5] = 1;
125   matrix[index+6*k*w+0*w+6] = 1;
126   matrix[index+7*k*w+0*w+7] = 1;
127
128   if (k == 1) return matrix;
129   matrix[index+0*k*w+1*w+7] = 1;
130   matrix[index+1*k*w+1*w+3] = 1;
131   matrix[index+2*k*w+1*w+0] = 1;
132   matrix[index+3*k*w+1*w+2] = 1;
133   matrix[index+4*k*w+1*w+6] = 1;
134   matrix[index+5*k*w+1*w+1] = 1;
135   matrix[index+6*k*w+1*w+5] = 1;
136   matrix[index+7*k*w+1*w+4] = 1;
137   matrix[index+4*k*w+1*w+7] = 1;
138
139   if (k == 2) return matrix;
140   matrix[index+0*k*w+2*w+6] = 1;
141   matrix[index+1*k*w+2*w+2] = 1;
142   matrix[index+2*k*w+2*w+4] = 1;
143   matrix[index+3*k*w+2*w+0] = 1;
144   matrix[index+4*k*w+2*w+7] = 1;
145   matrix[index+5*k*w+2*w+3] = 1;
146   matrix[index+6*k*w+2*w+1] = 1;
147   matrix[index+7*k*w+2*w+5] = 1;
148   matrix[index+1*k*w+2*w+3] = 1;
149
150   if (k == 3) return matrix;
151   matrix[index+0*k*w+3*w+2] = 1;
152   matrix[index+1*k*w+3*w+5] = 1;
153   matrix[index+2*k*w+3*w+7] = 1;
154   matrix[index+3*k*w+3*w+6] = 1;
155   matrix[index+4*k*w+3*w+0] = 1;
156   matrix[index+5*k*w+3*w+3] = 1;
157   matrix[index+6*k*w+3*w+4] = 1;
158   matrix[index+7*k*w+3*w+1] = 1;
159   matrix[index+5*k*w+3*w+4] = 1;
160
161   if (k == 4) return matrix;
162   matrix[index+0*k*w+4*w+5] = 1;
163   matrix[index+1*k*w+4*w+6] = 1;
164   matrix[index+2*k*w+4*w+1] = 1;
165   matrix[index+3*k*w+4*w+7] = 1;
166   matrix[index+4*k*w+4*w+2] = 1;
167   matrix[index+5*k*w+4*w+4] = 1;
168   matrix[index+6*k*w+4*w+3] = 1;
169   matrix[index+7*k*w+4*w+0] = 1;
170   matrix[index+2*k*w+4*w+0] = 1;
171
172   if (k == 5) return matrix;
173   matrix[index+0*k*w+5*w+1] = 1;
174   matrix[index+1*k*w+5*w+2] = 1;
175   matrix[index+2*k*w+5*w+3] = 1;
176   matrix[index+3*k*w+5*w+4] = 1;
177   matrix[index+4*k*w+5*w+5] = 1;
178   matrix[index+5*k*w+5*w+6] = 1;
179   matrix[index+6*k*w+5*w+7] = 1;
180   matrix[index+7*k*w+5*w+0] = 1;
181   matrix[index+7*k*w+5*w+2] = 1;
182
183   if (k == 6) return matrix;
184   matrix[index+0*k*w+6*w+3] = 1;
185   matrix[index+1*k*w+6*w+0] = 1;
186   matrix[index+2*k*w+6*w+6] = 1;
187   matrix[index+3*k*w+6*w+5] = 1;
188   matrix[index+4*k*w+6*w+1] = 1;
189   matrix[index+5*k*w+6*w+7] = 1;
190   matrix[index+6*k*w+6*w+4] = 1;
191   matrix[index+7*k*w+6*w+2] = 1;
192   matrix[index+6*k*w+6*w+5] = 1;
193
194   if (k == 7) return matrix;
195   matrix[index+0*k*w+7*w+4] = 1;
196   matrix[index+1*k*w+7*w+7] = 1;
197   matrix[index+2*k*w+7*w+1] = 1;
198   matrix[index+3*k*w+7*w+5] = 1;
199   matrix[index+4*k*w+7*w+3] = 1;
200   matrix[index+5*k*w+7*w+2] = 1;
201   matrix[index+6*k*w+7*w+0] = 1;
202   matrix[index+7*k*w+7*w+6] = 1;
203   matrix[index+3*k*w+7*w+1] = 1;
204
205   return matrix;
206 }
207   
208 int *blaum_roth_coding_bitmatrix(int k, int w)
209 {
210   int *matrix, i, j, index, l, m, p;
211
212   if (k > w) return NULL ;
213
214   matrix = talloc(int, 2*k*w*w);
215   if (matrix == NULL) return NULL;
216   bzero(matrix, sizeof(int)*2*k*w*w);
217   
218   /* Set up identity matrices */
219
220   for(i = 0; i < w; i++) {
221     index = i*k*w+i;
222     for (j = 0; j < k; j++) {
223       matrix[index] = 1;
224       index += w;
225     }
226   }
227
228   /* Set up blaum_roth matrices -- Ignore identity */
229
230   p = w+1;
231   for (j = 0; j < k; j++) {
232     index = k*w*w+j*w;
233     if (j == 0) {
234       for (l = 0; l < w; l++) {
235         matrix[index+l] = 1;
236         index += k*w;
237       }
238     } else {
239       i = j;
240       for (l = 1; l <= w; l++) {
241         if (l != p-i) {
242           m = l+i;
243           if (m >= p) m -= p;
244           m--;
245           matrix[index+m] = 1;
246         } else {
247           matrix[index+i-1] = 1;
248           if (i%2 == 0) {
249             m = i/2;
250           } else {
251             m = (p/2) + 1 + (i/2);
252           }
253           m--;
254           matrix[index+m] = 1;
255         }
256         index += k*w;
257       }
258     }
259   }
260
261   return matrix;
262 }