From 3bcc57b054c9a78d2524212ff9f2af4be29dd5f5 Mon Sep 17 00:00:00 2001
From: Jonathan Rouzaud-Cornabas <jonathan.rouzaud-cornabas@inria.fr>
Date: Thu, 6 Aug 2015 16:38:45 +0200
Subject: [PATCH] start to fix X11 raevol bug (still unable to display
 concentrations)

---
 src/libaevol/AbstractFuzzy.h             |  2 +-
 src/libaevol/ExpManager_X11.cpp          |  6 ++--
 src/libaevol/Fuzzy.cpp                   |  2 +-
 src/libaevol/Fuzzy.h                     |  2 +-
 src/libaevol/FuzzyFactory.cpp            |  4 +++
 src/libaevol/FuzzyFactory.h              |  2 +-
 src/libaevol/HybridFuzzy.cpp             |  2 +-
 src/libaevol/HybridFuzzy.h               |  2 +-
 src/libaevol/PhenotypicTargetHandler.cpp | 42 +++++++++++++++++++++---
 src/libaevol/raevol/Individual_R_X11.cpp | 13 ++------
 src/libaevol/raevol/Protein_R.cpp        |  3 ++
 11 files changed, 57 insertions(+), 23 deletions(-)

diff --git a/src/libaevol/AbstractFuzzy.h b/src/libaevol/AbstractFuzzy.h
index 5f282587d..1013085c6 100644
--- a/src/libaevol/AbstractFuzzy.h
+++ b/src/libaevol/AbstractFuzzy.h
@@ -53,7 +53,7 @@ class AbstractFuzzy
 
   virtual bool is_identical_to(const AbstractFuzzy& fs, double tolerance) const = 0;
 
-  virtual void print() = 0;
+  virtual void print() const = 0;
 
   virtual void clear() = 0;
 
diff --git a/src/libaevol/ExpManager_X11.cpp b/src/libaevol/ExpManager_X11.cpp
index 03c964751..490397107 100644
--- a/src/libaevol/ExpManager_X11.cpp
+++ b/src/libaevol/ExpManager_X11.cpp
@@ -462,6 +462,7 @@ void ExpManager_X11::display(X11Window * win,
   } else {
     const HybridFuzzy fuzzy = (HybridFuzzy&)(fuzz);
     double hi,hi1;
+
     for (int i = 0; i < fuzzy.get_pheno_size() - 1; i++) {
       hi= (((double)i) / fuzzy.get_pheno_size());
       hi1= (((double)i+1) / fuzzy.get_pheno_size());
@@ -471,7 +472,6 @@ void ExpManager_X11::display(X11Window * win,
       next_x  = (      ((hi1) - X_MIN) / delta_x  ) * win->get_width();
       next_y  = ( 1 - ((fuzzy.get_points()[i+1] - y_min) / delta_y) ) * win->get_height();
 
-
       if (fuzzy.get_points()[i] >= 0 && fuzzy.get_points()[i+1] >= 0) {
         win->draw_line( cur_x, cur_y, next_x, next_y, color, bold );
 
@@ -483,6 +483,7 @@ void ExpManager_X11::display(X11Window * win,
             fill_color = X11Window::get_color( ((double)i / win->get_width()) * (X_MAX - X_MIN) );
             win->draw_line( i, ( 1 - ((0 -  y_min) / delta_y) ) * win->get_height(),
                             i, cur_y + (((i - cur_x) * (next_y - cur_y)) / (next_x - cur_x)) , fill_color );
+
             delete [] fill_color;
           }
         }
@@ -497,6 +498,7 @@ void ExpManager_X11::display(X11Window * win,
             fill_color = X11Window::get_color( ((double)i / win->get_width()) * (X_MAX - X_MIN) );
             win->draw_line( i, ( 1 - ((0 -  y_min) / delta_y) ) * win->get_height(),
                             i, cur_y + (((i - cur_x) * (next_y - cur_y)) / (next_x - cur_x)) , fill_color );
+
             delete [] fill_color;
           }
         }
@@ -509,8 +511,6 @@ void ExpManager_X11::display(X11Window * win,
         else if (fuzzy.get_points()[i+1] == 0.0) x_at_0 = hi1;
         else x_at_0 = ( (- d1) / p1 );
 
-//   		if (color == RED) printf("S1 %d %d %d %d\n",cur_x, cur_y, x_at_0, 0);
-//   		if (color == RED) printf("S2 %d %d %d %d\n",x_at_0, 0, next_x, next_y);
         win->draw_line( cur_x, cur_y, x_at_0, 0, color, bold );
 
         if ( fill )
diff --git a/src/libaevol/Fuzzy.cpp b/src/libaevol/Fuzzy.cpp
index ff87ccb43..4d87c3f41 100644
--- a/src/libaevol/Fuzzy.cpp
+++ b/src/libaevol/Fuzzy.cpp
@@ -430,7 +430,7 @@ void Fuzzy::add_point(double x, double y)
   }
 }
 
-void Fuzzy::print()
+void Fuzzy::print() const
 {
   for (const Point& p : points)
     printf("[%f : %f] ",p.x,p.y);
diff --git a/src/libaevol/Fuzzy.h b/src/libaevol/Fuzzy.h
index 5e314cd22..ca51bd839 100644
--- a/src/libaevol/Fuzzy.h
+++ b/src/libaevol/Fuzzy.h
@@ -114,7 +114,7 @@ class Fuzzy : public AbstractFuzzy
   // get_x should be moved out of fuzzy class as it really applies to pair of points
   double get_x(const Point& left, const Point& right, double y) const;
   bool is_identical_to(const AbstractFuzzy& fs, double tolerance) const;
-  void print();
+  void print() const;
   void clear();
   // ==========================================================================
   //                                 Setters
diff --git a/src/libaevol/FuzzyFactory.cpp b/src/libaevol/FuzzyFactory.cpp
index a9aaed6dc..4820637d5 100644
--- a/src/libaevol/FuzzyFactory.cpp
+++ b/src/libaevol/FuzzyFactory.cpp
@@ -140,6 +140,10 @@ AbstractFuzzy* FuzzyFactory::create_fuzzy(const gzFile backup)
   return fuzzy;
 }
 
+int FuzzyFactory::get_fuzzy_flavor()
+{
+  return _exp_s->get_fuzzy_flavor();
+}
 // ============================================================================
 //                            Non inline accessors
 // ============================================================================
diff --git a/src/libaevol/FuzzyFactory.h b/src/libaevol/FuzzyFactory.h
index 3605c4f4d..76d2311a2 100644
--- a/src/libaevol/FuzzyFactory.h
+++ b/src/libaevol/FuzzyFactory.h
@@ -62,7 +62,7 @@ class FuzzyFactory
   // ==========================================================================
   //                                 Getters
   // ==========================================================================
-
+  int get_fuzzy_flavor();
   // ==========================================================================
   //                                 Setters
   // ==========================================================================
diff --git a/src/libaevol/HybridFuzzy.cpp b/src/libaevol/HybridFuzzy.cpp
index bf6a2447c..04a5077cb 100644
--- a/src/libaevol/HybridFuzzy.cpp
+++ b/src/libaevol/HybridFuzzy.cpp
@@ -217,7 +217,7 @@ double HybridFuzzy::get_y( double x ) const
   return retValue;
 }
 
