OmniSciDB  72c90bc290
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MLTableFunctions.cpp File Reference
+ Include dependency graph for MLTableFunctions.cpp:

Go to the source code of this file.

Functions

EXTENSION_NOINLINE_HOST int32_t supported_ml_frameworks__cpu_ (TableFunctionManager &mgr, Column< TextEncodingDict > &output_ml_frameworks, Column< bool > &output_availability, Column< bool > &output_default)
 
std::vector< std::string > get_model_features (const std::string &model_name, const std::shared_ptr< AbstractMLModel > &model)
 
EXTENSION_NOINLINE_HOST int32_t pca_fit__cpu_1 (TableFunctionManager &mgr, const TextEncodingNone &model_name, const ColumnList< TextEncodingDict > &input_cat_features, const int32_t cat_top_k, const float cat_min_fraction, const TextEncodingNone &preferred_ml_framework_str, const TextEncodingNone &model_metadata, Column< TextEncodingDict > &output_model_name)
 
EXTENSION_NOINLINE_HOST int32_t linear_reg_coefs__cpu_1 (TableFunctionManager &mgr, const TextEncodingNone &model_name, Column< int64_t > &output_coef_idx, Column< TextEncodingDict > &output_feature, Column< int64_t > &output_sub_coef_idx, Column< TextEncodingDict > &output_sub_feature, Column< double > &output_coef)
 
EXTENSION_NOINLINE_HOST int32_t linear_reg_coefs__cpu_2 (TableFunctionManager &mgr, const Column< TextEncodingDict > &model_name, Column< int64_t > &output_coef_idx, Column< TextEncodingDict > &output_feature, Column< int64_t > &output_sub_coef_idx, Column< TextEncodingDict > &output_sub_feature, Column< double > &output_coef)
 
EXTENSION_NOINLINE_HOST int32_t random_forest_reg_var_importance__cpu_1 (TableFunctionManager &mgr, const TextEncodingNone &model_name, Column< int64_t > &feature_id, Column< TextEncodingDict > &feature, Column< int64_t > &sub_feature_id, Column< TextEncodingDict > &sub_feature, Column< double > &importance_score)
 
EXTENSION_NOINLINE_HOST int32_t random_forest_reg_var_importance__cpu_2 (TableFunctionManager &mgr, const Column< TextEncodingDict > &model_name, Column< int64_t > &feature_id, Column< TextEncodingDict > &feature, Column< int64_t > &sub_feature_id, Column< TextEncodingDict > &sub_feature, Column< double > &importance_score)
 
EXTENSION_NOINLINE_HOST int32_t get_decision_trees__cpu_1 (TableFunctionManager &mgr, const TextEncodingNone &model_name, Column< int64_t > &tree_id, Column< int64_t > &entry_id, Column< bool > &is_split_node, Column< int64_t > &feature_id, Column< int64_t > &left_child, Column< int64_t > &right_child, Column< double > &value)
 
EXTENSION_NOINLINE_HOST int32_t get_decision_trees__cpu_2 (TableFunctionManager &mgr, const Column< TextEncodingDict > &model_name, Column< int64_t > &tree_id, Column< int64_t > &entry_id, Column< bool > &is_split_node, Column< int64_t > &feature_id, Column< int64_t > &left_child, Column< int64_t > &right_child, Column< double > &value)
 
EXTENSION_NOINLINE_HOST void check_model_params (const std::shared_ptr< AbstractMLModel > &model, const int64_t num_cat_features, const int64_t num_numeric_features)
 

Function Documentation

EXTENSION_NOINLINE_HOST void check_model_params ( const std::shared_ptr< AbstractMLModel > &  model,
const int64_t  num_cat_features,
const int64_t  num_numeric_features 
)

Definition at line 362 of file MLTableFunctions.cpp.

Referenced by ml_reg_predict__cpu_template(), and r2_score__cpu_template().

364  {
365  if (model->getNumLogicalFeatures() != num_cat_features + num_numeric_features) {
366  std::ostringstream error_oss;
367  error_oss << "Model expects " << model->getNumLogicalFeatures() << " features but "
368  << num_cat_features + num_numeric_features << " were provided.";
369  throw std::runtime_error(error_oss.str());
370  }
371  if (model->getNumCatFeatures() != num_cat_features) {
372  std::ostringstream error_oss;
373  error_oss << "Model expects " << model->getNumCatFeatures()
374  << " categorical features but " << num_cat_features << " were provided.";
375  throw std::runtime_error(error_oss.str());
376  }
377 }

