SVM Classifier C++ 1.0.0
High-performance Support Vector Machine classifier with scikit-learn compatible API
Loading...
Searching...
No Matches
kernel_parameters.hpp
1#pragma once
2
3#include "types.hpp"
4#include <torch/torch.h>
5#include <vector>
6#include <memory>
7
8// Forward declarations for libsvm and liblinear structures
9struct svm_node;
10struct svm_problem;
11struct feature_node;
12struct problem;
13
14namespace svm_classifier {
15
23 class DataConverter {
24 public:
29
34
41 std::unique_ptr<svm_problem> to_svm_problem(const torch::Tensor& X,
42 const torch::Tensor& y = torch::Tensor());
43
50 std::unique_ptr<problem> to_linear_problem(const torch::Tensor& X,
51 const torch::Tensor& y = torch::Tensor());
52
58 svm_node* to_svm_node(const torch::Tensor& sample);
59
65 feature_node* to_feature_node(const torch::Tensor& sample);
66
72 torch::Tensor from_predictions(const std::vector<double>& predictions);
73
79 torch::Tensor from_probabilities(const std::vector<std::vector<double>>& probabilities);
80
86 torch::Tensor from_decision_values(const std::vector<std::vector<double>>& decision_values);
87
94 void validate_tensors(const torch::Tensor& X, const torch::Tensor& y = torch::Tensor());
95
100 int get_n_features() const { return n_features_; }
101
106 int get_n_samples() const { return n_samples_; }
107
111 void cleanup();
112
117 void set_sparse_threshold(double threshold) { sparse_threshold_ = threshold; }
118
123 double get_sparse_threshold() const { return sparse_threshold_; }
124
125 private:
126 int n_features_;
127 int n_samples_;
128 double sparse_threshold_;
129
130 // Memory management for libsvm structures
131 std::vector<std::vector<svm_node>> svm_nodes_storage_;
132 std::vector<svm_node*> svm_x_space_;
133 std::vector<double> svm_y_space_;
134
135 // Memory management for liblinear structures
136 std::vector<std::vector<feature_node>> linear_nodes_storage_;
137 std::vector<feature_node*> linear_x_space_;
138 std::vector<double> linear_y_space_;
139
140 // Single sample storage (for prediction)
141 std::vector<svm_node> single_svm_nodes_;
142 std::vector<feature_node> single_linear_nodes_;
143
149 std::vector<std::vector<svm_node>> tensor_to_svm_nodes(const torch::Tensor& X);
150
156 std::vector<std::vector<feature_node>> tensor_to_linear_nodes(const torch::Tensor& X);
157
163 std::vector<svm_node> sample_to_svm_nodes(const torch::Tensor& sample);
164
170 std::vector<feature_node> sample_to_linear_nodes(const torch::Tensor& sample);
171
177 std::vector<double> extract_labels(const torch::Tensor& y);
178
184 torch::Tensor ensure_cpu_tensor(const torch::Tensor& tensor);
185
192 void validate_tensor_properties(const torch::Tensor& tensor, int expected_dims, const std::string& name);
193 };
194
195} // namespace svm_classifier
int get_n_samples() const
Get number of samples from last conversion.
svm_node * to_svm_node(const torch::Tensor &sample)
Convert single sample to libsvm format.
double get_sparse_threshold() const
Get sparse threshold.
int get_n_features() const
Get number of features from last conversion.
void cleanup()
Clean up all allocated memory.
torch::Tensor from_decision_values(const std::vector< std::vector< double > > &decision_values)
Convert decision values back to PyTorch tensor.
torch::Tensor from_probabilities(const std::vector< std::vector< double > > &probabilities)
Convert probabilities back to PyTorch tensor.
DataConverter()
Default constructor.
std::unique_ptr< svm_problem > to_svm_problem(const torch::Tensor &X, const torch::Tensor &y=torch::Tensor())
Convert PyTorch tensors to libsvm format.
feature_node * to_feature_node(const torch::Tensor &sample)
Convert single sample to liblinear format.
std::unique_ptr< problem > to_linear_problem(const torch::Tensor &X, const torch::Tensor &y=torch::Tensor())
Convert PyTorch tensors to liblinear format.
void set_sparse_threshold(double threshold)
Set sparse threshold (features with absolute value below this are ignored)
void validate_tensors(const torch::Tensor &X, const torch::Tensor &y=torch::Tensor())
Validate input tensors.
torch::Tensor from_predictions(const std::vector< double > &predictions)
Convert predictions back to PyTorch tensor.
~DataConverter()
Destructor - cleans up allocated memory.