-void HybridFuzzy::print()
+void HybridFuzzy::print() const
 {
   for (int i = 0; i < _pheno_size; i++)
     printf("[%d : %f] ",i,_points[i]);
diff --git a/src/libaevol/HybridFuzzy.h b/src/libaevol/HybridFuzzy.h
index 99fc5e1a4..3ce5195be 100644
--- a/src/libaevol/HybridFuzzy.h
+++ b/src/libaevol/HybridFuzzy.h
@@ -61,7 +61,7 @@ class HybridFuzzy : public AbstractFuzzy
 
   int get_pheno_size() const { return _pheno_size; };
 
-  void print();
+  void print() const;
   inline void clear()  {reset();};
   // ==========================================================================
   //                                 Setters
diff --git a/src/libaevol/PhenotypicTargetHandler.cpp b/src/libaevol/PhenotypicTargetHandler.cpp
index 61ec93c4c..0f6a43d56 100644
--- a/src/libaevol/PhenotypicTargetHandler.cpp
+++ b/src/libaevol/PhenotypicTargetHandler.cpp
@@ -32,6 +32,7 @@
 // ============================================================================
 #include "PhenotypicTargetHandler.h"
 #include "ExpSetup.h"
+#include "HybridFuzzy.h"
 
 #include <iostream>
 
@@ -126,14 +127,47 @@ void PhenotypicTargetHandler::build_phenotypic_target() {
   phenotypic_target_->fuzzy()->reset();
 
   // Generate sample points from gaussians
-  if (not current_gaussians_.empty())
-    for (int16_t i = 0 ; i <= sampling_ ; i++) {
-      Point new_point = Point(X_MIN + (double)i * (X_MAX - X_MIN) / (double)sampling_, 0.0);
-      for (const Gaussian & g: current_gaussians_)
+  if (not current_gaussians_.empty()) {
+    for (int16_t i = 0; i <= sampling_; i++) {
+      Point new_point = Point(
+          X_MIN + (double) i * (X_MAX - X_MIN) / (double) sampling_, 0.0);
+      for (const Gaussian& g: current_gaussians_)
         new_point.y += g.compute_y(new_point.x);
       phenotypic_target_->fuzzy()->add_point(new_point.x, new_point.y);
     }
 
+    if (FuzzyFactory::fuzzyFactory->get_fuzzy_flavor() == 1) {
+      HybridFuzzy* fuz = (HybridFuzzy*) phenotypic_target_->fuzzy();
+
+      for (int i = 1; i < fuz->get_pheno_size(); i++) {
+        if (fuz->get_points()[i] == 0.0) {
+          int minL = i - 1;
+          int maxL = i + 1;
+          int dist = 1;
+
+          while (fuz->get_points()[maxL] == 0.0) {
+            maxL++;
+            dist++;
+          }
+          double inc = 0.0;
+          if (fuz->get_points()[maxL] > fuz->get_points()[minL]) {
+            inc = (fuz->get_points()[maxL] - fuz->get_points()[minL]) / dist;
+          } else {
+            inc = (fuz->get_points()[minL] - fuz->get_points()[maxL]) / dist;
+            minL = maxL;
+          }
+
+          for (int j = i; j < maxL; j++) {
+            fuz->get_points()[j] = fuz->get_points()[minL] + inc;
+            inc += inc;
+          }
+
+        }
+      }
+    }
+  }
+
+
   // Add lower and upper bounds
   phenotypic_target_->fuzzy()->clip(AbstractFuzzy::min, Y_MIN);
   phenotypic_target_->fuzzy()->clip(AbstractFuzzy::max, Y_MAX);
diff --git a/src/libaevol/raevol/Individual_R_X11.cpp b/src/libaevol/raevol/Individual_R_X11.cpp
index 6b4702474..ff22bca84 100644
--- a/src/libaevol/raevol/Individual_R_X11.cpp
+++ b/src/libaevol/raevol/Individual_R_X11.cpp
@@ -160,11 +160,7 @@ void Individual_R_X11::display_concentrations( X11Window* win )
   double x_step = 0.8 * win->get_width() / (double)(life_time * _exp_m->get_exp_s()->get_degradation_step());
   double y_step = 0.7 * win->get_height();
 
-  for(int16_t indiv_age = 0 ; indiv_age < life_time ; indiv_age+=0 )
-  {
-    //Updating the concentrations in order to respect the degradation step.
-    for( int16_t i = 0; i < 1/_exp_m->get_exp_s()->get_degradation_step(); i++ )
-    {
+  for (int indiv_age = 1; indiv_age <= get_exp_m()->get_exp_s()->get_nb_indiv_age(); indiv_age++) {
       update_concentrations();
 
       //affichage des points n+1 dans la concentration
@@ -183,18 +179,15 @@ void Individual_R_X11::display_concentrations( X11Window* win )
           strcpy( color2, "#FFFFFF" );
         }
 
-        win->draw_line( (int16_t)((win->get_width() / 10) + (((indiv_age/_exp_m->get_exp_s()->get_degradation_step())+i)*x_step))  ,
+        win->draw_line( (int16_t)((win->get_width() / 10) + (((indiv_age/_exp_m->get_exp_s()->get_nb_indiv_age())+i)*x_step))  ,
                         (int16_t)(( 9 * win->get_height() / 10)-(concentrations[proti]*y_step)) ,
-                        (int16_t)((win->get_width() / 10) + ((((indiv_age / _exp_m->get_exp_s()->get_degradation_step())+i) + 1) * x_step)) ,
+                        (int16_t)((win->get_width() / 10) + ((((indiv_age / _exp_m->get_exp_s()->get_nb_indiv_age())+i) + 1) * x_step)) ,
                         (int16_t)((9 * win->get_height() / 10)-(((Protein_R*)prot)->get_concentration()*y_step)) ,color2);
         concentrations[proti]=((Protein_R*)prot)->get_concentration();
 
         delete[] color2;
         proti++;
       }
-
-    }
-    indiv_age+=1;
   }
 
   _protein_list.clear();
diff --git a/src/libaevol/raevol/Protein_R.cpp b/src/libaevol/raevol/Protein_R.cpp
index 2f7710940..e3bc13397 100644
--- a/src/libaevol/raevol/Protein_R.cpp
+++ b/src/libaevol/raevol/Protein_R.cpp
@@ -143,6 +143,8 @@ Protein_R::Protein_R( gzFile backup_file ) : Protein::Protein( backup_file )
 Protein_R::~Protein_R( void )
 {
 	_rna_R_list.clear();
+
+  delete [] _cod_tab;
 }
 
 // =================================================================
@@ -151,6 +153,7 @@ Protein_R::~Protein_R( void )
 void Protein_R::compute_delta_concentration( void )
 {
   _delta_concentration = 0;
+
   if( _signal == false )
   {
 	for (auto& rna: _rna_R_list)
-- 
GitLab