From a2622a4fb6b31dfd99d86f83ad5f56960ec12143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana?= Date: Fri, 21 Jul 2023 16:07:50 +0200 Subject: [PATCH] Begin Folding --- src/Platform/CMakeLists.txt | 3 +- src/Platform/Experiment.cc | 164 +++++++++++++++++------------------- src/Platform/Folding.cc | 31 +++++++ src/Platform/Folding.h | 18 ++++ src/Platform/m | Bin 0 -> 96096 bytes src/Platform/main.cpp | 51 +++++++++++ 6 files changed, 178 insertions(+), 89 deletions(-) create mode 100644 src/Platform/Folding.cc create mode 100644 src/Platform/Folding.h create mode 100755 src/Platform/m create mode 100644 src/Platform/main.cpp diff --git a/src/Platform/CMakeLists.txt b/src/Platform/CMakeLists.txt index b15bbe7..426efea 100644 --- a/src/Platform/CMakeLists.txt +++ b/src/Platform/CMakeLists.txt @@ -2,5 +2,6 @@ include_directories(${BayesNet_SOURCE_DIR}/src/BayesNet) include_directories(${BayesNet_SOURCE_DIR}/src/Platform) include_directories(${BayesNet_SOURCE_DIR}/lib/Files) include_directories(${BayesNet_SOURCE_DIR}/lib/mdlp) -add_executable(main Experiment.cc platformUtils.cc) +include_directories(${BayesNet_SOURCE_DIR}/lib/argparse/include) +add_executable(main Experiment.cc Folding.cc platformUtils.cc) target_link_libraries(main BayesNet ArffFiles mdlp "${TORCH_LIBRARIES}") \ No newline at end of file diff --git a/src/Platform/Experiment.cc b/src/Platform/Experiment.cc index 7564645..d2191f7 100644 --- a/src/Platform/Experiment.cc +++ b/src/Platform/Experiment.cc @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include "ArffFiles.h" #include "Network.h" #include "BayesMetrics.h" @@ -11,71 +11,11 @@ #include "SPODE.h" #include "AODE.h" #include "TAN.h" -#include "platformUtils.h" using namespace std; -/* print a description of all supported options */ -void usage(const char* path) -{ - /* take only the last portion of the path */ - const char* basename = strrchr(path, '/'); - basename = basename ? basename + 1 : path; - - cout << "usage: " << basename << "[OPTION]" << endl; - cout << " -h, --help\t\t Print this help and exit." << endl; - cout - << " -f, --file[=FILENAME]\t {diabetes, glass, iris, kdd_JapaneseVowels, letter, liver-disorders, mfeat-factors}." - << endl; - cout << " -p, --path[=FILENAME]\t folder where the data files are located, default " << PATH << endl; - cout << " -m, --model={AODE, KDB, SPODE, TAN}\t " << endl; -} - -tuple parse_arguments(int argc, char** argv) -{ - string file_name; - string model_name; - string path = PATH; - const vector long_options = { - {"help", no_argument, nullptr, 'h'}, - {"file", required_argument, nullptr, 'f'}, - {"path", required_argument, nullptr, 'p'}, - {"model", required_argument, nullptr, 'm'}, - {nullptr, no_argument, nullptr, 0} - }; - while (true) { - const auto c = getopt_long(argc, argv, "hf:p:m:", long_options.data(), nullptr); - if (c == -1) - break; - switch (c) { - case 'h': - usage(argv[0]); - exit(0); - case 'f': - file_name = string(optarg); - break; - case 'm': - model_name = string(optarg); - break; - case 'p': - path = optarg; - if (path.back() != '/') - path += '/'; - break; - case '?': - usage(argv[0]); - exit(1); - default: - abort(); - } - } - if (file_name.empty()) { - usage(argv[0]); - exit(1); - } - return make_tuple(file_name, path, model_name); -} +const string PATH = "../../data/"; inline constexpr auto hash_conv(const std::string_view sv) { @@ -91,9 +31,32 @@ inline constexpr auto operator"" _sh(const char* str, size_t len) return hash_conv(std::string_view{ str, len }); } +pair, map> discretize(vector& X, mdlp::labels_t& y, vector features) +{ + vectorXd; + map maxes; + auto fimdlp = mdlp::CPPFImdlp(); + for (int i = 0; i < X.size(); i++) { + fimdlp.fit(X[i], y); + mdlp::labels_t& xd = fimdlp.transform(X[i]); + maxes[features[i]] = *max_element(xd.begin(), xd.end()) + 1; + Xd.push_back(xd); + } + return { Xd, maxes }; +} -tuple get_options(int argc, char** argv) +bool file_exists(const std::string& name) +{ + if (FILE* file = fopen(name.c_str(), "r")) { + fclose(file); + return true; + } else { + return false; + } +} + +int main(int argc, char** argv) { map datasets = { {"diabetes", true}, @@ -105,35 +68,60 @@ tuple get_options(int argc, char** argv) {"liver-disorders", true}, {"mfeat-factors", true}, }; - vector models = { "AODE", "KDB", "SPODE", "TAN" }; - string file_name; - string path; - string model_name; - tie(file_name, path, model_name) = parse_arguments(argc, argv); - if (datasets.find(file_name) == datasets.end()) { - cout << "Invalid file name: " << file_name << endl; - usage(argv[0]); + auto valid_datasets = vector(); + for (auto dataset : datasets) { + valid_datasets.push_back(dataset.first); + } + argparse::ArgumentParser program("BayesNetSample"); + program.add_argument("-f", "--file") + .help("Dataset file name") + .action([valid_datasets](const std::string& value) { + if (find(valid_datasets.begin(), valid_datasets.end(), value) != valid_datasets.end()) { + return value; + } + throw runtime_error("file must be one of {diabetes, ecoli, glass, iris, kdd_JapaneseVowels, letter, liver-disorders, mfeat-factors}"); + } + ); + program.add_argument("-p", "--path") + .help(" folder where the data files are located, default") + .default_value(string{ PATH } + ); + program.add_argument("-m", "--model") + .help("Model to use {AODE, KDB, SPODE, TAN}") + .action([](const std::string& value) { + static const vector choices = { "AODE", "KDB", "SPODE", "TAN" }; + if (find(choices.begin(), choices.end(), value) != choices.end()) { + return value; + } + throw runtime_error("Model must be one of {AODE, KDB, SPODE, TAN}"); + } + ); + program.add_argument("--discretize").default_value(false).implicit_value(true); + bool class_last, discretize_dataset; + string model_name, file_name, path, complete_file_name; + try { + program.parse_args(argc, argv); + file_name = program.get("file"); + path = program.get("path"); + model_name = program.get("model"); + discretize_dataset = program.get("discretize"); + complete_file_name = path + file_name + ".arff"; + class_last = datasets[file_name]; + if (!file_exists(complete_file_name)) { + throw runtime_error("Data File " + path + file_name + ".arff" + " does not exist"); + } + } + catch (const exception& err) { + cerr << err.what() << endl; + cerr << program; exit(1); } - if (!file_exists(path + file_name + ".arff")) { - cout << "Data File " << path + file_name + ".arff" << " does not exist" << endl; - usage(argv[0]); - exit(1); - } - if (find(models.begin(), models.end(), model_name) == models.end()) { - cout << "Invalid model name: " << model_name << endl; - usage(argv[0]); - exit(1); - } - return { file_name, path, model_name }; -} -int main(int argc, char** argv) -{ - string file_name, path, model_name; - tie(file_name, path, model_name) = get_options(argc, argv); + /* + * Begin Processing + */ auto handler = ArffFiles(); - handler.load(path + file_name + ".arff"); + handler.load(complete_file_name, class_last); // Get Dataset X, y vector& X = handler.getX(); mdlp::labels_t& y = handler.getY(); diff --git a/src/Platform/Folding.cc b/src/Platform/Folding.cc new file mode 100644 index 0000000..11fca29 --- /dev/null +++ b/src/Platform/Folding.cc @@ -0,0 +1,31 @@ +#include "Folding.h" +#include +#include + +using namespace std; + +KFold::KFold(int k, int n, int seed) +{ + this->k = k; + this->n = n; + indices = vector(n); + iota(begin(indices), end(indices), 0); // fill with 0, 1, ..., n - 1 + shuffle(indices.begin(), indices.end(), default_random_engine(seed)); +} +pair, vector> KFold::getFold(int nFold) +{ + if (nFold >= k || nFold < 0) { + throw invalid_argument("nFold (" + to_string(nFold) + ") must be less than k (" + to_string(k) + ")"); + } + int nTest = n / k; + auto train = vector(); + auto test = vector(); + for (int i = 0; i < n; i++) { + if (i >= nTest * nFold && i < nTest * (nFold + 1)) { + test.push_back(indices[i]); + } else { + train.push_back(indices[i]); + } + } + return { train, test }; +} \ No newline at end of file diff --git a/src/Platform/Folding.h b/src/Platform/Folding.h new file mode 100644 index 0000000..f851b2f --- /dev/null +++ b/src/Platform/Folding.h @@ -0,0 +1,18 @@ +#ifndef FOLDING_H +#define FOLDING_H +#include +using namespace std; +class KFold { +private: + int k; + int n; + vector indices; + +public: + KFold(int k, int n, int seed); + pair, vector> getFold(int); +}; +class KStratifiedFold { + +}; +#endif \ No newline at end of file diff --git a/src/Platform/m b/src/Platform/m new file mode 100755 index 0000000000000000000000000000000000000000..8b81161acc43099e48df1f2b266f378d6828e8f2 GIT binary patch literal 96096 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 literal 0 HcmV?d00001 diff --git a/src/Platform/main.cpp b/src/Platform/main.cpp new file mode 100644 index 0000000..5adcf48 --- /dev/null +++ b/src/Platform/main.cpp @@ -0,0 +1,51 @@ +#include "Folding.h" +#include +using namespace std; +class A { +private: + int a; +public: + A(int a) : a(a) {} + int getA() { return a; } +}; +class B : public A { +private: + int b; +public: + B(int a, int b) : A(a), b(b) {} + int getB() { return b; } +}; +class C : public A { +private: + int c; +public: + C(int a, int c) : A(a), c(c) {} + int getC() { return c; } +}; +int main() +{ + auto fold = KFold(5, 100, 1); + for (int i = 0; i < 5; ++i) { + cout << "Fold: " << i << endl; + auto [train, test] = fold.getFold(i); + cout << "Train: "; + cout << "(" << train.size() << "): "; + for (auto j = 0; j < static_cast(train.size()); j++) + cout << train[j] << ", "; + cout << endl; + cout << "Test: "; + cout << "(" << train.size() << "): "; + for (auto j = 0; j < static_cast(test.size()); j++) + cout << test[j] << ", "; + cout << endl; + cout << "Vector poly" << endl; + auto some = vector(); + auto cx = C(5, 4); + auto bx = B(7, 6); + some.push_back(cx); + some.push_back(bx); + for (auto& obj : some) { + cout << "Obj :" << obj.getA() << endl; + } + } +}