+ Here is the caller graph for this function:

EXTENSION_NOINLINE_HOST int32_t get_decision_trees__cpu_1 ( TableFunctionManager mgr,
const TextEncodingNone model_name,
Column< int64_t > &  tree_id,
Column< int64_t > &  entry_id,
Column< bool > &  is_split_node,
Column< int64_t > &  feature_id,
Column< int64_t > &  left_child,
Column< int64_t > &  right_child,
Column< double > &  value 
)

Definition at line 275 of file MLTableFunctions.cpp.

References g_ml_models, MLModelMap::getModel(), and TableFunctionManager::set_output_row_size().

Referenced by get_decision_trees__cpu_2().

283  {
284 #ifdef HAVE_ONEDAL
285  try {
286  const auto model = g_ml_models.getModel(model_name);
287  const auto tree_model = std::dynamic_pointer_cast<AbstractTreeModel>(model);
288  if (!tree_model) {
289  throw std::runtime_error("Model not a tree-type model.");
290  }
291  const auto num_trees = tree_model->getNumTrees();
292  std::vector<std::vector<DecisionTreeEntry>> decision_trees(num_trees);
293  for (int64_t tree_idx = 0; tree_idx < num_trees; ++tree_idx) {
294  TreeModelVisitor tree_visitor(decision_trees[tree_idx]);
295  tree_model->traverseDF(tree_idx, tree_visitor);
296  }
297  std::vector<int64_t> decision_tree_offsets(num_trees + 1);
298  decision_tree_offsets[0] = 0;
299  for (int64_t tree_idx = 0; tree_idx < num_trees; ++tree_idx) {
300  decision_tree_offsets[tree_idx + 1] =
301  decision_tree_offsets[tree_idx] +
302  static_cast<int64_t>(decision_trees[tree_idx].size());
303  }
304  const auto num_entries = decision_tree_offsets[num_trees];
305  mgr.set_output_row_size(num_entries);
306  for (int64_t tree_idx = 0; tree_idx < num_trees; ++tree_idx) {
307  const auto& decision_tree = decision_trees[tree_idx];
308  const auto output_offset = decision_tree_offsets[tree_idx];
309  const int64_t num_tree_entries = decision_tree.size();
310  for (int64_t entry_idx = 0; entry_idx < num_tree_entries; ++entry_idx) {
311  const int64_t output_idx = output_offset + entry_idx;
312  const auto& tree_entry = decision_tree[entry_idx];
313  const bool entry_is_split_node = tree_entry.isSplitNode();
314  tree_id[output_idx] = tree_idx;
315  entry_id[output_idx] = entry_idx;
316  is_split_node[output_idx] = entry_is_split_node;
317  feature_id[output_idx] = !entry_is_split_node ? inline_null_value<int64_t>()
318  : tree_entry.feature_index;
319  left_child[output_idx] = !entry_is_split_node ? inline_null_value<int64_t>()
320  : tree_entry.left_child_row_idx;
321  right_child[output_idx] = !entry_is_split_node ? inline_null_value<int64_t>()
322  : tree_entry.right_child_row_idx;
323  value[output_idx] = tree_entry.value;
324  }
325  }
326  return num_entries;
327  } catch (std::runtime_error& e) {
328  const std::string error_str(e.what());
329  return mgr.ERROR_MESSAGE(error_str);
330  }
331 #else // Not HAVE_ONEDAL
332  return mgr.ERROR_MESSAGE("OneDAL library must be available for get_decision_trees.");
333 #endif
334 }
void set_output_row_size(int64_t num_rows)
Definition: heavydbTypes.h:373
std::shared_ptr< AbstractMLModel > getModel(const std::string &model_name) const
Definition: MLModel.h:50
MLModelMap g_ml_models
Definition: MLModel.h:124

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

EXTENSION_NOINLINE_HOST int32_t get_decision_trees__cpu_2 ( TableFunctionManager mgr,
const Column< TextEncodingDict > &  model_name,
Column< int64_t > &  tree_id,
Column< int64_t > &  entry_id,
Column< bool > &  is_split_node,
Column< int64_t > &  feature_id,
Column< int64_t > &  left_child,
Column< int64_t > &  right_child,
Column< double > &  value 
)

