2 __device__ void calcul_indices_prec_suiv(int nb_nodes, int nx, int& nprec, int& nsuiv){
3 nprec = (nx > 0)? (nx - 1):(nb_nodes - 1);
4 nsuiv = (nx < nb_nodes - 1)? (nx + 1):(0);
7 __device__ double codage_niveau_gris_hyp_gaussienne_gpu(uint32 stat_sum_1, uint64 stat_sum_x,
8 uint64 stat_sum_x2, uint32 n_dim,
9 uint64 SUM_X, uint64 SUM_X2)
11 uint64 stat_sum_xe ; /* somme des xn region exterieure */
12 uint32 ne ; /* nombre de pixel region exterieure */
13 double sigi2, sige2; /* variance region interieure et exterieure */
15 /* variance des valeurs des niveaux de gris a l'interieur du snake */
17 (double)stat_sum_x2/(double)stat_sum_1 -
18 (double)(stat_sum_x*stat_sum_x)/(double)((uint64)stat_sum_1*(uint64)stat_sum_1) ;
20 /* variance des valeurs des niveaux de gris a l'exterieur du snake */
21 ne = n_dim-stat_sum_1 ;
22 stat_sum_xe = SUM_X - stat_sum_x ;
24 (double)(SUM_X2-stat_sum_x2)/(double)ne -
25 (double)(stat_sum_xe*stat_sum_xe)/(double)((uint64)ne*(uint64)ne) ;
27 if ((sigi2 <= 0)|(sige2 <= 0)) return -1;
29 return 0.5*((double)stat_sum_1*log(sigi2) + (double)ne*log(sige2)) ;
32 __device__ double codage_gl_hyp_gaussienne(uint64 stat_sum_1, uint64 stat_sum_x, uint64 stat_sum_x2,
33 uint64 n_dim, uint64 SUM_X, uint64 SUM_X2){
34 uint64 stat_sum_xe ; /* somme des xn region exterieure */
35 uint32 ne ; /* nombre de pixel region exterieure */
36 double sigi2, sige2; /* variance region interieure et exterieure */
38 /* variance des valeurs des niveaux de gris a l'interieur du snake */
40 (double)stat_sum_x2/(double)stat_sum_1 -
41 (double)(stat_sum_x*stat_sum_x)/(double)((uint64)stat_sum_1*(uint64)stat_sum_1) ;
43 /* variance des valeurs des niveaux de gris a l'exterieur du snake */
44 ne = n_dim-stat_sum_1 ;
45 stat_sum_xe = SUM_X - stat_sum_x ;
47 (double)(SUM_X2-stat_sum_x2)/(double)ne -
48 (double)(stat_sum_xe*stat_sum_xe)/(double)((uint64)ne*(uint64)ne) ;
50 if ((sigi2 > 0)|(sige2 > 0))
51 return 0.5*((double)stat_sum_1*log(sigi2) + (double)ne*log(sige2)) ;
55 __device__ inline unsigned int nextPow2_gpu( unsigned int x ) {
66 __device__ inline int sign_diff_strict(int val1, int val2)
70 if (val2 >= 0) return 0 ;
76 if (val2 <= 0) return 0 ;
80 return 0 ;/* val1 == 0 */
83 __device__ inline int sign_diff_ou_egal_zero(int val1, int val2)
87 if (val2 > 0) return 0 ;
93 if (val2 < 0) return 0 ;
97 return 1 ;/* val1 == 0 */
101 __device__ int sinus_triangle(int Ai, int Aj, int Bi, int Bj, int Ci, int Cj)
103 return (((Bi-Ai)*(Cj-Aj)) - ((Ci-Ai)*(Bj-Aj))) ;
106 __device__ int test_croisement_large(uint32 Ai, uint32 Aj, uint32 Bi, uint32 Bj,
107 uint32 Ui, uint32 Uj, uint32 Vi, uint32 Vj)
109 if (sign_diff_strict(sinus_triangle(Ai, Aj, Bi, Bj, Ui, Uj), // Bi-Ai, Uj-Aj, Ui-Ai, Bj-Aj
110 sinus_triangle(Ai, Aj, Bi, Bj, Vi, Vj))) // Bi-Ai, Vj-Aj, Vi-Ai, Bj-Aj
111 if (sign_diff_strict(sinus_triangle(Ui, Uj, Vi, Vj, Ai, Aj), // Vi-Ui, Aj-Uj, Ai-Ui, Vj-Uj
112 sinus_triangle(Ui, Uj, Vi, Vj, Bi, Bj))) // Vi-Ui, Bj-Uj, Bi-Ui, Vj-Uj
117 __device__ int test_croisement_strict(uint32 Ai, uint32 Aj, uint32 Bi, uint32 Bj,
118 uint32 Ui, uint32 Uj, uint32 Vi, uint32 Vj )
120 if (sign_diff_ou_egal_zero(sinus_triangle(Ai, Aj, Bi, Bj, Ui, Uj),
121 sinus_triangle(Ai, Aj, Bi, Bj, Vi, Vj)))
122 if (sign_diff_ou_egal_zero(sinus_triangle(Ui, Uj, Vi, Vj, Ai, Aj),
123 sinus_triangle(Ui, Uj, Vi, Vj, Bi, Bj)))
128 __global__ void kernel_test_croisement_move_seg_strict(struct snake_node_gpu *d_snake, uint32 nx, uint32 Nxi, uint32 Nxj, int Nb_nodes, bool * croist)
130 int idx = blockDim.x*blockIdx.x + threadIdx.x, idx_prec, idx_suiv ;
131 int na, nb, naa, nbb ;
132 int Nai, Naj, Nbi, Nbj ;
133 bool croistil = false ;
135 calcul_indices_prec_suiv(Nb_nodes, nx, na, nb);
136 calcul_indices_prec_suiv(Nb_nodes, na, naa, nbb);
138 //coord. nodes extremites des segments a tester
139 Nai = d_snake[na].posi ;
140 Naj = d_snake[na].posj ;
141 Nbi = d_snake[nb].posi ;
142 Nbj = d_snake[nb].posj ;
144 if (idx == nb) //premier segment apres
146 calcul_indices_prec_suiv(Nb_nodes, idx, idx_prec, idx_suiv);
147 if ( test_croisement_large(Nxi, Nxj, Nbi, Nbj,
148 Nbi, Nbj, d_snake[idx_suiv].posi, d_snake[idx_suiv].posj))
150 else if ( test_croisement_strict(Nai, Naj, Nxi, Nxj,
151 Nbi, Nbj, d_snake[idx_suiv].posi, d_snake[idx_suiv].posj) )
154 else if ( idx == naa ) //premier segment avant
156 if ( test_croisement_large(d_snake[naa].posi, d_snake[naa].posj, Nai, Naj,
157 Nai, Naj, Nxi, Nxj) )
159 else if ( test_croisement_strict(d_snake[naa].posi, d_snake[naa].posj, Nai, Naj,
163 else if ( (idx != nx) && (idx != na) ) //les autres segments
165 calcul_indices_prec_suiv(Nb_nodes, idx, idx_prec, idx_suiv);
166 if ( test_croisement_strict(Nai, Naj, Nxi, Nxj,
167 d_snake[idx].posi, d_snake[idx].posj,
168 d_snake[idx_suiv].posi, d_snake[idx_suiv].posj) )
170 else if ( test_croisement_strict(Nxi, Nxj, Nbi, Nbj,
171 d_snake[idx].posi, d_snake[idx].posj,
172 d_snake[idx_suiv].posi, d_snake[idx_suiv].posj) )
176 croist[idx] = croistil ;
179 __device__ bool croisement(snake_node_gpu *d_snake, uint32 nx, uint32 Nxi, uint32 Nxj, int Nb_nodes)
181 int idx_prec, idx_suiv ;
182 int na, nb, naa, nbb ;
183 int Nai, Naj, Nbi, Nbj ;
184 bool croistil = false ;
186 //coord. nodes extremites des segments a tester
187 calcul_indices_prec_suiv(Nb_nodes, nx, na, nb);
188 calcul_indices_prec_suiv(Nb_nodes, na, naa, nbb);
190 Nai = d_snake[na].posi ;
191 Naj = d_snake[na].posj ;
192 Nbi = d_snake[nb].posi ;
193 Nbj = d_snake[nb].posj ;
196 for (int idx=0; idx < Nb_nodes; idx++){
197 if (idx == nb) //premier segment apres
199 calcul_indices_prec_suiv(Nb_nodes, idx, idx_prec, idx_suiv);
200 if ( test_croisement_large(Nxi, Nxj, Nbi, Nbj, Nbi, Nbj, d_snake[idx_suiv].posi, d_snake[idx_suiv].posj) )
205 if ( test_croisement_strict(Nai, Naj, Nxi, Nxj, Nbi, Nbj, d_snake[idx_suiv].posi, d_snake[idx_suiv].posj) )
211 if ( idx == naa ) //premier segment avant
213 if ( test_croisement_large(d_snake[naa].posi, d_snake[naa].posj, Nai, Naj, Nai, Naj, Nxi, Nxj) )
218 if ( test_croisement_strict(d_snake[naa].posi, d_snake[naa].posj, Nai, Naj, Nxi, Nxj, Nbi, Nbj))
224 if ( (idx != nx) && (idx != na) && (idx != nb) && (idx != naa) ) //les autres segments
226 calcul_indices_prec_suiv(Nb_nodes, idx, idx_prec, idx_suiv);
227 if ( test_croisement_strict(Nai, Naj, Nxi, Nxj,
228 d_snake[idx].posi, d_snake[idx].posj,
229 d_snake[idx_suiv].posi, d_snake[idx_suiv].posj) )
234 if ( test_croisement_strict(Nxi, Nxj, Nbi, Nbj,
235 d_snake[idx].posi, d_snake[idx].posj,
236 d_snake[idx_suiv].posi, d_snake[idx_suiv].posj) )