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