gain_schedule.cc

Go to the documentation of this file.
00001 #include "gain_schedule.h"
00002 
00003 #include <iostream>
00004 
00005 #include "misc.h"
00006 
00007 using std::cout;
00008 using std::cerr;
00009 using std::endl;
00010 using std::left;
00011 
00012 Gain_Schedule * Gain_Schedule::only_one = NULL;
00013 
00014 Gain_Schedule & Gain_Schedule::instance(void)
00015 {
00016   // Not thread-safe.
00017   // -- lock mutex
00018   if (only_one == NULL)
00019     only_one = new Gain_Schedule();
00020   // -- unlock mutex
00021   return *only_one;
00022 }
00023 
00024 Gain_Schedule::Gain_Schedule (void)
00025   :num(0),period(0),sum(0),
00026   avg_new(0),avg_old(0),step(0),
00027   max_gain(0),ref_gain(0),gain(0),
00028   window(NULL),begin(NULL),end(NULL)
00029 {
00030   // inital max gain
00031   max_gain = TIME_STEP/DAMPING;
00032   // initialize gain
00033   gain = max_gain;
00034   // gain step size
00035   step = max_gain/NUM_GROUPS;
00036 }
00037 
00038 Gain_Schedule::Gain_Schedule (const Gain_Schedule & rhs)
00039   :num(0),period(0),sum(0),
00040   avg_new(0),avg_old(0),step(0),
00041   max_gain(0),ref_gain(0),gain(0),
00042   window(NULL),begin(NULL),end(NULL)
00043 {
00044   cout << "Copy constructor prohibited on instances of Gain_Schedule class.\n";
00045   cout << "Gain_Schedule " << rhs.num << endl;
00046   exit(0);
00047 }
00048 
00049 Gain_Schedule& Gain_Schedule::operator= (const Gain_Schedule& rhs)
00050 {
00051   cout << "Copy assignment operator prohibited on instances of Gain_Schedule class.\n";
00052   cout << "Gain_Schedule " << rhs.num << endl;
00053   exit(0);
00054 }
00055 
00056 void Gain_Schedule::updateAvg (double const e,int const count)
00057 {
00058   // update period
00059   if(period>0){period--;}
00060   // dummy
00061   if (e>0){}
00062   // dummy
00063   if (count>0) {}
00064 //  // if energy window is NOT full
00065 //  if(num<ENERGY_WINDOW)
00066 //  {
00067 //    // sum = old sum + new value
00068 //    sum=sum+e;
00069 //    num++;
00070 //  }
00071 //  else
00072 //  {
00073 //    // energy window is full
00074 //    // sum = old sum - oldest value in window + new value
00075 //    sum=sum-*window+e;
00076 //  }
00077 //  // update window average
00078 //  avg_old=avg_new;
00079 //  avg_new=sum/num;
00080 //  // replace window element
00081 //  *window=e;
00082 //  // move window
00083 //  if(window!=end){window++;}
00084 //  else {window=begin;}
00085   // print to stdout
00086   //if(!((count-1)%1000))
00087   // update iterator
00088   gain=ref_gain;
00089 }
00090 
00091 void Gain_Schedule::initAvg (void)
00092 {
00093  // sum=avg_new=avg_old=0.0;
00094  // num=0;
00095  // window = new double[ENERGY_WINDOW];
00096  // begin=window;
00097  // for(int i=0;i<ENERGY_WINDOW;i++)
00098  // {
00099  //   *(window++)=0.0;
00100  // }
00101  // window--;
00102  // end=window;
00103  // window=begin;
00104   // initialize reference gain
00105   ref_gain = gain;
00106 }
00107 
00108 void Gain_Schedule::freeAvg (void)
00109 {
00110 //  window=begin;
00111 //  delete[] window;
00112 }
00113 
00114 void Gain_Schedule::updateMaxGain (void)
00115 {
00116   if(DISABLE_GAIN_SCHEDULING==false)
00117   {
00118     if(max_gain>step){max_gain-=step;}
00119     if(gain>max_gain){gain=max_gain;}
00120   }
00121 }
00122 
00123 void Gain_Schedule::updateGain (void)
00124 {
00125   // if gain changeable?
00126   if(period==0)
00127   {
00128     // if change in mean energy < epsilon
00129     // and gain is larger than gain step size
00130     if( atSteadyState()==true && gain>step)
00131     {
00132       // decrease gain
00133       gain -= step;
00134       // reset gain period
00135       period = REFRACTORY_PERIOD;
00136       // update reference gain
00137       ref_gain = gain;
00138     } 
00139   }
00140 }
00141 
00142 bool Gain_Schedule::atSteadyState (void)
00143 {
00144   return distinguishable(avg_old,avg_new,ENERGY_EPSILON)==false;
00145 }
00146 
00147 double Gain_Schedule::getGain (void) const
00148 {
00149   return gain;
00150 }
00151 
00152 void Gain_Schedule::resetGain (void)
00153 {
00154   gain = ref_gain;
00155 }
00156 
00157 void Gain_Schedule::halveGain (void)
00158 {
00159   gain = gain/2.0;
00160 }
00161 
00162 double Gain_Schedule::getAvgNew (void) const
00163 {
00164   return avg_new;
00165 }
00166 
00167 

Generated on Fri Jul 18 19:43:39 2008 for meshmorph by  doxygen 1.5.1