RunData.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #include "RunData.h"
  2. #include <QDebug>
  3. #include <QString>
  4. #include <regex>
  5. RunData::RunData()
  6. {
  7. }
  8. RunData::RunData(std::string filePath): fileStream(filePath)
  9. {
  10. if (!fileStream.is_open())
  11. {
  12. //Cant open file
  13. badFileFlag = true;
  14. return;
  15. }
  16. /* Start extracting */
  17. while (fileStream.peek() != EOF) {
  18. std::string buffer;
  19. getLine(buffer);
  20. //qDebug() << "Line[" << actualLine << "]:" << QString::fromStdString(buffer);
  21. SolutionPointData sol;
  22. std::regex regexIter("i:([\\+\\-]?\\d+)");
  23. std::regex regexObjectiveFunction("of:([\\+\\-]?\\d+\\.\\d+(?:E[\\+\\-]\\d+)?)");
  24. std::smatch match;
  25. if (!std::regex_search(buffer, match, regexIter)) {
  26. qDebug() << "Bad formatatted Line[" << actualLine << "].";
  27. qDebug() << "Failed to matched:";
  28. qDebug() << QString::fromStdString(buffer);
  29. return;
  30. }
  31. sol.iteration = std::stoi(match[1]);
  32. if (!std::regex_search(buffer, match, regexObjectiveFunction)) {
  33. qDebug() << "Bad formatatted Line[" << actualLine << "].";
  34. qDebug() << "Failed to matched:";
  35. qDebug() << QString::fromStdString(buffer);
  36. return;
  37. }
  38. sol.objectiveFunction = std::stod(match[1]);
  39. std::regex regexParticleNumber("pN:([\\+\\-]?\\d+)");
  40. if (!std::regex_search(buffer, match, regexParticleNumber)) {
  41. qDebug() << "Bad formatatted Line[" << actualLine << "].";
  42. qDebug() << "Failed to matched:";
  43. qDebug() << QString::fromStdString(buffer);
  44. return;
  45. }
  46. sol.particleNumber = std::stoi(match[1]);
  47. solutionVec.push_back(sol);
  48. }
  49. fileStream.close();
  50. calculateBestAndAverageIter();
  51. calculateParticleSolution();
  52. calculateDotsForDistribution();
  53. }
  54. void RunData::getLine(std::string& bufferString)
  55. {
  56. //std::getline(fileStream, bufferString);
  57. std::getline(fileStream, bufferString);
  58. actualLine++;
  59. }
  60. void RunData::calculateBestAndAverageIter()
  61. {
  62. if (solutionVec.empty()) {
  63. return;
  64. }
  65. double minObjectiveFunctionInIter = solutionVec[0].objectiveFunction;
  66. double maxObjectiveFunctionInIter = solutionVec[0].objectiveFunction;
  67. double bestObjectiveFunctionFound = solutionVec[0].objectiveFunction;
  68. int actualIter = solutionVec[0].iteration;
  69. double actualIterObjectiveFunctionAggregate = solutionVec[0].objectiveFunction;
  70. int foundSolutionInIteration = 1;
  71. for(int i = 1; i < solutionVec.size(); i++) {
  72. SolutionPointData nextData = solutionVec[i];
  73. if (nextData.iteration != actualIter) {
  74. //save last
  75. bestSolutionPerIteration.push_back(QPointF((double)actualIter, bestObjectiveFunctionFound));
  76. averageSolutionPerItertion.push_back(QPointF((double)actualIter, actualIterObjectiveFunctionAggregate / (double)foundSolutionInIteration));
  77. minSolutionPerItertion.push_back(QPointF((double)actualIter, minObjectiveFunctionInIter));
  78. maxSolutionPerItertion.push_back(QPointF((double)actualIter, maxObjectiveFunctionInIter));
  79. //init new iteration
  80. actualIter = nextData.iteration;
  81. foundSolutionInIteration = 1;
  82. actualIterObjectiveFunctionAggregate = nextData.objectiveFunction;
  83. minObjectiveFunctionInIter = nextData.objectiveFunction;
  84. maxObjectiveFunctionInIter = nextData.objectiveFunction;
  85. }
  86. else {
  87. //increae aggregate
  88. foundSolutionInIteration++;
  89. actualIterObjectiveFunctionAggregate += nextData.objectiveFunction;
  90. }
  91. //update best min and max if better
  92. if (nextData.objectiveFunction < bestObjectiveFunctionFound) {
  93. bestObjectiveFunctionFound = nextData.objectiveFunction;
  94. }
  95. if (nextData.objectiveFunction < minObjectiveFunctionInIter) {
  96. minObjectiveFunctionInIter = nextData.objectiveFunction;
  97. }
  98. if (nextData.objectiveFunction > maxObjectiveFunctionInIter) {
  99. maxObjectiveFunctionInIter = nextData.objectiveFunction;
  100. }
  101. }
  102. //save last iteration
  103. bestSolutionPerIteration.push_back(QPointF((double)actualIter, bestObjectiveFunctionFound));
  104. averageSolutionPerItertion.push_back(QPointF((double)actualIter, actualIterObjectiveFunctionAggregate / (double)foundSolutionInIteration));
  105. minSolutionPerItertion.push_back(QPointF((double)actualIter, minObjectiveFunctionInIter));
  106. maxSolutionPerItertion.push_back(QPointF((double)actualIter, maxObjectiveFunctionInIter));
  107. }
  108. void RunData::calculateParticleSolution()
  109. {
  110. for (SolutionPointData sol : solutionVec) {
  111. QPointF point(sol.iteration, sol.objectiveFunction);
  112. auto iter = particleMap.find(sol.particleNumber);
  113. if (iter == particleMap.end()) {
  114. //create new Entry
  115. std::vector<QPointF> vec;
  116. vec.push_back(point);
  117. particleMap.insert({ sol.particleNumber, vec});
  118. }
  119. else {
  120. //append to vector in Entry
  121. iter->second.push_back(point);
  122. }
  123. }
  124. /*for (auto iter = std::begin(particleMap); iter != std::end(particleMap); iter++) {
  125. qDebug() << "List with pN[" << iter->first << "]:";
  126. for (QPointF point : iter->second) {
  127. qDebug() << point;
  128. }
  129. }*/
  130. }
  131. void RunData::calculateDotsForDistribution()
  132. {
  133. for (SolutionPointData sol : solutionVec) {
  134. QPointF point((double)sol.iteration, sol.objectiveFunction);
  135. dotsForDistribution.push_back(point);
  136. }
  137. ////check code:
  138. //int count = 0;
  139. //int actualIter = (int)dotsForDistribution[0].x();
  140. //for (int i = 0; i < dotsForDistribution.size(); i++) {
  141. // if (actualIter != (int)dotsForDistribution[i].x()) {
  142. // actualIter = (int)dotsForDistribution[i].x();
  143. // qDebug() << "[" << actualIter << "]Min:" << minSolutionPerItertion[count].y() << " Max: " << maxSolutionPerItertion[count].y();
  144. // count++;
  145. // }
  146. // qDebug() << dotsForDistribution[i];
  147. //}
  148. }