Fix XA1DE integration

This commit is contained in:
2025-02-27 09:23:47 +01:00
parent b055065e59
commit 4e3043b2d1
6 changed files with 12 additions and 56 deletions

View File

@@ -10,12 +10,7 @@
namespace platform { namespace platform {
ExpClf::ExpClf() : semaphore_{ CountingSemaphore::getInstance() }, Boost(false) ExpClf::ExpClf() : semaphore_{ CountingSemaphore::getInstance() }, Boost(false)
{ {
} validHyperparameters = {};
void ExpClf::setHyperparameters(const nlohmann::json& hyperparameters)
{
if (!hyperparameters.empty()) {
throw std::invalid_argument("Invalid hyperparameters" + hyperparameters.dump());
}
} }
// //
// Predict // Predict

View File

@@ -6,7 +6,6 @@
#ifndef EXPCLF_H #ifndef EXPCLF_H
#define EXPCLF_H #define EXPCLF_H
#include <iostream>
#include <vector> #include <vector>
#include <string> #include <string>
#include <cmath> #include <cmath>
@@ -18,16 +17,10 @@
#include "Xaode.hpp" #include "Xaode.hpp"
namespace platform { namespace platform {
class ExpClf : public bayesnet::Boost { class ExpClf : public bayesnet::Boost {
public: public:
ExpClf(); ExpClf();
virtual ~ExpClf() = default; virtual ~ExpClf() = default;
ExpClf& fit(std::vector<std::vector<int>>& X, std::vector<int>& y, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states, const bayesnet::Smoothing_t smoothing) { return *this; };
// X is nxm tensor, y is nx1 tensor
ExpClf& fit(torch::Tensor& X, torch::Tensor& y, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states, const bayesnet::Smoothing_t smoothing) { return *this; };
ExpClf& fit(torch::Tensor& dataset, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states, const bayesnet::Smoothing_t smoothing) { return *this; };
ExpClf& fit(torch::Tensor& dataset, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states, const torch::Tensor& weights, const bayesnet::Smoothing_t smoothing) { return *this; };
std::vector<int> predict(std::vector<std::vector<int>>& X) override; std::vector<int> predict(std::vector<std::vector<int>>& X) override;
torch::Tensor predict(torch::Tensor& X) override; torch::Tensor predict(torch::Tensor& X) override;
torch::Tensor predict_proba(torch::Tensor& X) override; torch::Tensor predict_proba(torch::Tensor& X) override;
@@ -46,8 +39,7 @@ namespace platform {
bayesnet::status_t getStatus() const override { return status; } bayesnet::status_t getStatus() const override { return status; }
std::vector<std::string> getNotes() const override { return notes; } std::vector<std::string> getNotes() const override { return notes; }
std::vector<std::string> graph(const std::string& title = "") const override { return {}; } std::vector<std::string> graph(const std::string& title = "") const override { return {}; }
void setHyperparameters(const nlohmann::json& hyperparameters) override; void set_active_parents(const std::vector<int>& active_parents) { for (const auto& parent : active_parents) aode_.add_active_parent(parent); }
void set_active_parents(const std::vector<int> active_parents) { for (const auto& parent : active_parents) aode_.add_active_parent(parent); }
void add_active_parent(int parent) { aode_.add_active_parent(parent); } void add_active_parent(int parent) { aode_.add_active_parent(parent); }
void remove_last_parent() { aode_.remove_last_parent(); } void remove_last_parent() { aode_.remove_last_parent(); }
protected: protected:

View File

@@ -8,35 +8,13 @@
#include "TensorUtils.hpp" #include "TensorUtils.hpp"
namespace platform { namespace platform {
XA1DE& XA1DE::fit(std::vector<std::vector<int>>& X, std::vector<int>& y, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states, const bayesnet::Smoothing_t smoothing) void XA1DE::trainModel(const torch::Tensor& weights, const bayesnet::Smoothing_t smoothing)
{ {
std::vector<std::vector<int>> instances = X; auto X = TensorUtils::to_matrix(dataset.slice(0, 0, dataset.size(0) - 1));
instances.push_back(y); auto y = TensorUtils::to_vector<int>(dataset.index({ -1, "..." }));
int num_instances = instances[0].size(); int num_instances = X[0].size();
int num_attributes = instances.size(); weights_ = torch::full({ m }, 1.0 / m, torch::kFloat64);
normalize_weights(num_instances); normalize_weights(num_instances);
aode_.fit(X, y, features, className, states, weights_, true); aode_.fit(X, y, features, className, states, weights_, true);
fitted = true;
return *this;
}
//
// Fit
//
XA1DE& XA1DE::fit(torch::Tensor& X, torch::Tensor& y, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states, const bayesnet::Smoothing_t smoothing)
{
auto X_ = TensorUtils::to_matrix(X);
auto y_ = TensorUtils::to_vector<int>(y);
return fit(X_, y_, features, className, states, smoothing);
}
XA1DE& XA1DE::fit(torch::Tensor& dataset, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& 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<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states, const torch::Tensor& weights, const bayesnet::Smoothing_t smoothing)
{
weights_ = weights;
return fit(dataset, features, className, states, smoothing);
} }
} }

View File

@@ -6,12 +6,6 @@
#ifndef XA1DE_H #ifndef XA1DE_H
#define XA1DE_H #define XA1DE_H
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <limits>
#include "common/Timer.hpp"
#include "Xaode.hpp" #include "Xaode.hpp"
#include "ExpClf.h" #include "ExpClf.h"
@@ -19,14 +13,11 @@ namespace platform {
class XA1DE : public ExpClf { class XA1DE : public ExpClf {
public: public:
XA1DE() = default; XA1DE() = default;
virtual ~XA1DE() = default; virtual ~XA1DE() override = default;
XA1DE& fit(std::vector<std::vector<int>>& X, std::vector<int>& y, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states, const bayesnet::Smoothing_t smoothing) override;
XA1DE& fit(torch::Tensor& X, torch::Tensor& y, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states, const bayesnet::Smoothing_t smoothing) override;
XA1DE& fit(torch::Tensor& dataset, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states, const bayesnet::Smoothing_t smoothing) override;
XA1DE& fit(torch::Tensor& dataset, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states, const torch::Tensor& weights, const bayesnet::Smoothing_t smoothing) override;
std::string getVersion() override { return version; }; std::string getVersion() override { return version; };
protected: protected:
void trainModel(const torch::Tensor& weights, const bayesnet::Smoothing_t smoothing) override {}; void buildModel(const torch::Tensor& weights) override {};
void trainModel(const torch::Tensor& weights, const bayesnet::Smoothing_t smoothing) override;
private: private:
std::string version = "1.0.0"; std::string version = "1.0.0";
}; };

View File

@@ -36,7 +36,7 @@ namespace platform {
// Algorithm based on the adaboost algorithm for classification // Algorithm based on the adaboost algorithm for classification
// as explained in Ensemble methods (Zhi-Hua Zhou, 2012) // as explained in Ensemble methods (Zhi-Hua Zhou, 2012)
double alpha_t = 0; double alpha_t = 0;
torch::Tensor weights_ = torch::full({ m }, 1.0 / m, torch::kFloat64); weights_ = torch::full({ m }, 1.0 / m, torch::kFloat64);
bool finished = false; bool finished = false;
std::vector<int> featuresUsed; std::vector<int> featuresUsed;
aode_.fit(X_train_, y_train_, features, className, states, weights_, false); aode_.fit(X_train_, y_train_, features, className, states, weights_, false);

View File

@@ -18,7 +18,7 @@ namespace platform {
class XBAODE : public ExpClf { class XBAODE : public ExpClf {
public: public:
XBAODE(); XBAODE();
virtual ~XBAODE() = default; virtual ~XBAODE() override = default;
std::string getVersion() override { return version; }; std::string getVersion() override { return version; };
protected: protected:
void trainModel(const torch::Tensor& weights, const bayesnet::Smoothing_t smoothing) override; void trainModel(const torch::Tensor& weights, const bayesnet::Smoothing_t smoothing) override;