15 state->getRegistry()->registerEntry(
"stats.file", (voidP) (
new std::string(
"")), ECF::STRING);
30 lowest_ = highest_ = 0;
32 if(state->getRegistry()->isModified(
"stats.file")) {
33 voidP sptr = state->getRegistry()->getEntry(
"stats.file");
34 statsFileName_ = *((std::string*) sptr.get());
36 statsFile_.open(statsFileName_.c_str());
38 throw std::string(
"Error: can't open stats file (") + statsFileName_ +
")";
51 generation = (int) statNo;
52 return min_[generation];
62 generation = (int) statNo;
63 return max_[generation];
73 std::vector<double> fitnessTemp;
75 sampleSize_.push_back((uint)pool.size());
76 fitnessTemp.resize(pool.size());
78 for(uint i = 0; i < pool.size(); i++)
79 fitnessTemp[i] = pool[i]->fitness->getValue();
81 max_.push_back(fitnessTemp[0]);
82 min_.push_back(fitnessTemp[0]);
83 statNo = (uint) max_.size() - 1;
86 for(uint i = 0; i < fitnessTemp.size(); i++) {
87 if(fitnessTemp[i] > max_[statNo]) {
88 max_[statNo] = fitnessTemp[i];
90 if(fitnessTemp[i] < min_[statNo]) {
91 min_[statNo] = fitnessTemp[i];
93 sum += fitnessTemp[i];
96 average_.push_back(sum / fitnessTemp.size());
100 if(min_[statNo] < lowest_)
101 lowest_ = min_[statNo];
102 if(max_[statNo] > highest_)
103 highest_ = max_[statNo];
110 if(fitnessTemp.size() > 1) {
111 double numerator = 0, denominator;
112 for(uint i = 0; i < fitnessTemp.size(); i++) {
113 numerator += ((fitnessTemp[i] - average_[statNo]) * (fitnessTemp[i] - average_[statNo]));
115 denominator = (double) (fitnessTemp.size() - 1);
116 stdDev_.push_back(sqrt(numerator / denominator));
119 stdDev_.push_back(fitnessTemp[0]);
121 time_.push_back(state_->getElapsedTime());
123 evaluations_.push_back(nEvaluations_);
134 std::vector<double> exStats = stats->getStats();
135 min_.push_back(exStats[0]);
136 max_.push_back(exStats[1]);
137 average_.push_back(exStats[2]);
138 stdDev_.push_back(exStats[3]);
139 sampleSize_.push_back((uint) exStats[4]);
140 time_.push_back((uint) exStats[5]);
141 evaluations_.push_back((uint) exStats[6]);
142 lowest_ = exStats[ECF::FIT_LOW];
143 highest_ = exStats[ECF::FIT_HIGH];
145 nEvaluations_ = evaluations_.back();
146 statNo = (uint) max_.size() - 1;
155 double outMin = stats[0];
156 double outMax = stats[1];
157 double outAvg = stats[2];
158 double outDev = stats[3];
159 uint outSize = (uint) stats[4];
160 uint outEval = (uint) stats[6];
162 if(outMin < min_.back())
163 min_.back() = outMin;
165 if(outMax > max_.back())
166 max_.back() = outMax;
168 evaluations_.back() += outEval;
169 nEvaluations_ = evaluations_.back();
171 uint mySize = sampleSize_.back();
173 sampleSize_.back() = mySize + outSize;
174 double myAvg = average_.back();
175 double newAvg = (myAvg * mySize + outAvg * outSize) / sampleSize_.back();
176 average_.back() = newAvg;
178 uint totSize = sampleSize_.back();
179 double mySum = myAvg * mySize;
180 double outSum = outAvg * outSize;
181 double totSum = mySum + outSum;
182 double mySumSqr = pow(stdDev_.back(), 2) * mySize + mySum / mySize * mySum;
183 double outSumSqr = outDev * outDev * outSize + outSum / outSize * outSum;
184 double newDev = sqrt((mySumSqr + outSumSqr - (totSum / totSize * totSum)) / totSize);
185 stdDev_.back() = newDev;
188 average_.back() = outAvg;
189 stdDev_.back() = outDev;
190 sampleSize_.back() = outSize;
193 if(stats[ECF::FIT_LOW] < lowest_)
194 lowest_ = stats[ECF::FIT_LOW];
195 if(stats[ECF::FIT_HIGH] > highest_)
196 highest_ = stats[ECF::FIT_HIGH];
210 std::vector<double> stats;
211 stats.push_back(min_[gen]);
212 stats.push_back(max_[gen]);
213 stats.push_back(average_[gen]);
214 stats.push_back(stdDev_[gen]);
215 stats.push_back((
double) sampleSize_[gen]);
216 stats.push_back((
double) time_[gen]);
217 stats.push_back((
double) evaluations_[gen]);
218 stats.push_back(lowest_);
219 stats.push_back(highest_);
231 generation = (int) statNo;
233 ECF_LOG(state_, 3,
"Evaluations: " + uint2str(evaluations_[generation]) +
234 "\nStats: fitness\n\tmax: " + dbl2str(max_[generation]) +
"\n\tmin: " +
235 dbl2str(min_[generation]) +
"\n\tavg: " + dbl2str(average_[generation]) +
"\n\tstdev: " + dbl2str(stdDev_[generation]) +
"\n");
240void StatCalc::output(uint step)
242 std::stringstream
log;
243 for(uint i = 0; i < min_.size(); i += step)
244 log << i <<
"\t" << min_[i] << std::endl;
245 ECF_LOG(state_, 2,
log.str());
bool initialize(StateP)
Perform initialization. Called before Operator::operate. By default, if the return value is false,...
double getFitnessMax(int generation=-1)
double getFitnessMin(int generation=-1)
void registerParameters(StateP)
Register parameters with the Registry. Called before Operator::initialize.
void log(int generation=-1)
bool update(std::vector< double >)
void copyStats(StatCalcP)
std::vector< double > getStats(int generation=-1)
bool operate(StateP)
perform the designated operation