123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- #include "pch.h"
- #include "RunData.h"
- #include <QDebug>
- #include <QString>
- #include <regex>
- RunData::RunData()
- {
- }
- RunData::RunData(std::string filePath): fileStream(filePath)
- {
- if (!fileStream.is_open())
- {
- //Cant open file
- badFileFlag = true;
- return;
- }
- /* Start extracting */
- while (fileStream.peek() != EOF) {
- std::string buffer;
- getLine(buffer);
- SolutionPointData sol;
- std::regex regexIter("i:([\\+\\-]?\\d+)");
- std::regex regexObjectiveFunction("of:([\\+\\-]?\\d+\\.\\d+(?:E[\\+\\-]\\d+)?)");
- std::smatch match;
- if (!std::regex_search(buffer, match, regexIter)) {
- qDebug() << "Bad formatatted Line[" << actualLine << "].";
- qDebug() << "Failed to matched:";
- qDebug() << QString::fromStdString(buffer);
- return;
- }
- sol.iteration = std::stoi(match[1]);
- if (!std::regex_search(buffer, match, regexObjectiveFunction)) {
- qDebug() << "Bad formatatted Line[" << actualLine << "].";
- qDebug() << "Failed to matched:";
- qDebug() << QString::fromStdString(buffer);
- return;
- }
- sol.objectiveFunction = std::stod(match[1]);
- std::regex regexParticleNumber("pN:([\\+\\-]?\\d+)");
- if (!std::regex_search(buffer, match, regexParticleNumber)) {
- qDebug() << "Bad formatatted Line[" << actualLine << "].";
- qDebug() << "Failed to matched:";
- qDebug() << QString::fromStdString(buffer);
- return;
- }
- sol.particleNumber = std::stoi(match[1]);
- std::regex regexBitVec("b:([01]+)");
- if(!std::regex_search(buffer, match, regexBitVec)) {
- qDebug() << "Bad formatatted Line[" << actualLine << "].";
- qDebug() << "Failed to matched:";
- qDebug() << QString::fromStdString(buffer);
- return;
- }
- sol.bitVec.resize(match[1].length());
- int count = 0;
- std::string str = match[1];
- for (std::string::size_type i = 0; i < str.size(); ++i) {
- sol.bitVec[i] = (str[i] == '1');
- }
- solutionVec.push_back(sol);
- }
- fileStream.close();
- calculateBestAndAverageIter();
- calculateParticleSolution();
- calculateDotsForDistribution();
- generateRandomBitFieldData();
- }
- void RunData::getLine(std::string& bufferString)
- {
- std::getline(fileStream, bufferString);
- actualLine++;
- }
- void RunData::calculateBestAndAverageIter()
- {
- if (solutionVec.empty()) {
- return;
- }
- double minObjectiveFunctionInIter = solutionVec[0].objectiveFunction;
- double maxObjectiveFunctionInIter = solutionVec[0].objectiveFunction;
- double bestObjectiveFunctionFound = solutionVec[0].objectiveFunction;
- double actualIterObjectiveFunctionAggregate = solutionVec[0].objectiveFunction;
- int actualIter = solutionVec[0].iteration;
- int foundSolutionInIteration = 1;
- for(int i = 1; i < solutionVec.size(); i++) {
- SolutionPointData nextData = solutionVec[i];
- if (nextData.iteration != actualIter) {
- //save last
- bestSolutionPerIteration.push_back(GraphDataPoint((double)actualIter, bestObjectiveFunctionFound));
- averageSolutionPerItertion.push_back(GraphDataPoint((double)actualIter, actualIterObjectiveFunctionAggregate / (double)foundSolutionInIteration));
- minSolutionPerItertion.push_back(GraphDataPoint((double)actualIter, minObjectiveFunctionInIter));
- maxSolutionPerItertion.push_back(GraphDataPoint((double)actualIter, maxObjectiveFunctionInIter));
- //init new iteration
- actualIter = nextData.iteration;
- foundSolutionInIteration = 1;
- actualIterObjectiveFunctionAggregate = nextData.objectiveFunction;
- minObjectiveFunctionInIter = nextData.objectiveFunction;
- maxObjectiveFunctionInIter = nextData.objectiveFunction;
- }
- else {
- //increae aggregate
- foundSolutionInIteration++;
- actualIterObjectiveFunctionAggregate += nextData.objectiveFunction;
- }
- //update best min and max if better
- if (nextData.objectiveFunction < bestObjectiveFunctionFound) {
- bestObjectiveFunctionFound = nextData.objectiveFunction;
- }
- if (nextData.objectiveFunction < minObjectiveFunctionInIter) {
- minObjectiveFunctionInIter = nextData.objectiveFunction;
- }
- if (nextData.objectiveFunction > maxObjectiveFunctionInIter) {
- maxObjectiveFunctionInIter = nextData.objectiveFunction;
- }
- }
- //save last iteration
- bestSolutionPerIteration.push_back(GraphDataPoint((double)actualIter, bestObjectiveFunctionFound));
- averageSolutionPerItertion.push_back(GraphDataPoint((double)actualIter, actualIterObjectiveFunctionAggregate / (double)foundSolutionInIteration));
- minSolutionPerItertion.push_back(GraphDataPoint((double)actualIter, minObjectiveFunctionInIter));
- maxSolutionPerItertion.push_back(GraphDataPoint((double)actualIter, maxObjectiveFunctionInIter));
- }
- void RunData::calculateParticleSolution()
- {
- for (SolutionPointData sol : solutionVec) {
- GraphDataPoint point(sol.iteration, sol.objectiveFunction, &sol);
- auto iter = particleMap.find(sol.particleNumber);
- if (iter == particleMap.end()) {
- //create new Entry
- std::vector<GraphDataPoint> vec;
- vec.push_back(point);
- particleMap.insert({ sol.particleNumber, vec});
- }
- else {
- //append to vector in Entry
- iter->second.push_back(point);
- }
- }
- }
- void RunData::calculateDotsForDistribution()
- {
- for (SolutionPointData sol : solutionVec) {
- dotsForDistribution.push_back(GraphDataPoint((double)sol.iteration, sol.objectiveFunction, &sol));
- }
- }
- void RunData::generateRandomBitFieldData()
- {
- for (SolutionPointData sol : solutionVec) {
- testForBitField.push_back(GraphDataPoint(0.5, std::count(sol.bitVec.begin(), sol.bitVec.end(), true)));
- }
- }
|