openModeller
Version 1.4.0
|
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 }