in tensorflow_decision_forests/tensorflow/ops/inference/kernel.cc [823:913]
tf::Status SetExamples(const InputTensors& inputs,
const FeatureIndex& feature_index,
serving::AbstractExampleSet* examples) const {
const auto& features = engine_->features();
examples->FillMissing(engine_->features());
// Numerical features.
for (const auto& feature : numerical_features_) {
for (int example_idx = 0; example_idx < inputs.batch_size;
example_idx++) {
const float value =
inputs.numerical_features(example_idx, feature.tensor_col);
if (!std::isnan(value)) {
examples->SetNumerical(example_idx, feature.example_set_id, value,
features);
} else {
examples->SetMissingNumerical(example_idx, feature.example_set_id,
features);
}
}
}
// Categorical int features.
for (const auto& feature : categorical_int_features_) {
const int max_value = engine_->features()
.data_spec()
.columns(feature.dataspec_idx)
.categorical()
.number_of_unique_values();
for (int example_idx = 0; example_idx < inputs.batch_size;
example_idx++) {
int value =
inputs.categorical_int_features(example_idx, feature.tensor_col);
if (value == -1) {
examples->SetMissingCategorical(example_idx, feature.example_set_id,
features);
} else {
if (value < -1 || value >= max_value) {
value = 0;
}
examples->SetCategorical(example_idx, feature.example_set_id, value,
features);
}
}
}
// Categorical set int features.
std::vector<int> tmp_values;
for (const auto& feature : categorical_set_int_features_) {
const int max_value = engine_->features()
.data_spec()
.columns(feature.dataspec_idx)
.categorical()
.number_of_unique_values();
for (int example_idx = 0; example_idx < inputs.batch_size;
example_idx++) {
const auto status =
ExtractCategoricalSetInt(inputs, feature_index, feature.tensor_col,
max_value, example_idx, &tmp_values);
if (!status.ok()) {
return status;
}
if (!tmp_values.empty() && tmp_values.front() < 0) {
examples->SetMissingCategoricalSet(example_idx,
feature.example_set_id, features);
} else {
examples->SetCategoricalSet(example_idx, feature.example_set_id,
tmp_values, features);
}
}
}
// Boolean features.
for (const auto& feature : boolean_features_) {
for (int example_idx = 0; example_idx < inputs.batch_size;
example_idx++) {
const float value =
inputs.boolean_features(example_idx, feature.tensor_col);
if (!std::isnan(value)) {
examples->SetBoolean(example_idx, feature.example_set_id, value,
features);
} else {
examples->SetMissingBoolean(example_idx, feature.example_set_id,
features);
}
}
}
return tf::Status::OK();
}