Skip to content
Snippets Groups Projects
Commit bf5f1cfb authored by timeo's avatar timeo
Browse files

version arbre des suffixes fonctionnelles + openMP

parent 8f694e2a
No related branches found
No related tags found
No related merge requests found
......@@ -342,9 +342,6 @@ int32_t nbAdditifSuffixTree(){
return -1;
}
for (int i = 0; i<9; i++)
std::cout<<suffixTree[i];
std::cout<<std::endl;
/*
......@@ -367,12 +364,9 @@ int32_t nbAdditifSuffixTree(){
tailleChaine = i+1; //Taille de la chaine courante
if ((tailleChaine % 3) == 0){ //Si la taille est divisible par 3
tailleBloc = (tailleChaine / 3);
// std::cout<< "taille de bloc : " << tailleBloc << std::endl;
int additionbloc1 = valeurBloc(suffixTree[0], suffixTree[0] + tailleBloc - 1);
int additionbloc2 = valeurBloc(suffixTree[0]+tailleBloc, suffixTree[0] + 2*tailleBloc - 1);
int additionbloc3 = valeurBloc(suffixTree[0]+2*tailleBloc, suffixTree[0]+3*tailleBloc - 1);
// std::cout << "1er bloc : " << additionbloc1 << " 2è bloc : " << additionbloc2 << " 3è bloc : " << additionbloc3 << std::endl;
if (additionbloc1 == additionbloc2 && additionbloc2 == additionbloc3)// Lorsqu'il y a une additivité cubique
......@@ -385,7 +379,6 @@ int32_t nbAdditifSuffixTree(){
//Boucle pour les tours suivants
int32_t compteur_parcours; //Compte le nombre de tours de boucle lors du parcours pour comparer les 2 suffixes
for (int i = 1; i < fichier.size(); i++){
compteur_parcours = 0;
......@@ -394,33 +387,122 @@ int32_t nbAdditifSuffixTree(){
compteur_parcours++;
}
std::cout << "suffixTree : " << suffixTree[i] << std::endl;
std::cout << "compteurParcours : " << compteur_parcours << std::endl;
//Dès que différence trouvée, on parcourt le courant jusqu'à sa fin
for (int j = suffixTree[i] + compteur_parcours; j < fichier.size() ; j++){
tailleChaine = compteur_parcours + 1 + (j - (suffixTree[i] + compteur_parcours));
tailleChaine = compteur_parcours + 1 + (j - (suffixTree[i] + compteur_parcours)); // On augmente la taille de la chaine avec la boucle, en partant du nombre de char qu'il a fallu parcourir pour trouver une différence
if ((tailleChaine % 3 == 0) && tailleChaine < fichier.size()){
tailleBloc = tailleChaine / 3;
std::cout << tailleBloc << " ";
int additionbloc1 = valeurBloc(suffixTree[i], suffixTree[i] + tailleBloc - 1);
int additionbloc2 = valeurBloc(suffixTree[i]+tailleBloc, suffixTree[i] + 2*tailleBloc - 1);
int additionbloc3 = valeurBloc(suffixTree[i]+2*tailleBloc, suffixTree[i]+3*tailleBloc - 1);
if (additionbloc1 == additionbloc2 && additionbloc2 == additionbloc3)// Lorsqu'il y a une additivité cubique
{
nbAdditive++;
}
}
}
}
return nbAdditive;
}
int32_t nbAdditifSuffixTreeWithOpenMP(int nb){
int32_t nbAdditive = 0; //Compteur de somme cubique
//Création de l'arbre des suffixes
int32_t fs = 4000; //Taille supplémentaire pour l'exécution de la lib
int32_t* T = new int32_t[fichier.size()]; // tableau d'entrée
int32_t* suffixTree = new int32_t[fichier.size() + fs]; //tableau de sortie
for (int i = 0; i < fichier.size(); i++){
T[i] = fichier[i] - 48;
}
int32_t length = (fichier.size());
int32_t alphabet_size = length;
int32_t ret = libsais_int(T, suffixTree, length, alphabet_size, fs);
if (ret != 0){
std::cout << "erreur dans la création du tableau des suffixes" << std::endl;
return -1;
}
/*
Idée de l'algo :
Génération de la somme partielle et de l'arbre des suffixes
On parcourt tout les suffixes dans l'ordre
On compare le suffixe courant avec le précédent, chiffre par chiffre
Dès qu'un chiffre diffère, on arrête la comparaison
A partir du chiffre différent, on garde tout les suffixes, en augmentant à chaque fois la taille de 1
Dès qu'une taille est multiple de 3, on vérifie si il n'y a pas de cube additif
Il faut exclure le premier tour car on a rien pour comparer
*/
int tailleChaine;
int32_t tailleBloc;
//Premier tour
#pragma omp parallel for num_threads(nb)
for(int i = 0; i < fichier.size() - suffixTree[0]; i++){
tailleChaine = i+1; //Taille de la chaine courante
if ((tailleChaine % 3) == 0){ //Si la taille est divisible par 3
tailleBloc = (tailleChaine / 3);
int additionbloc1 = valeurBloc(suffixTree[0], suffixTree[0] + tailleBloc - 1);
int additionbloc2 = valeurBloc(suffixTree[0]+tailleBloc, suffixTree[0] + 2*tailleBloc - 1);
int additionbloc3 = valeurBloc(suffixTree[0]+2*tailleBloc, suffixTree[0]+3*tailleBloc - 1);
if (additionbloc1 == additionbloc2 && additionbloc2 == additionbloc3)// Lorsqu'il y a une additivité cubique
{
nbAdditive++;
}
}
//std::cout << compteur_parcours << std::endl;
std::cout << std::endl << std::endl;
}
//Boucle pour les tours suivants
int32_t compteur_parcours; //Compte le nombre de tours de boucle lors du parcours pour comparer les 2 suffixes
#pragma omp parallel for num_threads(nb)
for (int i = 1; i < fichier.size(); i++){
compteur_parcours = 0;
//Recherche de la première différence entre le précédent et le courant
while (T[suffixTree[i-1] + compteur_parcours] == T[suffixTree[i] + compteur_parcours]){
compteur_parcours++;
}
//Dès que différence trouvée, on parcourt le courant jusqu'à sa fin
for (int j = suffixTree[i] + compteur_parcours; j < fichier.size() ; j++){
tailleChaine = compteur_parcours + 1 + (j - (suffixTree[i] + compteur_parcours)); // On augmente la taille de la chaine avec la boucle, en partant du nombre de char qu'il a fallu parcourir pour trouver une différence
if ((tailleChaine % 3 == 0) && tailleChaine < fichier.size()){
tailleBloc = tailleChaine / 3;
int additionbloc1 = valeurBloc(suffixTree[i], suffixTree[i] + tailleBloc - 1);
int additionbloc2 = valeurBloc(suffixTree[i]+tailleBloc, suffixTree[i] + 2*tailleBloc - 1);
int additionbloc3 = valeurBloc(suffixTree[i]+2*tailleBloc, suffixTree[i]+3*tailleBloc - 1);
if (additionbloc1 == additionbloc2 && additionbloc2 == additionbloc3)// Lorsqu'il y a une additivité cubique
{
nbAdditive++;
}
}
}
}
return nbAdditive;
}
int main(){
parseFile("testfiles/10fromCorrect.txt");
parseFile("testfiles/100000fromCorrect.txt");
sommeAdditive();
//ecrireSommeCentre();
high_resolution_clock::time_point t1 = high_resolution_clock::now();
std::cout << nbAdditifSuffixTree() << std::endl;
std::cout << std::endl << nbAdditifWithSomme() << std::endl;
high_resolution_clock::time_point t2 = high_resolution_clock::now();
duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
......@@ -474,3 +556,6 @@ int main(){
// free(T);
// free(SA); */
}
//Pour un fichier d'un M de char, avec des erreurs, 185s avec somme cumulée openMP, 2034s avec arbre des suffixes sans OpenMP
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment