openModeller  Version 1.4.0
ScaleNormalizer.cpp
Go to the documentation of this file.
00001 
00027 #include <openmodeller/ScaleNormalizer.hh>
00028 #include <openmodeller/Sampler.hh>
00029 #include <openmodeller/Log.hh>
00030 
00031 using namespace std;
00032 
00033 /*******************/
00034 /*** constructor ***/
00035 ScaleNormalizer::ScaleNormalizer( Scalar min, Scalar max, bool useLayerAsRef ) :
00036   _min( min ),
00037   _max( max ),
00038   _use_layer_as_ref( useLayerAsRef ),
00039   _offsets(),
00040   _scales()
00041 {
00042 }
00043 
00044 /*******************/
00045 /*** constructor ***/
00046 ScaleNormalizer::ScaleNormalizer() :
00047   _min( 0.0 ),
00048   _max( 1.0 ),
00049   _use_layer_as_ref( true ),
00050   _offsets(),
00051   _scales()
00052 {
00053 }
00054 
00055 /******************/
00056 /*** destructor ***/
00057 ScaleNormalizer::~ScaleNormalizer() {}
00058 
00059 /****************/
00060 /*** get Copy ***/
00061 Normalizer * ScaleNormalizer::getCopy() {
00062 
00063   return new ScaleNormalizer( *this );
00064 }
00065 
00066 /*****************************/
00067 /*** compute Normalization ***/
00068 void ScaleNormalizer::computeNormalization( const ReferenceCountedPointer<const SamplerImpl>& samplerPtr ) {
00069 
00070   int dim = samplerPtr->numIndependent();
00071   Sample smin(dim), smax(dim);
00072 
00073   bool get_minmax_from_sampler = true;
00074 
00075   if ( _use_layer_as_ref ) {
00076 
00077     Log::instance()->debug( "Using min/max from layer as reference for normalization.\n");
00078 
00079     EnvironmentPtr envPtr = samplerPtr->getEnvironment();
00080 
00081     if ( envPtr ) { 
00082 
00083       envPtr->getMinMax( &smin, &smax );
00084 
00085       get_minmax_from_sampler = false;
00086     }
00087     else {
00088 
00089       Log::instance()->warn( "Sampler has no environment. ScaleNormalizaer will get min/max directly from samples instead.\n");
00090     }
00091   }
00092   else {
00093 
00094     Log::instance()->debug( "Using min/max from input samples as reference for normalization.\n");
00095   }
00096 
00097   if ( get_minmax_from_sampler ) {
00098 
00099     samplerPtr->getMinMax( &smin, &smax );
00100   }
00101 
00102   _scales.resize(dim);
00103   _offsets.resize(dim);
00104 
00105   for ( int i = 0; i < dim; ++i ) {
00106 
00107     if ( smax[i] == smin[i] ) {
00108 
00109       Log::instance()->warn( "Min/max values for variable %d are the same during normalization!\n", (i+1));
00110 
00111       // Avoid zero division
00112       _scales[i] = 1.0;
00113     }
00114     else {
00115 
00116       _scales[i] = (_max - _min) / (smax[i] - smin[i]);
00117     }
00118 
00119     _offsets[i] = _min - _scales[i] * smin[i];
00120   }
00121 }
00122 
00123 /*****************/
00124 /*** normalize ***/
00125 void ScaleNormalizer::normalize( Sample * samplePtr ) {
00126 
00127   if ( samplePtr->size() != 0 ) {
00128 
00129     *samplePtr *= _scales;
00130     *samplePtr += _offsets;
00131   }
00132 }
00133 
00134 /*************************/
00135 /*** get configuration ***/
00136 ConfigurationPtr ScaleNormalizer::getConfiguration() const {
00137 
00138   ConfigurationPtr config( new ConfigurationImpl("Normalization") );
00139 
00140   config->addNameValue( "Class", "ScaleNormalizer" );
00141 
00142   int temp_val = (_use_layer_as_ref) ? 1 : 0;
00143 
00144   config->addNameValue( "UseLayerAsRef", temp_val );
00145 
00146   config->addNameValue( "Min", _min );
00147   config->addNameValue( "Max", _max );
00148   
00149   config->addNameValue( "Offsets", _offsets );
00150   config->addNameValue( "Scales", _scales );
00151 
00152   return config;
00153 }
00154 
00155 /*************************/
00156 /*** set configuration ***/
00157 void ScaleNormalizer::setConfiguration( const ConstConfigurationPtr &config ) {
00158 
00159   int temp_val = config->getAttributeAsInt( "UseLayerAsRef", 1 );
00160 
00161   _use_layer_as_ref = (temp_val == 1) ? true : false;
00162 
00163   _min = config->getAttributeAsDouble( "Min", 0.0 );
00164   _max = config->getAttributeAsDouble( "Max", 1.0 );
00165 
00166   _offsets = config->getAttributeAsSample( "Offsets" );
00167   _scales  = config->getAttributeAsSample( "Scales" );
00168 }