diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 90dfb44018a3b8b9234bdfd735ce8e52db6bcfeb..03985d97c435a770f589a12b336f898bb254f263 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -19,5 +19,5 @@ target_link_libraries(module_lineage PUBLIC aevol)
 add_executable(module_anc_stat module_anc_stat.cpp)
 target_link_libraries(module_anc_stat PUBLIC aevol)
 
-add_executable(sswm sswm.cpp MutationSswm.cpp)
+add_executable(sswm sswm.cpp MutationFactorySswm.cpp)
 target_link_libraries(sswm PUBLIC aevol)
\ No newline at end of file
diff --git a/src/MutationSswm.cpp b/src/MutationFactorySswm.cpp
similarity index 77%
rename from src/MutationSswm.cpp
rename to src/MutationFactorySswm.cpp
index d2ad39b85a05a0f53e574ce27e48a50e58abb74c..c69b12aa94079d2180a01957810d0bbe78457566 100644
--- a/src/MutationSswm.cpp
+++ b/src/MutationFactorySswm.cpp
@@ -1,38 +1,33 @@
-#include "MutationSswm.h"
+#include "MutationFactorySswm.h"
 
 #include "AbstractFuzzy_7.h"
 #include "AeTime.h"
+#include "DnaMutator.h"
+#include "Individual_7.h"
+#include "JumpingMT.h"
 #include "Metadata.h"
+#include "MutationDataAdapter.h"
 #include "Promoter.h"
 #include "Protein_7.h"
 #include "Rna_7.h"
-#include "MutationDataAdapter.h"
-#include "Individual_7.h"
-#include "JumpingMT.h"
-#include "DnaMutator.h"
-
 
 #include <algorithm>
 #include <chrono>
 #include <err.h>
 #include <fstream>
-#include <utility>
 #include <sys/stat.h>
+#include <utility>
 
-
-
-MutationFactorySswm::MutationFactorySswm(std::shared_ptr<aevol::JumpingMT> prng,
-                           MutationParametersSswm mut_parameters) {
-  prng_nb = prng; // permet d'eviter d'incrimenter 2 fois
-  mp_sswm = mut_parameters;
-}
+MutationFactorySswm::MutationFactorySswm(int seed,
+                           MutationParametersSswm mut_parameters)
+  : mp_sswm(mut_parameters), prng_nb(seed) {}
 
 
 bool MutationFactorySswm::is_inversion() {
   auto* probs = new double[2]; //
   probs[0] = mp_sswm.inversion_rate_; // par défaut [0] = prob de inversion
   probs[1] = 1-probs[0];
-  int nb = prng_nb->roulette_random(probs, 2);
+  int nb = prng_nb.roulette_random(probs, 2);
   return nb == 0; // par defition on 0 = inversion
 }
 