Definition at line 337 of file MLTableFunctions.cpp.

References get_decision_trees__cpu_1(), Column< TextEncodingDict >::getString(), and Column< TextEncodingDict >::size().

345  {
346  if (model_name.size() != 1) {
347  return mgr.ERROR_MESSAGE("Expected only one row in model name CURSOR.");
348  }
349  TextEncodingNone model_name_text_enc_none(mgr, model_name.getString(0));
350  return get_decision_trees__cpu_1(mgr,
351  model_name_text_enc_none,
352  tree_id,
353  entry_id,
354  is_split_node,
355  feature_id,
356  left_child,
357  right_child,
358  value);
359 }
DEVICE const std::string getString(int64_t index) const
DEVICE int64_t size() const
EXTENSION_NOINLINE_HOST int32_t get_decision_trees__cpu_1(TableFunctionManager &mgr, const TextEncodingNone &model_name, Column< int64_t > &tree_id, Column< int64_t > &entry_id, Column< bool > &is_split_node, Column< int64_t > &feature_id, Column< int64_t > &left_child, Column< int64_t > &right_child, Column< double > &value)

+ Here is the call graph for this function:

std::vector<std::string> get_model_features ( const std::string &  model_name,
const std::shared_ptr< AbstractMLModel > &  model 
)

Definition at line 60 of file MLTableFunctions.cpp.

Referenced by linear_reg_coefs__cpu_1(), and random_forest_reg_var_importance__cpu_1().

62  {
63  return model->getModelMetadata().getFeatures();
64 }

+ Here is the caller graph for this function:

EXTENSION_NOINLINE_HOST int32_t linear_reg_coefs__cpu_1 ( TableFunctionManager mgr,
const TextEncodingNone model_name,
Column< int64_t > &  output_coef_idx,
Column< TextEncodingDict > &  output_feature,
Column< int64_t > &  output_sub_coef_idx,
Column< TextEncodingDict > &  output_sub_feature,
Column< double > &  output_coef 
)

Definition at line 87 of file MLTableFunctions.cpp.

References g_ml_models, get_model_features(), MLModelMap::getModel(), Column< TextEncodingDict >::getOrAddTransient(), and TableFunctionManager::set_output_row_size().

Referenced by linear_reg_coefs__cpu_2().

93  {
94  try {
95  const auto linear_reg_model = std::dynamic_pointer_cast<LinearRegressionModel>(
96  g_ml_models.getModel(model_name));
97  if (!linear_reg_model) {
98  throw std::runtime_error("Model is not of type linear regression.");
99  }
100 
101  const auto& coefs = linear_reg_model->getCoefs();
102  const auto& cat_feature_keys = linear_reg_model->getCatFeatureKeys();
103  const int64_t num_sub_coefs = static_cast<int64_t>(coefs.size());
104  const int64_t num_cat_features = static_cast<int64_t>(cat_feature_keys.size());
105  mgr.set_output_row_size(num_sub_coefs);
106 
107  std::vector<std::string> feature_names =
108  get_model_features(model_name, linear_reg_model);
109  feature_names.insert(feature_names.begin(), "intercept");
110 
111  for (int64_t sub_coef_idx = 0, coef_idx = 0; sub_coef_idx < num_sub_coefs;
112  ++coef_idx) {
113  if (num_cat_features >= coef_idx && coef_idx > 0) {
114  const auto& col_cat_feature_keys = cat_feature_keys[coef_idx - 1];
115  int64_t col_cat_feature_idx = 1;
116  for (const auto& col_cat_feature_key : col_cat_feature_keys) {
117  output_coef_idx[sub_coef_idx] = coef_idx;
118  if (feature_names[coef_idx].empty()) {
119  output_feature[sub_coef_idx] = inline_null_value<TextEncodingDict>();
120  } else {
121  output_feature[sub_coef_idx] =
122  output_feature.getOrAddTransient(feature_names[coef_idx]);
123  }
124  output_sub_coef_idx[sub_coef_idx] = col_cat_feature_idx++;
125  output_sub_feature[sub_coef_idx] =
126  output_sub_feature.getOrAddTransient(col_cat_feature_key);
127  output_coef[sub_coef_idx] = coefs[sub_coef_idx];
128  ++sub_coef_idx;
129  }
130  } else {
131  output_coef_idx[sub_coef_idx] = coef_idx;
132  if (feature_names[coef_idx].empty()) {
133  output_feature[sub_coef_idx] = inline_null_value<TextEncodingDict>();
134  } else {
135  output_feature[sub_coef_idx] =
136  output_feature.getOrAddTransient(feature_names[coef_idx]);
137  }
138  output_sub_coef_idx[sub_coef_idx] = 1;
139  output_sub_feature[sub_coef_idx] = inline_null_value<TextEncodingDict>();
140  output_coef[sub_coef_idx] = coefs[sub_coef_idx];
141  ++sub_coef_idx;
142  }
143  }
144 
145  return num_sub_coefs;
146  } catch (std::runtime_error& e) {
147  return mgr.ERROR_MESSAGE(e.what());
148  }
149 }
void set_output_row_size(int64_t num_rows)
Definition: heavydbTypes.h:373
std::shared_ptr< AbstractMLModel > getModel(const std::string &model_name) const
Definition: MLModel.h:50
MLModelMap g_ml_models
Definition: MLModel.h:124
std::vector< std::string > get_model_features(const std::string &model_name, const std::shared_ptr< AbstractMLModel > &model)
DEVICE const TextEncodingDict getOrAddTransient(const std::string &str)

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

