RunData.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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. 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. std::regex regexBitVec("b:([01]+)");
  48. if(!std::regex_search(buffer, match, regexBitVec)) {
  49. qDebug() << "Bad formatatted Line[" << actualLine << "].";
  50. qDebug() << "Failed to matched:";
  51. qDebug() << QString::fromStdString(buffer);
  52. return;
  53. }
  54. sol.bitVec.resize(match[1].length());
  55. int count = 0;
  56. std::string str = match[1];
  57. for (std::string::size_type i = 0; i < str.size(); ++i) {
  58. sol.bitVec[i] = (str[i] == '1');
  59. }
  60. solutionVec.push_back(sol);
  61. }
  62. fileStream.close();
  63. calculateBestAndAverageIter();
  64. calculateParticleSolution();
  65. calculateDotsForDistribution();
  66. generateRandomBitFieldData();
  67. }
  68. void RunData::getLine(std::string& bufferString)
  69. {
  70. std::getline(fileStream, bufferString);
  71. actualLine++;
  72. }
  73. void RunData::calculateBestAndAverageIter()
  74. {
  75. if (solutionVec.empty()) {
  76. return;
  77. }
  78. double minObjectiveFunctionInIter = solutionVec[0].objectiveFunction;
  79. double maxObjectiveFunctionInIter = solutionVec[0].objectiveFunction;
  80. double bestObjectiveFunctionFound = solutionVec[0].objectiveFunction;
  81. double actualIterObjectiveFunctionAggregate = solutionVec[0].objectiveFunction;
  82. int actualIter = solutionVec[0].iteration;
  83. int foundSolutionInIteration = 1;
  84. for(int i = 1; i < solutionVec.size(); i++) {
  85. SolutionPointData nextData = solutionVec[i];
  86. if (nextData.iteration != actualIter) {
  87. //save last
  88. bestSolutionPerIteration.push_back(GraphDataPoint((double)actualIter, bestObjectiveFunctionFound));
  89. averageSolutionPerItertion.push_back(GraphDataPoint((double)actualIter, actualIterObjectiveFunctionAggregate / (double)foundSolutionInIteration));
  90. minSolutionPerItertion.push_back(GraphDataPoint((double)actualIter, minObjectiveFunctionInIter));
  91. maxSolutionPerItertion.push_back(GraphDataPoint((double)actualIter, maxObjectiveFunctionInIter));
  92. //init new iteration
  93. actualIter = nextData.iteration;
  94. foundSolutionInIteration = 1;
  95. actualIterObjectiveFunctionAggregate = nextData.objectiveFunction;
  96. minObjectiveFunctionInIter = nextData.objectiveFunction;
  97. maxObjectiveFunctionInIter = nextData.objectiveFunction;
  98. }
  99. else {
  100. //increae aggregate
  101. foundSolutionInIteration++;
  102. actualIterObjectiveFunctionAggregate += nextData.objectiveFunction;
  103. }
  104. //update best min and max if better
  105. if (nextData.objectiveFunction < bestObjectiveFunctionFound) {
  106. bestObjectiveFunctionFound = nextData.objectiveFunction;
  107. }
  108. if (nextData.objectiveFunction < minObjectiveFunctionInIter) {
  109. minObjectiveFunctionInIter = nextData.objectiveFunction;
  110. }
  111. if (nextData.objectiveFunction > maxObjectiveFunctionInIter) {
  112. maxObjectiveFunctionInIter = nextData.objectiveFunction;
  113. }
  114. }
  115. //save last iteration
  116. bestSolutionPerIteration.push_back(GraphDataPoint((double)actualIter, bestObjectiveFunctionFound));
  117. averageSolutionPerItertion.push_back(GraphDataPoint((double)actualIter, actualIterObjectiveFunctionAggregate / (double)foundSolutionInIteration));
  118. minSolutionPerItertion.push_back(GraphDataPoint((double)actualIter, minObjectiveFunctionInIter));
  119. maxSolutionPerItertion.push_back(GraphDataPoint((double)actualIter, maxObjectiveFunctionInIter));
  120. }
  121. void RunData::calculateParticleSolution()
  122. {
  123. for (SolutionPointData sol : solutionVec) {
  124. GraphDataPoint point(sol.iteration, sol.objectiveFunction, &sol);
  125. auto iter = particleMap.find(sol.particleNumber);
  126. if (iter == particleMap.end()) {
  127. //create new Entry
  128. std::vector<GraphDataPoint> vec;
  129. vec.push_back(point);
  130. particleMap.insert({ sol.particleNumber, vec});
  131. }
  132. else {
  133. //append to vector in Entry
  134. iter->second.push_back(point);
  135. }
  136. }
  137. }
  138. void RunData::calculateDotsForDistribution()
  139. {
  140. for (SolutionPointData sol : solutionVec) {
  141. dotsForDistribution.push_back(GraphDataPoint((double)sol.iteration, sol.objectiveFunction, &sol));
  142. }
  143. }
  144. void RunData::generateRandomBitFieldData()
  145. {
  146. for (SolutionPointData sol : solutionVec) {
  147. testForBitField.push_back(GraphDataPoint(0.5, std::count(sol.bitVec.begin(), sol.bitVec.end(), true)));
  148. }
  149. }