#include "patternIO.hpp" #include #include #include #include PatternIO::PatternIO() {} void PatternIO::save(const std::string &filepath, const PatternSet &patternSet) { std::ofstream fileStream; if (std::filesystem::exists(filepath)) { fileStream.open(filepath, std::ios_base::app); } else { fileStream.open(filepath); fileStream << "#Nodes" << std::endl; for (vcg::Point2d node : patternSet.nodes) { fileStream << "n " << node.X() << " " << node.Y() << std::endl; } fileStream << "#Patterns" << std::endl; } for (const Pattern &pattern : patternSet.patterns) { fileStream << "p " << pattern.labels.size() << " " << pattern.edges.size() << " "; for (size_t labelIndex = 0; labelIndex < pattern.labels.size() - 1; labelIndex++) { fileStream << pattern.labels[labelIndex] << " "; } fileStream << pattern.labels[pattern.labels.size() - 1] << " "; for (const vcg::Point2i &edge : pattern.edges) { fileStream << " " << edge[0] << " " << edge[1] << " "; } fileStream << std::endl; } } void PatternIO::save(const std::string &filepath, const Pattern &pattern) { std::ofstream fileStream; if (std::filesystem::exists(filepath)) { fileStream.open(filepath, std::ios_base::app); } else { fileStream.open(filepath); fileStream << "#Nodes" << std::endl; fileStream << "#Patterns" << std::endl; } fileStream << "p " << pattern.labels.size() << " " << pattern.edges.size() << " "; for (size_t labelIndex = 0; labelIndex < pattern.labels.size() - 1; labelIndex++) { fileStream << pattern.labels[labelIndex] << " "; } fileStream << pattern.labels[pattern.labels.size() - 1] << " "; for (const vcg::Point2i &edge : pattern.edges) { fileStream << " " << edge[0] << " " << edge[1] << " "; } fileStream << std::endl; } void PatternIO::load(const std::string &filepath, PatternSet &patternSet, const std::vector &targetLabels) { std::ifstream fileStream(filepath); std::string line; std::vector sortedTargetPatternLabels(targetLabels); std::sort(sortedTargetPatternLabels.begin(), sortedTargetPatternLabels.end()); while (std::getline(fileStream, line)) { std::cout << line << std::endl; std::istringstream iss(line); char lineID; iss >> lineID; if (lineID == 'n') { double x, y; iss >> x >> y; std::cout << x << " " << y << std::endl; } else if (lineID == 'p') { Pattern pattern; size_t numberOfLabels, numberOfEdges; iss >> numberOfLabels >> numberOfEdges; std::cout << "NumberOfLabels:" << numberOfLabels << std::endl; std::cout << "NumberOfEdges:" << numberOfEdges << std::endl; std::vector patternLabels; for (size_t labelIndex = 0; labelIndex < numberOfLabels; labelIndex++) { size_t patternLabel; iss >> patternLabel; PatternLabel pl = static_cast(patternLabel); std::cout << "Pattern label read:" << patternLabel << std::endl; patternLabels.push_back(pl); } if (!targetLabels.empty()) { std::sort(patternLabels.begin(), patternLabels.end()); std::vector labelIntersection; std::set_intersection(patternLabels.begin(), patternLabels.end(), sortedTargetPatternLabels.begin(), sortedTargetPatternLabels.end(), labelIntersection.begin()); if (!labelIntersection.empty()) { pattern.labels = patternLabels; } else { continue; } } else { pattern.labels = patternLabels; } for (size_t edgeIndex = 0; edgeIndex < numberOfEdges; edgeIndex++) { size_t ni0, ni1; iss >> ni0 >> ni1; vcg::Point2i edge(ni0, ni1); pattern.edges.push_back(edge); std::cout << "Node indices read:" << ni0 << "," << ni1 << std::endl; } } } }