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
00017
00018 if (only_one == NULL)
00019 only_one = new Gain_Schedule();
00020
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
00031 max_gain = TIME_STEP/DAMPING;
00032
00033 gain = max_gain;
00034
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
00059 if(period>0){period--;}
00060
00061 if (e>0){}
00062
00063 if (count>0) {}
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 gain=ref_gain;
00089 }
00090
00091 void Gain_Schedule::initAvg (void)
00092 {
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105 ref_gain = gain;
00106 }
00107
00108 void Gain_Schedule::freeAvg (void)
00109 {
00110
00111
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
00126 if(period==0)
00127 {
00128
00129
00130 if( atSteadyState()==true && gain>step)
00131 {
00132
00133 gain -= step;
00134
00135 period = REFRACTORY_PERIOD;
00136
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