RunData.cpp 5.5 KB

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