4 from copy import deepcopy
15 retour = [int(not L[k]) for k in xrange(n)]
16 retour.extend([L[k-n] for k in xrange(n,2*n)])
17 retour.extend([int(L[k-2*n])*int(not L[k+1]) for k in xrange(2*n,4*n)])
18 retour.extend([int(not L[2*n])])
25 retour = [int(not L[0])]
26 retour.extend([L[k-1] for k in xrange(1,len(L))])
37 rl.append(int(not el))
39 rl.append(0 if sum(x[k-2:k])%2==0 else 1 )
48 r = 0 if sum(x[i-1:i+1])%2==0 else 1
58 def arrondi_en_entier(mat):
60 return array([[round(mat[i][j]) for j in range(c)]for i in range(l)])
63 def matrice_lscs(matrice):
66 Matrice est une liste de listes, lscs est une liste.
68 A partir d'une matrice de coefficients binaires, vus comme
69 des chaines de caractères, extrait les bits dont les positions
70 sont données par la liste lscs.
72 Dans la liste lscs, un entier positif signifie devant la virgule,
73 un entier négatif signifie derrière. Le premier bit devant la
74 virgule est le bit 1, le premier bit derrière la virgule est le -1.
76 Le retour est une liste de bits (entiers).
78 m,n = len(matrice), len(matrice[0])
82 #num = str(round(float(matrice[l][c]),2))
86 ent,dec = num.replace('-',''),'0'
88 ent,dec = num.replace('-','').split('.')
89 ent,dec = list(ent),list(dec)
92 if lsc > 0 and len(ent)>=lsc:
93 retour.append(ent[lsc-1])
94 elif lsc<0 and len(dec)>=abs(lsc):
95 retour.append(dec[abs(lsc)-1])
98 return [int(k) for k in retour][:-3]
100 def matrice_to_bits(matrice):
102 Renvoie la matrice des écritures binaires de matrice.
103 Les coefficients floants deviennent des chaînes (str) de bits.
105 (m,n) = matrice.shape
110 ligne.append(conversion(str(matrice[l,c]),2))
114 def embarque2(liste,matrice):
116 m,n = len(matrice), len(matrice[0])
117 #print m,n,liste,matrice,lscs
118 retour = deepcopy(matrice)
124 retour[l,c] = setBit(str(retour[l,c]),lsc, liste[cpt])
131 def differences(mat1,mat2):
135 if mat1[k] != mat2[k] :
137 #print mat1[k],mat2[k]
138 return float(100)*cpt/lm
142 def conversion(nombre, base, epsilon = 0.00001 ):
143 ''' Soit nombre écrit en base 10, le retourne en base base'''
144 if not 2 <= base <= 36:
145 raise ValueError, "La base doit être entre 2 et 36"
146 if not base == 2 and '.' in str(nombre):
147 raise ValueError, "La partie décimale n'est pas gérée pour les bases\
149 # IMPROVE : Convertir aussi la partie décimale, quand la base n'est pas égale
151 abc = string.digits + string.letters
155 nb = nb.replace('-','')
160 entier,decimal = int(nb.split('.')[0]),\
161 float('.'+nb.split('.')[1])
163 entier,decimal = int(nb),0
165 entier, rdigit = divmod( entier, base )
166 result = abc[rdigit] + result
167 flotante, decimalBin = 1./float(base),''
168 while flotante > epsilon :
169 if decimal >= flotante:
174 flotante = flotante/float(base)
175 if '1' in decimalBin :
176 reste = '.'+decimalBin
177 while reste[-1]=='0':
183 #print "bin",sign + result + reste
184 return sign + result + reste
189 '''Récupère le bit en position pos de X.
190 Par exemple, getBit(8,1) = 0, puisque le bit le plus à droite de 8 = 1000 est 0.
191 On fera attention à ce que :
192 - on compte à partir du point,
193 - l'élément juste à gauche du point est en position 1,
194 - celui juste à droite est en position -1.'''
197 entier = conversion(X,2)
199 #print "entier", entier
201 entier, decimal = entier.split('.')
207 entier = entier.replace('-','')
208 entier = entier.zfill(abs(pos))
209 decimal = (decimal+'0'*abs(pos))[:max(len(decimal),abs(pos))]
211 return int(entier[len(entier)-pos]) if pos >0 else int(decimal[-pos-1])
215 '''Fixe le bit pos de X à la valeur y.
216 Le fonctionnement est similaire à getBit :
217 - on compte à partir du point,
218 - l'élément juste à gauche du point est en position 1,
219 - celui juste à droite est en position -1.'''
221 entier = conversion(X,2)
223 entier, decimal = entier.split('.')
226 entier = list(entier.zfill(abs(pos)))
227 decimal = list((decimal+'0'*abs(pos))[:max(len(decimal),abs(pos))])
229 entier[len(entier)-pos]=str(int(y))
231 decimal[-pos-1] = str(int(y))
233 return int(''.join(entier),2)
236 for k in range(len(decimal)):
237 S += 1./2**(k+1)*int(decimal[k])
238 return float(str(int(''.join(entier),2))+'.'+str(S).split('.')[1])
241 def ci2_watermark(initiale_matrice,marque,ni=-1):
243 #recuperer la marque comme un vecteur de 0,1 et pas de nombres binaires
245 msg_init = [x for x in marque]
248 initiale_lscs = matrice_lscs(matrice_to_bits(initiale_matrice))
249 initiale_lscs_a_iterer = deepcopy(initiale_lscs)
252 lh = len(initiale_lscs)
253 print "taille de de N", lh
255 nbit = int(ITFACTOR*lh)
259 # generation des strategies
260 ciis_p = CIIS(random(),random(),random()/2,lh-1,2*lh)._genere()
261 ciis_m = CIIS(random(),random(),random()/2,lm-1,lh)._genere()
262 cip = CIIS(random(),random(),random()/2,lm-1,lh)._genere()
264 S_c= [cip.next() for _ in xrange(nbit)]
267 for k in xrange(nbit):
273 #pour garantir Sp doit avoir au moins lm differentes valeurs
274 dates_modif_suff = sample(xrange(1,nbit),lm)
275 valeur_des_modifs=sample(xrange(lh),lm)
277 for i,e in enumerate(dates_modif_suff):
278 S_p[e]=valeur_des_modifs[i]
280 for k in xrange(nbit):
284 #pour garantir que le message est present a la fin on modifie la strategie
285 date_m=set(date_m)-set([0])
286 m = sample(date_m,lm)
287 for el in xrange(lm):
291 # les iterations a proprement parler
292 for k in xrange(nbit):
293 initiale_lscs_a_iterer[S_p[k]] = msg_init[S_c[k]]
294 msg_init[S_m[k]] = f(S_m[k],msg_init)
297 marquee_matrice = embarque2(initiale_lscs_a_iterer,
300 return (marquee_matrice,S_p,S_c,S_m)