From 5556fbab033abbe6a6405d5c41800dc6badf3ded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana=20G=C3=B3mez?= Date: Tue, 18 Feb 2025 22:57:02 +0100 Subject: [PATCH] Complete integration with memory failure --- src/CMakeLists.txt | 3 +++ src/experimental_clfs/XA1DE.cpp | 35 ++++++++++++++++++++++++++++----- src/experimental_clfs/XA1DE.h | 22 +++++++++++---------- src/main/modelRegister.h | 2 ++ 4 files changed, 47 insertions(+), 15 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 717bf83..4b49299 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -25,6 +25,7 @@ add_executable( main/Models.cpp main/Scores.cpp reports/ReportExcel.cpp reports/ReportBase.cpp reports/ExcelFile.cpp results/Result.cpp + experimental_clfs/XA1DE.cpp ) target_link_libraries(b_best Boost::boost "${PyClassifiers}" "${BayesNet}" fimdlp ${Python3_LIBRARIES} "${TORCH_LIBRARIES}" ${LIBTORCH_PYTHON} Boost::python Boost::numpy "${XLSXWRITER_LIB}") @@ -36,6 +37,7 @@ add_executable(b_grid commands/b_grid.cpp ${grid_sources} main/HyperParameters.cpp main/Models.cpp main/Experiment.cpp main/Scores.cpp main/ArgumentsExperiment.cpp reports/ReportConsole.cpp reports/ReportBase.cpp results/Result.cpp + experimental_clfs/XA1DE.cpp ) target_link_libraries(b_grid ${MPI_CXX_LIBRARIES} "${PyClassifiers}" "${BayesNet}" fimdlp ${Python3_LIBRARIES} "${TORCH_LIBRARIES}" ${LIBTORCH_PYTHON} Boost::python Boost::numpy) @@ -45,6 +47,7 @@ add_executable(b_list commands/b_list.cpp main/Models.cpp main/Scores.cpp reports/ReportExcel.cpp reports/ExcelFile.cpp reports/ReportBase.cpp reports/DatasetsExcel.cpp reports/DatasetsConsole.cpp reports/ReportsPaged.cpp results/Result.cpp results/ResultsDatasetExcel.cpp results/ResultsDataset.cpp results/ResultsDatasetConsole.cpp + experimental_clfs/XA1DE.cpp ) target_link_libraries(b_list "${PyClassifiers}" "${BayesNet}" fimdlp ${Python3_LIBRARIES} "${TORCH_LIBRARIES}" ${LIBTORCH_PYTHON} Boost::python Boost::numpy "${XLSXWRITER_LIB}") diff --git a/src/experimental_clfs/XA1DE.cpp b/src/experimental_clfs/XA1DE.cpp index cb113d6..8f1f9b0 100644 --- a/src/experimental_clfs/XA1DE.cpp +++ b/src/experimental_clfs/XA1DE.cpp @@ -66,6 +66,9 @@ namespace platform { } std::vector> XA1DE::predict_proba(std::vector>& test_data) { + if (use_threads) { + return predict_proba_threads(test_data); + } int test_size = test_data[0].size(); std::vector> probabilities; @@ -151,7 +154,8 @@ namespace platform { } return static_cast(correct) / predictions.size(); } - std::vector> to_matrix(const torch::Tensor& X) + + std::vector> XA1DE::to_matrix(const torch::Tensor& X) { // Ensure tensor is contiguous in memory auto X_contig = X.contiguous(); @@ -174,24 +178,45 @@ namespace platform { } return data; } - std::vector to_vector(const torch::Tensor& y) + template + std::vector XA1DE::to_vector(const torch::Tensor& y) { // Ensure the tensor is contiguous in memory auto y_contig = y.contiguous(); // Access data pointer - auto data_ptr = y_contig.data_ptr(); + auto data_ptr = y_contig.data_ptr(); // Prepare output container - std::vector data(y.size(0)); + std::vector data(y.size(0)); // Copy data efficiently std::copy(data_ptr, data_ptr + y.size(0), data.begin()); return data; } + + // + // Fit + // + // fit(std::vector>& X, std::vector& y, const std::vector& features, const std::string& className, std::map>& states, const bayesnet::Smoothing_t smoothing) XA1DE& XA1DE::fit(torch::Tensor& X, torch::Tensor& y, const std::vector& features, const std::string& className, std::map>& states, const bayesnet::Smoothing_t smoothing) { - return fit(to_matrix(X), to_vector(y), features, className, states, smoothing); + auto X_ = to_matrix(X); + int a = 1; + std::vector y_ = to_vector(y); + return fit(X_, y_, features, className, states, smoothing); + } + XA1DE& XA1DE::fit(torch::Tensor& dataset, const std::vector& features, const std::string& className, std::map>& states, const bayesnet::Smoothing_t smoothing) + { + torch::Tensor y = dataset[dataset.size(0) - 1]; + torch::Tensor X = dataset.slice(0, 0, dataset.size(0) - 1); + return fit(X, y, features, className, states, smoothing); + } + XA1DE& XA1DE::fit(torch::Tensor& dataset, const std::vector& features, const std::string& className, std::map>& states, const torch::Tensor& weights, const bayesnet::Smoothing_t smoothing) + { + double b = 1; + weights_ = to_vector(weights); + return fit(dataset, features, className, states, smoothing); } } \ No newline at end of file diff --git a/src/experimental_clfs/XA1DE.h b/src/experimental_clfs/XA1DE.h index 640a50d..1cfc371 100644 --- a/src/experimental_clfs/XA1DE.h +++ b/src/experimental_clfs/XA1DE.h @@ -17,6 +17,7 @@ #include "Xaode.hpp" namespace platform { + class XA1DE : public bayesnet::BaseClassifier { public: XA1DE(); @@ -28,13 +29,11 @@ namespace platform { float score(std::vector>& X, std::vector& y) override; std::vector predict(std::vector>& X) override; XA1DE& fit(std::vector>& X, std::vector& y, const std::vector& features, const std::string& className, std::map>& states, const bayesnet::Smoothing_t smoothing) override; - - XA1DE& fit(torch::Tensor& X, torch::Tensor& y, const std::vector& features, const std::string& className, std::map>& states, const bayesnet::Smoothing_t smoothing) override { return *this; }; - XA1DE& fit(torch::Tensor& dataset, const std::vector& features, const std::string& className, std::map>& states, const bayesnet::Smoothing_t smoothing) override { return *this; }; - XA1DE& fit(torch::Tensor& dataset, const std::vector& features, const std::string& className, std::map>& states, const torch::Tensor& weights, const bayesnet::Smoothing_t smoothing) override { return *this; }; + XA1DE& fit(torch::Tensor& X, torch::Tensor& y, const std::vector& features, const std::string& className, std::map>& states, const bayesnet::Smoothing_t smoothing) override; + XA1DE& fit(torch::Tensor& dataset, const std::vector& features, const std::string& className, std::map>& states, const bayesnet::Smoothing_t smoothing) override; + XA1DE& fit(torch::Tensor& dataset, const std::vector& features, const std::string& className, std::map>& states, const torch::Tensor& weights, const bayesnet::Smoothing_t smoothing) override; torch::Tensor predict(torch::Tensor& X) override { return torch::zeros(0); }; torch::Tensor predict_proba(torch::Tensor& X) override { return torch::zeros(0); }; - int getNumberOfNodes() const override { return 0; }; int getNumberOfEdges() const override { return 0; }; int getNumberOfStates() const override { return 0; }; @@ -49,6 +48,7 @@ namespace platform { void setHyperparameters(const nlohmann::json& hyperparameters) override; std::vector& getValidHyperparameters() { return validHyperparameters; } void setDebug(bool debug) { this->debug = debug; } + std::vector graph(const std::string& title = "") const override { return {}; } protected: void trainModel(const torch::Tensor& weights, const bayesnet::Smoothing_t smoothing) override {}; @@ -57,13 +57,15 @@ namespace platform { { double sum = std::accumulate(weights_.begin(), weights_.end(), 0.0); if (sum == 0) { - throw std::runtime_error("Weights sum zero."); - } - for (double& w : weights_) { - w = w * num_instances / sum; + weights_ = std::vector(weights_.size(), 1.0); + } else { + for (double& w : weights_) { + w = w * num_instances / sum; + } } } - std::vector to_vector(const torch::Tensor& y); + template + std::vector to_vector(const torch::Tensor& y); std::vector> to_matrix(const torch::Tensor& X); Xaode aode_; std::vector weights_; diff --git a/src/main/modelRegister.h b/src/main/modelRegister.h index 4578ef2..9043855 100644 --- a/src/main/modelRegister.h +++ b/src/main/modelRegister.h @@ -35,5 +35,7 @@ static platform::Registrar registrarRaF("RandomForest", [](void) -> bayesnet::BaseClassifier* { return new pywrap::RandomForest();}); static platform::Registrar registrarXGB("XGBoost", [](void) -> bayesnet::BaseClassifier* { return new pywrap::XGBoost();}); +static platform::Registrar registrarXA1DE("XA1DE", + [](void) -> bayesnet::BaseClassifier* { return new platform::XA1DE();}); #endif \ No newline at end of file