@@ -41,12 +36,12 @@ aevol::MutationEvent MutationFactorySswm::do_mutation(int dna_lenght) {
 //  _____ If inversion
   if (is_inversion_bool) {
     int32_t pos_1, pos_2;
-    pos_1 = prng_nb->random(dna_lenght);
-    pos_2 = prng_nb->random(dna_lenght);
+    pos_1 = prng_nb.random(dna_lenght);
+    pos_2 = prng_nb.random(dna_lenght);
 
     while (pos_2 == pos_1)
     {
-      pos_2 = prng_nb->random(dna_lenght);
+      pos_2 = prng_nb.random(dna_lenght);
     }
 
     // if (pos_1 == pos_2) return nullptr; // Invert everything <=> Invert nothing!
@@ -62,7 +57,7 @@ aevol::MutationEvent MutationFactorySswm::do_mutation(int dna_lenght) {
   }
 //  _____If not inversion
   else {
-    int32_t pos = prng_nb->random(dna_lenght);
+    int32_t pos = prng_nb.random(dna_lenght);
     auto mevent = aevol::MutationEvent();
     mevent.switch_pos(pos);
 //    printf("Its a ponctual mutation\n");
diff --git a/src/MutationSswm.h b/src/MutationFactorySswm.h
similarity index 71%
rename from src/MutationSswm.h
rename to src/MutationFactorySswm.h
index e02ca124612d1c2d73b2eef7362b85bda1450c11..71c1c121ef9c26a772db83445b51d0b35f08ed1b 100644
--- a/src/MutationSswm.h
+++ b/src/MutationFactorySswm.h
@@ -20,11 +20,10 @@ struct MutationParametersSswm {
 class MutationFactorySswm {
   bool is_inversion();
 
-  MutationParametersSswm mp_sswm{};
-  std::shared_ptr<aevol::JumpingMT> prng_nb;
+  const MutationParametersSswm mp_sswm;
+  aevol::JumpingMT prng_nb;
  public:
-  MutationFactorySswm(std::shared_ptr<aevol::JumpingMT> prng,
-               MutationParametersSswm mut_parameters);
+  MutationFactorySswm(int seed, MutationParametersSswm mut_parameters);
 
   aevol::MutationEvent do_mutation(int dna_lenght);
 
diff --git a/src/sswm.cpp b/src/sswm.cpp
index 71902d7414c99b93ae960a4cfc6158657780f662..129dc67c8744f45f939b5ab00c1b4f5abe8aa804 100644
--- a/src/sswm.cpp
+++ b/src/sswm.cpp
@@ -4,12 +4,12 @@
 #include "Individual_7.h"
 #include "json.hpp"
 #include "JumpingMT.h"
-#include "MutationSswm.h"
+#include "MutationFactorySswm.h"
 
 #include <iomanip>
+#include <iostream>
 #include <string>
 #include <vector>
-#include <iostream>
 
 using namespace aevol;
 using json = nlohmann::json;
@@ -75,7 +75,7 @@ void from_json(const json& j, Parameters& p) {
 }
 
 int main(int argc, char* argv[]) { // USAGE: program GENE_JSON_FILE MUTATION_RATE NB_GENERATION NEUTRAL_MUTATION_BOOL
-  if (argc != 5) {
+  if (argc != 6 and argc != 5 ) {
     printf("!!!\nPlease don't forget to write the json file then the"
            " inversion rate, the number of generation"
            " and to chose if neutral mutation are selected\n!!!\n");
@@ -92,6 +92,10 @@ int main(int argc, char* argv[]) { // USAGE: program GENE_JSON_FILE MUTATION_RAT
   const float inversion_rate = std::stof(argv[2]);
   const long nb_gen = std::stol(argv[3]);
   const std::string if_eq = argv[4];
+  std::string hikes;
+  if (argc == 6) {
+    hikes = argv[5];
+  }
 
   json inputs;
   input_file >> inputs;
@@ -120,9 +124,6 @@ int main(int argc, char* argv[]) { // USAGE: program GENE_JSON_FILE MUTATION_RAT
   }
   FuzzyFactory_7 fuzzyFactory(VECTOR, p.sampling);
   auto* target = define_target(gaussians, p.sampling, fuzzyFactory);
-  JumpingMT prng(p.seed); // générateur de nombre aléatoire à partir d'une seed.
-
-
 
   const auto& seq = inputs.at("individual").get<std::string>();
   int src_seq_length = seq.length();
@@ -137,7 +138,6 @@ int main(int argc, char* argv[]) { // USAGE: program GENE_JSON_FILE MUTATION_RAT
   Individual_7* new_indiv = nullptr;
 
   auto* fuzzyFac = &fuzzyFactory;
-  auto prng_shared_ptr = std::make_shared<aevol::JumpingMT>(prng); // ici on crééer un shared pointeur (le truc a droite permet de faire un shared pointeur)
   const int dna_length = individual->dna_->length();
   long good_mut = 0;
   long neutral_mut = 0;
@@ -156,19 +156,23 @@ int main(int argc, char* argv[]) { // USAGE: program GENE_JSON_FILE MUTATION_RAT
                                  underscore +
                                  if_eq +
                                  underscore +
+                                 hikes +
+                                 underscore +
                                  extension;
   std::ofstream output_evol_file(result_evol_file);
   output_evol_file << " nb_gen,non_mutant,mutant,mutation" << std::endl;
 
 
-  MutationFactorySswm mutationFactorySswm(prng_shared_ptr, mp);
+  // Création de la fabrique de mutation, la seed permet d'initialiser le
+  // générateur de nombre aléatoire interne
+  MutationFactorySswm mutationFactorySswm(p.seed, mp);
 
 
   if (not output_evol_file.is_open()) {
     fprintf(stderr, "Error, cannot open file %s\n", result_evol_file.c_str()); // utilisation de `fprintf` parmet d'écrire spécifiquement dans le stderr. C'est explicitement une erreur
     exit(EXIT_FAILURE);
   }
-  for (int i = 0; i <= nb_gen; i++) {
+  for (int i = 0; i < nb_gen; i++) {
     auto mutationEvent = mutationFactorySswm.do_mutation(dna_length);
     new_indiv = new aevol::Individual_7(individual);
     new_indiv->dna_->apply_mutation(mutationEvent);
@@ -187,9 +191,15 @@ int main(int argc, char* argv[]) { // USAGE: program GENE_JSON_FILE MUTATION_RAT
     else if (individual->fitness == new_indiv->fitness and if_eq == "y") {
       delete individual;
       individual = new_indiv;
+      output_evol_file << i << "," << individual->fitness << ","
+                       << new_indiv->fitness << "," << mutationEvent.type()
+                       << std::endl;
       neutral_mut++;
     }
     else {
+      output_evol_file << i << "," << individual->fitness << ","
+                       << new_indiv->fitness << "," << mutationEvent.type()
+                       << std::endl;
       delete new_indiv;
       new_indiv = nullptr;
     }
@@ -206,8 +216,15 @@ int main(int argc, char* argv[]) { // USAGE: program GENE_JSON_FILE MUTATION_RAT
   inputs["individual"] = result;
 
   std::string base_result_file = "sswm_result_";
-  std::string result_file = base_result_file + nbgen_result_file +
-                            underscore + prob_result_file + underscore + if_eq + underscore +
+  std::string result_file = base_result_file +
+                            nbgen_result_file +
+                            underscore +
+                            prob_result_file +
+                            underscore +
+                            if_eq +
+                            underscore +
+                            hikes +
+                            underscore +
                             who_result_file;
   std::ofstream output_file(result_file);
   output_file << std::setw(2) << inputs << std::endl;