From bd6f6f58375407ce1c9cae671d8e82fa5429f9e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana=20G=C3=B3mez?= Date: Sun, 25 Feb 2024 18:02:36 +0100 Subject: [PATCH] update to BayesNet 1.0.3 --- CMakeLists.txt | 6 +-- lib/BayesNet | 2 +- src/{PyClassifiers => }/CMakeLists.txt | 2 +- src/{PyClassifiers => }/ODTE.cc | 0 src/{PyClassifiers => }/ODTE.h | 0 src/{PyClassifiers => }/PyClassifier.cc | 0 src/{PyClassifiers => }/PyClassifier.h | 7 ++- src/{PyClassifiers => }/PyHelper.hpp | 0 src/{PyClassifiers => }/PyWrap.cc | 0 src/{PyClassifiers => }/PyWrap.h | 0 src/{PyClassifiers => }/RandomForest.cc | 0 src/{PyClassifiers => }/RandomForest.h | 0 src/{PyClassifiers => }/STree.cc | 0 src/{PyClassifiers => }/STree.h | 0 src/{PyClassifiers => }/SVC.cc | 0 src/{PyClassifiers => }/SVC.h | 0 src/{PyClassifiers => }/TypeId.h | 0 src/{PyClassifiers => }/XGBoost.cc | 0 src/{PyClassifiers => }/XGBoost.h | 0 tests/CMakeLists.txt | 4 +- tests/TestPythonClassifiers.cc | 64 ++++++++++--------------- 21 files changed, 37 insertions(+), 48 deletions(-) rename src/{PyClassifiers => }/CMakeLists.txt (91%) rename src/{PyClassifiers => }/ODTE.cc (100%) rename src/{PyClassifiers => }/ODTE.h (100%) rename src/{PyClassifiers => }/PyClassifier.cc (100%) rename src/{PyClassifiers => }/PyClassifier.h (87%) rename src/{PyClassifiers => }/PyHelper.hpp (100%) rename src/{PyClassifiers => }/PyWrap.cc (100%) rename src/{PyClassifiers => }/PyWrap.h (100%) rename src/{PyClassifiers => }/RandomForest.cc (100%) rename src/{PyClassifiers => }/RandomForest.h (100%) rename src/{PyClassifiers => }/STree.cc (100%) rename src/{PyClassifiers => }/STree.h (100%) rename src/{PyClassifiers => }/SVC.cc (100%) rename src/{PyClassifiers => }/SVC.h (100%) rename src/{PyClassifiers => }/TypeId.h (100%) rename src/{PyClassifiers => }/XGBoost.cc (100%) rename src/{PyClassifiers => }/XGBoost.h (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 17a74ba..0ebc464 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.20) project(PyClassifiers - VERSION 1.0.0 + VERSION 1.0.1 DESCRIPTION "Python Classifiers Wrapper." HOMEPAGE_URL "https://github.com/rmontanana/pyclassifiers" LANGUAGES CXX @@ -68,9 +68,9 @@ add_git_submodule("lib/BayesNet") # Subdirectories # -------------- -file(GLOB PyClassifiers_SOURCES CONFIGURE_DEPENDS ${PyClassifiers_SOURCE_DIR}/src/PyClassifiers/*.cc ${PyClassifiers_SOURCE_DIR}/src/PyClassifiers/*.hpp) +file(GLOB PyClassifiers_SOURCES CONFIGURE_DEPENDS ${PyClassifiers_SOURCE_DIR}/src/*.cc ${PyClassifiers_SOURCE_DIR}/src/*.hpp) add_subdirectory(config) -add_subdirectory(src/PyClassifiers) +add_subdirectory(src) # Testing # ------- diff --git a/lib/BayesNet b/lib/BayesNet index f3b8150..b8589bc 160000 --- a/lib/BayesNet +++ b/lib/BayesNet @@ -1 +1 @@ -Subproject commit f3b8150e2c4ab61a6260873119c51f33483a7a85 +Subproject commit b8589bcd0a3652debb04d7f6c8a1e4d4baf2c44f diff --git a/src/PyClassifiers/CMakeLists.txt b/src/CMakeLists.txt similarity index 91% rename from src/PyClassifiers/CMakeLists.txt rename to src/CMakeLists.txt index 22e51a3..c4e4ab0 100644 --- a/src/PyClassifiers/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,7 +1,7 @@ include_directories( ${PyClassifiers_SOURCE_DIR}/lib/Files ${PyClassifiers_SOURCE_DIR}/lib/BayesNet/lib/json/include - ${PyClassifiers_SOURCE_DIR}/lib/BayesNet/src/BayesNet + ${PyClassifiers_SOURCE_DIR}/lib/BayesNet/src ${CMAKE_BINARY_DIR}/configured_files/include ${Python3_INCLUDE_DIRS} ${TORCH_INCLUDE_DIRS} diff --git a/src/PyClassifiers/ODTE.cc b/src/ODTE.cc similarity index 100% rename from src/PyClassifiers/ODTE.cc rename to src/ODTE.cc diff --git a/src/PyClassifiers/ODTE.h b/src/ODTE.h similarity index 100% rename from src/PyClassifiers/ODTE.h rename to src/ODTE.h diff --git a/src/PyClassifiers/PyClassifier.cc b/src/PyClassifier.cc similarity index 100% rename from src/PyClassifiers/PyClassifier.cc rename to src/PyClassifier.cc diff --git a/src/PyClassifiers/PyClassifier.h b/src/PyClassifier.h similarity index 87% rename from src/PyClassifiers/PyClassifier.h rename to src/PyClassifier.h index 0686546..520794d 100644 --- a/src/PyClassifiers/PyClassifier.h +++ b/src/PyClassifier.h @@ -24,9 +24,12 @@ namespace pywrap { PyClassifier& fit(torch::Tensor& dataset, const std::vector& features, const std::string& className, std::map>& states) override { return *this; }; PyClassifier& fit(torch::Tensor& dataset, const std::vector& features, const std::string& className, std::map>& states, const torch::Tensor& weights) override { return *this; }; torch::Tensor predict(torch::Tensor& X) override; - std::vector predict(std::vector>& X) override { return std::vector(); }; - float score(std::vector>& X, std::vector& y) override { return 0.0; }; + std::vector predict(std::vector>& X) override { return std::vector(); }; // Not implemented + torch::Tensor predict_proba(torch::Tensor& X) override { return torch::zeros({ 0, 0 }); } // Not implemented + std::vector> predict_proba(std::vector>& X) override { return std::vector>(); }; // Not implemented + float score(std::vector>& X, std::vector& y) override { return 0.0; }; // Not implemented float score(torch::Tensor& X, torch::Tensor& y) override; + int getClassNumStates() const override { return 0; }; std::string version(); std::string callMethodString(const std::string& method); int callMethodSumOfItems(const std::string& method) const; diff --git a/src/PyClassifiers/PyHelper.hpp b/src/PyHelper.hpp similarity index 100% rename from src/PyClassifiers/PyHelper.hpp rename to src/PyHelper.hpp diff --git a/src/PyClassifiers/PyWrap.cc b/src/PyWrap.cc similarity index 100% rename from src/PyClassifiers/PyWrap.cc rename to src/PyWrap.cc diff --git a/src/PyClassifiers/PyWrap.h b/src/PyWrap.h similarity index 100% rename from src/PyClassifiers/PyWrap.h rename to src/PyWrap.h diff --git a/src/PyClassifiers/RandomForest.cc b/src/RandomForest.cc similarity index 100% rename from src/PyClassifiers/RandomForest.cc rename to src/RandomForest.cc diff --git a/src/PyClassifiers/RandomForest.h b/src/RandomForest.h similarity index 100% rename from src/PyClassifiers/RandomForest.h rename to src/RandomForest.h diff --git a/src/PyClassifiers/STree.cc b/src/STree.cc similarity index 100% rename from src/PyClassifiers/STree.cc rename to src/STree.cc diff --git a/src/PyClassifiers/STree.h b/src/STree.h similarity index 100% rename from src/PyClassifiers/STree.h rename to src/STree.h diff --git a/src/PyClassifiers/SVC.cc b/src/SVC.cc similarity index 100% rename from src/PyClassifiers/SVC.cc rename to src/SVC.cc diff --git a/src/PyClassifiers/SVC.h b/src/SVC.h similarity index 100% rename from src/PyClassifiers/SVC.h rename to src/SVC.h diff --git a/src/PyClassifiers/TypeId.h b/src/TypeId.h similarity index 100% rename from src/PyClassifiers/TypeId.h rename to src/TypeId.h diff --git a/src/PyClassifiers/XGBoost.cc b/src/XGBoost.cc similarity index 100% rename from src/PyClassifiers/XGBoost.cc rename to src/XGBoost.cc diff --git a/src/PyClassifiers/XGBoost.h b/src/XGBoost.h similarity index 100% rename from src/PyClassifiers/XGBoost.h rename to src/XGBoost.h diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 25b0393..7206cc9 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,11 +1,11 @@ if(ENABLE_TESTING) set(TEST_PYCLASSIFIERS "unit_tests_pyclassifiers") include_directories( - ${PyClassifiers_SOURCE_DIR}/src/PyClassifiers + ${PyClassifiers_SOURCE_DIR}/src/ ${PyClassifiers_SOURCE_DIR}/lib/BayesNet/lib/json/include ${PyClassifiers_SOURCE_DIR}/lib/BayesNet/lib/Files ${PyClassifiers_SOURCE_DIR}/lib/BayesNet/lib/mdlp - ${PyClassifiers_SOURCE_DIR}/lib/BayesNet/src/BayesNet + ${PyClassifiers_SOURCE_DIR}/lib/BayesNet/src ${Python3_INCLUDE_DIRS} ${TORCH_INCLUDE_DIRS} ${CMAKE_BINARY_DIR}/configured_files/include diff --git a/tests/TestPythonClassifiers.cc b/tests/TestPythonClassifiers.cc index 6c0b45a..0407920 100644 --- a/tests/TestPythonClassifiers.cc +++ b/tests/TestPythonClassifiers.cc @@ -26,36 +26,22 @@ TEST_CASE("Test Python Classifiers score", "[PyClassifiers]") {{"iris", "STree"}, 0.99333}, {{"iris", "ODTE"}, 0.98667}, {{"iris", "SVC"}, 0.97333}, {{"iris", "RandomForest"}, 1.0}, }; - std::string file_name = GENERATE("glass", "iris", "ecoli", "diabetes"); - auto raw = RawDatasets(file_name, false); - - SECTION("Test STree classifier (" + file_name + ")") + std::string name = GENERATE("ODTE", "STree", "SVC", "RandomForest"); + map models = { + {"ODTE", new pywrap::ODTE()}, + {"STree", new pywrap::STree()}, + {"SVC", new pywrap::SVC()}, + {"RandomForest", new pywrap::RandomForest()} + }; + SECTION("Test Python Classifier " + name + " score ") { - auto clf = pywrap::STree(); - clf.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest); - auto score = clf.score(raw.Xt, raw.yt); - REQUIRE(score == Catch::Approx(scores[{file_name, "STree"}]).epsilon(raw.epsilon)); - } - SECTION("Test ODTE classifier (" + file_name + ")") - { - auto clf = pywrap::ODTE(); - clf.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest); - auto score = clf.score(raw.Xt, raw.yt); - REQUIRE(score == Catch::Approx(scores[{file_name, "ODTE"}]).epsilon(raw.epsilon)); - } - SECTION("Test SVC classifier (" + file_name + ")") - { - auto clf = pywrap::SVC(); - clf.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest); - auto score = clf.score(raw.Xt, raw.yt); - REQUIRE(score == Catch::Approx(scores[{file_name, "SVC"}]).epsilon(raw.epsilon)); - } - SECTION("Test RandomForest classifier (" + file_name + ")") - { - auto clf = pywrap::RandomForest(); - clf.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest); - auto score = clf.score(raw.Xt, raw.yt); - REQUIRE(score == Catch::Approx(scores[{file_name, "RandomForest"}]).epsilon(raw.epsilon)); + for (auto file_name : { "glass", "iris", "ecoli", "diabetes" }) { + auto raw = RawDatasets(file_name, false); + auto clf = models[name]; + clf->fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest); + auto score = clf->score(raw.Xt, raw.yt); + REQUIRE(score == Catch::Approx(scores[{file_name, name}]).epsilon(raw.epsilon)); + } } } TEST_CASE("Classifiers features", "[PyClassifiers]") @@ -74,13 +60,13 @@ TEST_CASE("Get num features & num edges", "[PyClassifiers]") REQUIRE(clf.getNumberOfNodes() == 10); REQUIRE(clf.getNumberOfEdges() == 10); } -TEST_CASE("XGBoost", "[PyClassifiers]") -{ - auto raw = RawDatasets("iris", true); - auto clf = pywrap::XGBoost(); - clf.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest); - nlohmann::json hyperparameters = { "n_jobs=1" }; - clf.setHyperparameters(hyperparameters); - auto score = clf.score(raw.Xt, raw.yt); - REQUIRE(score == Catch::Approx(0.98).epsilon(raw.epsilon)); -} \ No newline at end of file +// TEST_CASE("XGBoost", "[PyClassifiers]") +// { +// auto raw = RawDatasets("iris", true); +// auto clf = pywrap::XGBoost(); +// clf.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest); +// nlohmann::json hyperparameters = { "n_jobs=1" }; +// clf.setHyperparameters(hyperparameters); +// auto score = clf.score(raw.Xt, raw.yt); +// REQUIRE(score == Catch::Approx(0.98).epsilon(raw.epsilon)); +// } \ No newline at end of file