EXTENSION_NOINLINE_HOST int32_t linear_reg_coefs__cpu_2 ( TableFunctionManager mgr,
const Column< TextEncodingDict > &  model_name,
Column< int64_t > &  output_coef_idx,
Column< TextEncodingDict > &  output_feature,
Column< int64_t > &  output_sub_coef_idx,
Column< TextEncodingDict > &  output_sub_feature,
Column< double > &  output_coef 
)

Definition at line 152 of file MLTableFunctions.cpp.

References Column< TextEncodingDict >::getString(), linear_reg_coefs__cpu_1(), and Column< TextEncodingDict >::size().

158  {
159  if (model_name.size() != 1) {
160  return mgr.ERROR_MESSAGE("Expected only one row in model name CURSOR.");
161  }
162  TextEncodingNone model_name_text_enc_none(mgr, model_name.getString(0));
163  return linear_reg_coefs__cpu_1(mgr,
164  model_name_text_enc_none,
165  output_coef_idx,
166  output_feature,
167  output_sub_coef_idx,
168  output_sub_feature,
169  output_coef);
170 }
DEVICE const std::string getString(int64_t index) const
EXTENSION_NOINLINE_HOST int32_t linear_reg_coefs__cpu_1(TableFunctionManager &mgr, const TextEncodingNone &model_name, Column< int64_t > &output_coef_idx, Column< TextEncodingDict > &output_feature, Column< int64_t > &output_sub_coef_idx, Column< TextEncodingDict > &output_sub_feature, Column< double > &output_coef)
DEVICE int64_t size() const

+ Here is the call graph for this function:

EXTENSION_NOINLINE_HOST int32_t pca_fit__cpu_1 ( TableFunctionManager mgr,
const TextEncodingNone model_name,
const ColumnList< TextEncodingDict > &  input_cat_features,
const int32_t  cat_top_k,
const float  cat_min_fraction,
const TextEncodingNone preferred_ml_framework_str,
const TextEncodingNone model_metadata,
Column< TextEncodingDict > &  output_model_name 
)

Definition at line 67 of file MLTableFunctions.cpp.

References CategoricalFeaturesBuilder< T >::getCatFeatureKeys(), CategoricalFeaturesBuilder< T >::getFeatures(), and pca_fit_impl().

74  {
75  CategoricalFeaturesBuilder<double> cat_features_builder(
76  input_cat_features, cat_top_k, cat_min_fraction, false /* cat_include_others */);
77  return pca_fit_impl(mgr,
78  model_name,
79  cat_features_builder.getFeatures(),
80  cat_features_builder.getCatFeatureKeys(),
81  preferred_ml_framework_str,
82  model_metadata,
83  output_model_name);
84 }
NEVER_INLINE HOST int32_t pca_fit_impl(TableFunctionManager &mgr, const TextEncodingNone &model_name, const ColumnList< T > &input_features, const std::vector< std::vector< std::string >> &cat_feature_keys, const TextEncodingNone &preferred_ml_framework_str, const TextEncodingNone &model_metadata, Column< TextEncodingDict > &output_model_name)

+ Here is the call graph for this function:

