37 void addModel(
const std::string& model_name, std::shared_ptr<AbstractMLModel> model) {
38 const auto upper_model_name =
to_upper(model_name);
44 const auto upper_model_name =
to_upper(model_name);
46 auto model_map_itr =
model_map_.find(upper_model_name);
50 std::shared_ptr<AbstractMLModel>
getModel(
const std::string& model_name)
const {
51 const auto upper_model_name =
to_upper(model_name);
53 auto model_map_itr =
model_map_.find(upper_model_name);
55 return model_map_itr->second;
57 const std::string error_str =
"Model '" + upper_model_name +
"' does not exist.";
58 throw std::runtime_error(error_str);
62 const auto upper_model_name =
to_upper(model_name);
64 auto const model_it =
model_map_.find(upper_model_name);
66 std::ostringstream error_oss;
67 error_oss <<
"Cannot erase model " << upper_model_name
68 <<
". No model by that name was found.";
69 throw std::runtime_error(error_oss.str());
76 std::vector<std::string> model_names;
79 model_names.emplace_back(model.first);
85 std::vector<MLModelMetadata> model_metadata;
89 model.second->getModelType(),
90 model.second->getModelTypeString(),
91 model.second->getNumLogicalFeatures(),
92 model.second->getNumFeatures(),
93 model.second->getNumCatFeatures(),
94 model.second->getNumLogicalFeatures() - model.second->getNumCatFeatures(),
95 model.second->getModelMetadataStr()));
97 return model_metadata;
101 const auto upper_model_name =
to_upper(model_name);
103 auto model_map_itr =
model_map_.find(upper_model_name);
106 model_map_itr->second->getModelType(),
107 model_map_itr->second->getModelTypeString(),
108 model_map_itr->second->getNumLogicalFeatures(),
109 model_map_itr->second->getNumFeatures(),
110 model_map_itr->second->getNumCatFeatures(),
111 model_map_itr->second->getNumLogicalFeatures() -
112 model_map_itr->second->getNumCatFeatures(),
113 model_map_itr->second->getModelMetadataStr());
115 const std::string error_str =
"Model '" + upper_model_name +
"' does not exist.";
116 throw std::runtime_error(error_str);
120 std::map<std::string, std::shared_ptr<AbstractMLModel>>
model_map_;
129 const std::string& model_metadata)
133 const std::string& model_metadata,
134 const std::vector<std::vector<std::string>>& cat_feature_keys)
142 return static_cast<int64_t
>(
coefs_.size()) - 1;
153 using namespace daal::algorithms;
154 using namespace daal::data_management;
156 class TreeModelVisitor :
public daal::algorithms::regression::TreeNodeVisitor {
158 TreeModelVisitor(std::vector<DecisionTreeEntry>& decision_table)
159 : decision_table_(decision_table) {}
161 const std::vector<DecisionTreeEntry>& getDecisionTable()
const {
162 return decision_table_;
165 bool onLeafNode(
size_t level,
double response)
override {
167 if (last_node_leaf_) {
168 decision_table_[parent_nodes_.top()].right_child_row_idx =
169 static_cast<int64_t
>(decision_table_.size() - 1);
172 last_node_leaf_ =
true;
176 bool onSplitNode(
size_t level,
size_t featureIndex,
double featureValue)
override {
177 decision_table_.emplace_back(
179 static_cast<int64_t>(featureIndex),
180 static_cast<int64_t>(decision_table_.size() + 1)));
181 if (last_node_leaf_) {
182 decision_table_[parent_nodes_.top()].right_child_row_idx =
183 static_cast<int64_t
>(decision_table_.size() - 1);
186 last_node_leaf_ =
false;
187 parent_nodes_.emplace(decision_table_.size() - 1);
192 std::vector<DecisionTreeEntry>& decision_table_;
193 std::stack<size_t> parent_nodes_;
194 bool last_node_leaf_{
false};
200 virtual std::string getModelTypeString()
const = 0;
201 virtual int64_t getNumFeatures()
const = 0;
202 virtual int64_t getNumTrees()
const = 0;
203 virtual void traverseDF(
const int64_t tree_idx,
204 TreeModelVisitor& tree_node_visitor)
const = 0;
205 virtual ~AbstractTreeModel() =
default;
208 class DecisionTreeRegressionModel :
public virtual AbstractTreeModel {
210 DecisionTreeRegressionModel(decision_tree::regression::interface1::ModelPtr& model_ptr,
211 const std::string& model_metadata)
213 DecisionTreeRegressionModel(
214 decision_tree::regression::interface1::ModelPtr& model_ptr,
215 const std::string& model_metadata,
216 const std::vector<std::vector<std::string>>& cat_feature_keys)
217 :
AbstractMLModel(model_metadata, cat_feature_keys), model_ptr_(model_ptr) {}
219 virtual MLModelType getModelType()
const override {
223 virtual std::string getModelTypeString()
const override {
224 return "Decision Tree Regression";
227 virtual int64_t getNumFeatures()
const override {
228 return model_ptr_->getNumberOfFeatures();
230 virtual int64_t getNumTrees()
const override {
return 1; }
231 virtual void traverseDF(
const int64_t tree_idx,
232 TreeModelVisitor& tree_node_visitor)
const override {
234 model_ptr_->traverseDF(tree_node_visitor);
236 const decision_tree::regression::interface1::ModelPtr getModelPtr()
const {
241 decision_tree::regression::interface1::ModelPtr model_ptr_;
244 class GbtRegressionModel :
public virtual AbstractTreeModel {
246 GbtRegressionModel(gbt::regression::interface1::ModelPtr& model_ptr,
247 const std::string& model_metadata)
250 GbtRegressionModel(gbt::regression::interface1::ModelPtr& model_ptr,
251 const std::string& model_metadata,
252 const std::vector<std::vector<std::string>>& cat_feature_keys)
253 :
AbstractMLModel(model_metadata, cat_feature_keys), model_ptr_(model_ptr) {}
257 virtual std::string getModelTypeString()
const override {
258 return "Gradient Boosted Trees Regression";
261 virtual int64_t getNumFeatures()
const override {
262 return model_ptr_->getNumberOfFeatures();
264 virtual int64_t getNumTrees()
const override {
return model_ptr_->getNumberOfTrees(); }
265 virtual void traverseDF(
const int64_t tree_idx,
266 TreeModelVisitor& tree_node_visitor)
const override {
267 model_ptr_->traverseDF(tree_idx, tree_node_visitor);
269 const gbt::regression::interface1::ModelPtr getModelPtr()
const {
return model_ptr_; }
272 gbt::regression::interface1::ModelPtr model_ptr_;
275 class RandomForestRegressionModel :
public virtual AbstractTreeModel {
277 RandomForestRegressionModel(
278 decision_forest::regression::interface1::ModelPtr& model_ptr,
279 const std::string& model_metadata,
280 const std::vector<double>& variable_importance,
281 const double out_of_bag_error)
283 , model_ptr_(model_ptr)
284 , variable_importance_(variable_importance)
285 , out_of_bag_error_(out_of_bag_error) {}
287 RandomForestRegressionModel(
288 decision_forest::regression::interface1::ModelPtr& model_ptr,
289 const std::string& model_metadata,
290 const std::vector<std::vector<std::string>>& cat_feature_keys,
291 const std::vector<double>& variable_importance,
292 const double out_of_bag_error)
294 , model_ptr_(model_ptr)
295 , variable_importance_(variable_importance)
296 , out_of_bag_error_(out_of_bag_error) {}
298 virtual MLModelType getModelType()
const override {
302 virtual std::string getModelTypeString()
const override {
303 return "Random Forest Regression";
305 virtual int64_t getNumFeatures()
const override {
306 return model_ptr_->getNumberOfFeatures();
308 virtual int64_t getNumTrees()
const override {
return model_ptr_->getNumberOfTrees(); }
309 virtual void traverseDF(
const int64_t tree_idx,
310 TreeModelVisitor& tree_node_visitor)
const override {
311 model_ptr_->traverseDF(tree_idx, tree_node_visitor);
314 const decision_forest::regression::interface1::ModelPtr getModelPtr()
const {
318 const std::vector<double>& getVariableImportanceScores()
const {
319 return variable_importance_;
322 const double getOutOfBagError()
const {
return out_of_bag_error_; }
325 decision_forest::regression::interface1::ModelPtr model_ptr_;
326 std::vector<double> variable_importance_;
327 double out_of_bag_error_;
330 #endif // #ifdef HAVE_ONEDAL
335 const std::vector<double>& col_std_devs,
336 const std::vector<std::vector<double>>& eigenvectors,
337 const std::vector<double>& eigenvalues,
338 const std::string& model_metadata)
340 , col_means_(col_means)
341 , col_std_devs_(col_std_devs)
342 , eigenvectors_(eigenvectors)
343 , eigenvalues_(eigenvalues) {}
346 const std::vector<double>& col_std_devs,
347 const std::vector<std::vector<double>>& eigenvectors,
348 const std::vector<double>& eigenvalues,
349 const std::string& model_metadata,
350 const std::vector<std::vector<std::string>>& cat_feature_keys)
352 , col_means_(col_means)
353 , col_std_devs_(col_std_devs)
354 , eigenvectors_(eigenvectors)
355 , eigenvalues_(eigenvalues) {}
362 return static_cast<int64_t
>(col_means_.size());
368 return eigenvectors_;
379 #endif // #ifndef __CUDACC__
PcaModel(const std::vector< double > &col_means, const std::vector< double > &col_std_devs, const std::vector< std::vector< double >> &eigenvectors, const std::vector< double > &eigenvalues, const std::string &model_metadata)
const std::vector< double > & getColumnStdDevs() const
virtual std::string getModelTypeString() const override
virtual int64_t getNumFeatures() const override
std::vector< MLModelMetadata > getModelMetadata() const
virtual std::string getModelTypeString() const override
std::vector< double > eigenvalues_
LinearRegressionModel(const std::vector< double > &coefs, const std::string &model_metadata)
virtual MLModelType getModelType() const override
std::vector< double > col_std_devs_
std::vector< double > col_means_
void addModel(const std::string &model_name, std::shared_ptr< AbstractMLModel > model)
bool modelExists(const std::string &model_name) const
std::shared_ptr< AbstractMLModel > getModel(const std::string &model_name) const
LinearRegressionModel(const std::vector< double > &coefs, const std::string &model_metadata, const std::vector< std::vector< std::string >> &cat_feature_keys)
MLModelMetadata getModelMetadata(const std::string &model_name) const
std::shared_mutex model_map_mutex_
PcaModel(const std::vector< double > &col_means, const std::vector< double > &col_std_devs, const std::vector< std::vector< double >> &eigenvectors, const std::vector< double > &eigenvalues, const std::string &model_metadata, const std::vector< std::vector< std::string >> &cat_feature_keys)
void deleteModel(const std::string &model_name)
std::vector< double > coefs_
const std::vector< double > & getColumnMeans() const
const std::vector< double > & getCoefs() const
const std::vector< double > & getEigenvalues() const
virtual MLModelType getModelType() const override
std::vector< std::string > getModelNames() const
virtual int64_t getNumFeatures() const override
std::shared_timed_mutex shared_mutex
std::map< std::string, std::shared_ptr< AbstractMLModel > > model_map_
std::vector< std::vector< double > > eigenvectors_
const std::vector< std::vector< double > > & getEigenvectors() const