From 411053412256db3f81d015402015a79025da9c89 Mon Sep 17 00:00:00 2001 From: nojhan Date: Mon, 27 Apr 2020 22:00:10 +0200 Subject: [PATCH] fix: better dimension management in edo/adaptive operators --- edo/src/edoDistribReset.h | 17 ++++++++++++++++- edo/src/edoEstimatorAdaptiveEdit.h | 2 +- edo/src/edoEstimatorAdaptiveReset.h | 16 +++++++++++++--- edo/src/edoEstimatorNormalAdaptive.h | 3 ++- edo/src/edoNormalAdaptive.h | 20 ++++++++++++++++++-- 5 files changed, 50 insertions(+), 8 deletions(-) diff --git a/edo/src/edoDistribReset.h b/edo/src/edoDistribReset.h index 6c4fe118e..4b826d4f1 100644 --- a/edo/src/edoDistribReset.h +++ b/edo/src/edoDistribReset.h @@ -39,16 +39,31 @@ class edoDistribReset : public eoAlgoReset { public: using EOType = typename D::EOType; + edoDistribReset( D& distrib ) : + _has_dim(false), + _dim(0), + _distrib(distrib) + { } + + edoDistribReset( D& distrib, size_t dim ) : + _has_dim(true), + _dim(dim), _distrib(distrib) { } virtual void operator()( eoPop& pop ) { - _distrib.reset(); + if(_has_dim) { + _distrib.reset(_dim); + } else { + _distrib.reset(); + } } protected: + bool _has_dim; + size_t _dim; D& _distrib; }; diff --git a/edo/src/edoEstimatorAdaptiveEdit.h b/edo/src/edoEstimatorAdaptiveEdit.h index cefd4187c..191e536b3 100644 --- a/edo/src/edoEstimatorAdaptiveEdit.h +++ b/edo/src/edoEstimatorAdaptiveEdit.h @@ -31,7 +31,7 @@ Authors: #include "edoEstimatorAdaptive.h" -/** An estimator that calls `reset` on the managed distribution. +/** An estimator that change the parameters on the managed distribution. * * @ingroup Estimators */ diff --git a/edo/src/edoEstimatorAdaptiveReset.h b/edo/src/edoEstimatorAdaptiveReset.h index 012784a3d..c7dfd4939 100644 --- a/edo/src/edoEstimatorAdaptiveReset.h +++ b/edo/src/edoEstimatorAdaptiveReset.h @@ -41,14 +41,24 @@ class edoEstimatorAdaptiveReset : public edoEstimatorAdaptive public: typedef typename D::EOType EOType; - edoEstimatorAdaptiveReset( D& distrib ) : edoEstimatorAdaptive(distrib) {} + edoEstimatorAdaptiveReset( D& distrib ) : + edoEstimatorAdaptive(distrib), + _dim(0) + { } - virtual D operator() ( eoPop& ) + edoEstimatorAdaptiveReset( D& distrib, size_t dim ) : + edoEstimatorAdaptive(distrib), + _dim(dim) + { } + + virtual D operator()( eoPop& ) { - this->_distrib.reset(); + this->_distrib.reset(_dim); return this->_distrib; } +protected: + size_t _dim; }; #endif // !_edoEstimatorAdaptiveReset_h diff --git a/edo/src/edoEstimatorNormalAdaptive.h b/edo/src/edoEstimatorNormalAdaptive.h index be8c88d15..8dd03af1f 100644 --- a/edo/src/edoEstimatorNormalAdaptive.h +++ b/edo/src/edoEstimatorNormalAdaptive.h @@ -90,7 +90,8 @@ public: * INITIALIZATION *********************************************************************/ - unsigned int N = pop[0].size(); // FIXME expliciter la dimension du pb ? + unsigned int N = this->distribution().size(); + assert(this->distribution().size() == pop[0].size()); unsigned int lambda = pop.size(); // number of calls to the operator == number of generations diff --git a/edo/src/edoNormalAdaptive.h b/edo/src/edoNormalAdaptive.h index 1d8a82bd7..7b60d2b96 100644 --- a/edo/src/edoNormalAdaptive.h +++ b/edo/src/edoNormalAdaptive.h @@ -119,7 +119,13 @@ public: unsigned int size() { - return _mean.innerSize(); + assert( _mean.innerSize() == _dim ); + assert( _C.innerSize() == _dim && _C.outerSize() == _dim ); + assert( _B.innerSize() == _dim && _B.outerSize() == _dim ); + assert( _D.innerSize() == _dim ); + assert( _p_c.innerSize() == _dim ); + assert( _p_s.innerSize() == _dim ); + return _dim; } Vector mean() const {return _mean;} @@ -139,6 +145,7 @@ public: */ void mean( EOT m ) { + assert(m.size() == _dim); Vector center( m.size() ); for( unsigned int i=0, end=m.size(); i