EXTENSION_NOINLINE_HOST int32_t random_forest_reg_var_importance__cpu_1 ( TableFunctionManager mgr,
const TextEncodingNone model_name,
Column< int64_t > &  feature_id,
Column< TextEncodingDict > &  feature,
Column< int64_t > &  sub_feature_id,
Column< TextEncodingDict > &  sub_feature,
Column< double > &  importance_score 
)

Definition at line 173 of file MLTableFunctions.cpp.

References g_ml_models, get_model_features(), MLModelMap::getModel(), Column< TextEncodingDict >::getOrAddTransient(), and TableFunctionManager::set_output_row_size().

Referenced by random_forest_reg_var_importance__cpu_2().

179  {
180 #ifndef HAVE_ONEDAL
181  return mgr.ERROR_MESSAGE(
182  "Only OneDAL framework supported for random forest regression.");
183 #endif
184  try {
185 #ifdef HAVE_ONEDAL
186  const auto base_model = g_ml_models.getModel(model_name);
187  const auto rand_forest_model =
188  std::dynamic_pointer_cast<RandomForestRegressionModel>(base_model);
189  if (!rand_forest_model) {
190  throw std::runtime_error("Model is not of type random forest.");
191  }
192  const auto& variable_importance_scores =
193  onedal_random_forest_reg_var_importance_impl(rand_forest_model);
194  const int64_t num_features = variable_importance_scores.size();
195  mgr.set_output_row_size(num_features);
196  if (num_features == 0) {
197  return mgr.ERROR_MESSAGE("Variable importance not computed for this model.");
198  }
199  if (num_features != rand_forest_model->getNumFeatures()) {
200  return mgr.ERROR_MESSAGE(
201  "Mismatch in number of features and number of variable importance metrics.");
202  }
203  const auto num_logical_features = rand_forest_model->getNumLogicalFeatures();
204  std::vector<std::string> feature_names =
205  get_model_features(model_name, rand_forest_model);
206 
207  int64_t physical_feature_idx = 0;
208  const auto& cat_feature_keys = rand_forest_model->getCatFeatureKeys();
209  const auto num_cat_features = rand_forest_model->getNumCatFeatures();
210  for (int64_t feature_idx = 0; feature_idx < num_logical_features; ++feature_idx) {
211  // Make feature ids start at 1, not 0
212  if (feature_idx < num_cat_features) {
213  const auto& col_cat_feature_keys = cat_feature_keys[feature_idx];
214  int64_t sub_feature_idx = 1;
215  for (const auto& col_cat_feature_key : col_cat_feature_keys) {
216  feature_id[physical_feature_idx] = feature_idx + 1;
217  if (feature_names[feature_idx].empty()) {
218  feature[physical_feature_idx] = inline_null_value<TextEncodingDict>();
219  } else {
220  feature[physical_feature_idx] =
221  feature.getOrAddTransient(feature_names[feature_idx]);
222  }
223  sub_feature_id[physical_feature_idx] = sub_feature_idx++;
224  const TextEncodingDict feature_sub_key =
225  sub_feature.getOrAddTransient(col_cat_feature_key);
226  sub_feature[physical_feature_idx] = feature_sub_key;
227  importance_score[physical_feature_idx] =
228  variable_importance_scores[physical_feature_idx];
229  physical_feature_idx++;
230  }
231  } else {
232  feature_id[physical_feature_idx] = feature_idx + 1;
233  if (feature_names[feature_idx].empty()) {
234  feature[physical_feature_idx] = inline_null_value<TextEncodingDict>();
235  } else {
236  feature[physical_feature_idx] =
237  feature.getOrAddTransient(feature_names[feature_idx]);
238  }
239  sub_feature_id[physical_feature_idx] = 1;
240  sub_feature[physical_feature_idx] = inline_null_value<TextEncodingDict>();
241  importance_score[physical_feature_idx] =
242  variable_importance_scores[physical_feature_idx];
243  physical_feature_idx++;
244  }
245  }
246  return num_features;
247 #endif
248  } catch (std::runtime_error& e) {
249  return mgr.ERROR_MESSAGE(e.what());
250  }
251 }
void set_output_row_size(int64_t num_rows)
Definition: heavydbTypes.h:373
std::shared_ptr< AbstractMLModel > getModel(const std::string &model_name) const
Definition: MLModel.h:50
MLModelMap g_ml_models
Definition: MLModel.h:124
std::vector< std::string > get_model_features(const std::string &model_name, const std::shared_ptr< AbstractMLModel > &model)
DEVICE const TextEncodingDict getOrAddTransient(const std::string &str)

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

