16#include <Array_tools.h>
21template <
typename _TYPE_,
typename _SIZE_>
33 auto last = std::unique(array.
addr(), array.
addr()+size);
34 _SIZE_ new_size =
static_cast<_SIZE_
>(std::distance(array.
addr(), last));
46template <
typename _TYPE_,
typename _SIZE_>
53 for (_SIZE_ i = 0; i < sz1; i++)
56 assert((i >= sz1-1) || (liste1[i] < liste1[i+1]));
57 assert((j >= sz2-1) || (liste2[j] < liste2[j+1]));
58 const _TYPE_ valeur_i = liste1[i];
60 while (j < sz2 && liste2[j] < valeur_i)
64 if (liste2[j] == valeur_i)
81void array_retirer_elements(ArrOfInt& sorted_array,
const ArrOfInt& sorted_elements_list)
87 const int m = sorted_elements_list.
size_array();
91 int j_value = sorted_elements_list[j];
92 for (i_read = 0; i_read < n; i_read++)
95 assert(i_read == 0 || sorted_array[i_read] > sorted_array[i_read-1]);
96 const int i_value = sorted_array[i_read];
100 while ((j_value < i_value) && (j < m))
105 assert(sorted_elements_list[j] > j_value);
106 j_value = sorted_elements_list[j];
109 if (j == m || j_value != i_value)
112 sorted_array[i_write] = i_value;
119template <
typename _SIZE_>
120static inline int same_line(
const IntTab_T<_SIZE_>& v, _SIZE_ i, _SIZE_ j)
123 for (
int k = 0; k < ls; k++)
124 if (v(i,k) != v(j,k))
136template <
typename _TYPE_,
typename _SIZE_>
142 const _SIZE_ nb_lignes = tab.
dimension(0);
147 if (nb_colonnes == 1)
149 else if (nb_colonnes == 2)
151 using pairs = std::array<_TYPE_, 2>;
152 _TYPE_ *ptr = tab.
addr();
153 pairs* tmp =
reinterpret_cast<pairs*
>(ptr);
154 std::sort(tmp, tmp+nb_lignes);
156 else if (nb_colonnes == 3)
158 using triplets = std::array<_TYPE_, 3>;
159 _TYPE_ *ptr = tab.
addr();
160 triplets* tmp =
reinterpret_cast<triplets*
>(ptr);
161 std::sort(tmp, tmp+nb_lignes);
163 else if (nb_colonnes == 4)
165 using quadruplets = std::array<_TYPE_, 4>;
166 _TYPE_ *ptr = tab.
addr();
167 quadruplets* tmp =
reinterpret_cast<quadruplets*
>(ptr);
168 std::sort(tmp, tmp+nb_lignes);
172 Cerr <<
"tri_lexicographique_tableau not supported for TRUST tabs with more than 4 columns" << finl;
187template <
typename _TYPE_,
typename _SIZE_>
190 using int_t = _SIZE_;
197 index.
resize_array(dimtab, RESIZE_OPTIONS::NOCOPY_NOINIT);
198 for (int_t i = 0; i < dimtab; i++)
204 const int nb_dim = tab.
nb_dim();
209 std::sort(index.
begin(), index.
end(), [&](int_t a, int_t b)
212 return ( tab(a)<tab(b) );
213 for (int i = 0; i < nb_colonnes; i++)
215 if ( std::fabs(tab(a,i)-tab(b,i)) > epsilon )
216 return ( tab(a,i)<tab(b,i) );
227template <
typename _SIZE_>
228void tableau_trier_retirer_doublons(IntTab_T<_SIZE_>& tab)
230 const _SIZE_ nb_lignes = tab.
dimension(0);
231 if (nb_lignes == 0)
return;
234 if (nb_colonnes == 1)
235 array_trier_retirer_doublons(tab);
238 nb_colonnes = tri_lexicographique_tableau(tab);
239 if (nb_colonnes == 2)
242 _SIZE_ last_x = tab(0, 0);
243 _SIZE_ last_y = tab(0, 1);
244 for (_SIZE_ i = 1; i < nb_lignes; i++)
246 const _SIZE_ x = tab(i, 0);
247 const _SIZE_ y = tab(i, 1);
248 if (x != last_x || y != last_y)
250 tab(j, 0) = last_x = x;
251 tab(j, 1) = last_y = y;
260 for (_SIZE_ i = 1; i < nb_lignes; i++)
263 if (!same_line(tab, i, j))
266 for (
int k = 0; k < nb_colonnes; k++)
267 tab(j, k) = tab(i, k);
277template int tri_lexicographique_tableau_indirect(
const TRUSTTab<int,int>& tab, ArrOfInt_T<int>& index);
278template int tri_lexicographique_tableau_indirect(
const TRUSTTab<double,int>& tab, ArrOfInt_T<int>& index);
281template void tableau_trier_retirer_doublons(IntTab_T<int>& tab);
295template void tableau_trier_retirer_doublons(IntTab_T<trustIdType>& tab);
302static inline int same_line_big(
const BigIntTab& v, trustIdType i, trustIdType j)
305 for (
int k = 0; k < ls; k++)
306 if (v(i,k) != v(j,k))
311void tableau_trier_retirer_doublons(BigIntTab& tab)
313 const trustIdType nb_lignes = tab.
dimension(0);
314 if (nb_lignes == 0)
return;
317 if (nb_colonnes == 1)
318 array_trier_retirer_doublons(tab);
321 nb_colonnes = tri_lexicographique_tableau(tab);
322 if (nb_colonnes == 2)
325 int last_x = tab(0, 0);
326 int last_y = tab(0, 1);
327 for (trustIdType i = 1; i < nb_lignes; i++)
329 const int x = tab(i, 0);
330 const int y = tab(i, 1);
331 if (x != last_x || y != last_y)
333 tab(j, 0) = last_x = x;
334 tab(j, 1) = last_y = y;
343 for (trustIdType i = 1; i < nb_lignes; i++)
345 if (!same_line_big(tab, i, j))
348 for (
int k = 0; k < nb_colonnes; k++)
349 tab(j, k) = tab(i, k);
368void calculer_renum_sans_doublons(
const IntTab& tab, ArrOfInt& renum, ArrOfInt& renum_inverse)
375 tri_lexicographique_tableau_indirect(tab, index);
380 renum_inverse.
resize_array(n, RESIZE_OPTIONS::NOCOPY_NOINIT);
385 for (
int i=0; i<n; ++i)
390 if ( ( latest < 0 ) || ( !(same_line(tab,index[i],index[latest]))) )
397 renum[index[i]] = count;
400 renum_inverse[count] = index[latest];
418int array_bsearch(
const ArrOfInt& tab,
int valeur)
426 assert(j == tab.
size_array() || tab[i] <= tab[j]);
427 const int milieu = (i + j) / 2;
428 const int val = tab[milieu];
431 else if (val < valeur)
static double precision_geom
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Represents a an array of int/int64/double/... values.
_SIZE_ size_array() const
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
: Tableau a n entrees pour n<= 4.
_SIZE_ dimension_tot(int) const override
void resize_dim0(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
virtual const MD_Vector & get_md_vector() const