EXTENSION_NOINLINE_HOST int32_t random_forest_reg_var_importance__cpu_2 ( TableFunctionManager mgr,
const Column< TextEncodingDict > &  model_name,
Column< int64_t > &  feature_id,
Column< TextEncodingDict > &  feature,
Column< int64_t > &  sub_feature_id,
Column< TextEncodingDict > &  sub_feature,
Column< double > &  importance_score 
)

Definition at line 254 of file MLTableFunctions.cpp.

References Column< TextEncodingDict >::getString(), random_forest_reg_var_importance__cpu_1(), and Column< TextEncodingDict >::size().

260  {
261  if (model_name.size() != 1) {
262  return mgr.ERROR_MESSAGE("Expected only one row in model name CURSOR.");
263  }
264  TextEncodingNone model_name_text_enc_none(mgr, model_name.getString(0));
266  model_name_text_enc_none,
267  feature_id,
268  feature,
269  sub_feature_id,
270  sub_feature,
271  importance_score);
272 }
DEVICE const std::string getString(int64_t index) const
EXTENSION_NOINLINE_HOST int32_t random_forest_reg_var_importance__cpu_1(TableFunctionManager &mgr, const TextEncodingNone &model_name, Column< int64_t > &feature_id, Column< TextEncodingDict > &feature, Column< int64_t > &sub_feature_id, Column< TextEncodingDict > &sub_feature, Column< double > &importance_score)
DEVICE int64_t size() const

+ Here is the call graph for this function:

EXTENSION_NOINLINE_HOST int32_t supported_ml_frameworks__cpu_ ( TableFunctionManager mgr,
Column< TextEncodingDict > &  output_ml_frameworks,
Column< bool > &  output_availability,
Column< bool > &  output_default 
)

Definition at line 8 of file MLTableFunctions.cpp.

References StringDictionaryProxy::getOrAddTransientBulk(), TableFunctionManager::set_output_row_size(), and Column< TextEncodingDict >::string_dict_proxy_.

11  {
12  const std::vector<std::string> ml_frameworks = {"onedal", "mlpack"};
13  const int32_t num_frameworks = ml_frameworks.size();
14  mgr.set_output_row_size(num_frameworks);
15  const std::vector<int32_t> ml_framework_string_ids =
16  output_ml_frameworks.string_dict_proxy_->getOrAddTransientBulk(ml_frameworks);
17 
18 #if defined(HAVE_ONEDAL) || defined(HAVE_MLPACK)
19  bool found_available_framework = false;
20  auto framework_found_actions = [&output_availability,
21  &output_default,
22  &found_available_framework](const int64_t out_row_idx) {
23  output_availability[out_row_idx] = true;
24  if (!found_available_framework) {
25  output_default[out_row_idx] = true;
26  found_available_framework = true;
27  } else {
28  output_default[out_row_idx] = false;
29  }
30  };
31 #endif
32 
33 #if !defined(HAVE_ONEDAL) || !defined(HAVE_MLPACK)
34  auto framework_not_found_actions = [&output_availability,
35  &output_default](const int64_t out_row_idx) {
36  output_availability[out_row_idx] = false;
37  output_default[out_row_idx] = false;
38  };
39 #endif
40 
41  for (int32_t out_row_idx = 0; out_row_idx < num_frameworks; ++out_row_idx) {
42  output_ml_frameworks[out_row_idx] = ml_framework_string_ids[out_row_idx];
43  if (ml_frameworks[out_row_idx] == "onedal") {
44 #ifdef HAVE_ONEDAL
45  framework_found_actions(out_row_idx);
46 #else
47  framework_not_found_actions(out_row_idx);
48 #endif
49  } else if (ml_frameworks[out_row_idx] == "mlpack") {
50 #ifdef HAVE_MLPACK
51  framework_found_actions(out_row_idx);
52 #else
53  framework_not_found_actions(out_row_idx);
54 #endif
55  }
56  }
57  return num_frameworks;
58 }
void set_output_row_size(int64_t num_rows)
Definition: heavydbTypes.h:373
StringDictionaryProxy * string_dict_proxy_
std::vector< int32_t > getOrAddTransientBulk(const std::vector< std::string > &strings)

+ Here is the call graph for this function: