1bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi/*
2bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * Copyright (C) 2017 The Android Open Source Project
3bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi *
4bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * Licensed under the Apache License, Version 2.0 (the "License");
5bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * you may not use this file except in compliance with the License.
6bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * You may obtain a copy of the License at
7bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi *
8bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi *      http://www.apache.org/licenses/LICENSE-2.0
9bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi *
10bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * Unless required by applicable law or agreed to in writing, software
11bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * distributed under the License is distributed on an "AS IS" BASIS,
12bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * See the License for the specific language governing permissions and
14bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * limitations under the License.
15bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi */
16bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
17bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#ifndef LIBTEXTCLASSIFIER_COMMON_FEATURE_DESCRIPTORS_H_
18bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#define LIBTEXTCLASSIFIER_COMMON_FEATURE_DESCRIPTORS_H_
19bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
20bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#include <memory>
21bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#include <string>
22bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#include <vector>
23bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
24bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#include "util/base/integral_types.h"
25bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#include "util/base/logging.h"
26bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#include "util/base/macros.h"
27bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
28bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifinamespace libtextclassifier {
29bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifinamespace nlp_core {
30bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
31bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi// Named feature parameter.
32bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharificlass Parameter {
33bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi public:
34bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  Parameter() {}
35bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
36bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  void set_name(const std::string &name) { name_ = name; }
37bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  const std::string &name() const { return name_; }
38bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
39bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  void set_value(const std::string &value) { value_ = value; }
40bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  const std::string &value() const { return value_; }
41bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
42bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi private:
43bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  std::string name_;
44bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  std::string value_;
45bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi};
46bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
47bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi// Descriptor for a feature function.  Used to store the results of parsing one
48bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi// feature function.
49bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharificlass FeatureFunctionDescriptor {
50bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi public:
51bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  FeatureFunctionDescriptor() {}
52bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
53bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  // Accessors for the feature function type.  The function type is the string
54bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  // that the feature extractor code is registered under.
55bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  void set_type(const std::string &type) { type_ = type; }
56bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  bool has_type() const { return !type_.empty(); }
57bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  const std::string &type() const { return type_; }
58bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
59bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  // Accessors for the feature function name.  The function name (if available)
60bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  // is used for some log messages.  Otherwise, a more precise, but also more
61bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  // verbose name based on the feature specification is used.
62bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  void set_name(const std::string &name) { name_ = name; }
63bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  bool has_name() const { return !name_.empty(); }
64bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  const std::string &name() { return name_; }
65bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
66bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  // Accessors for the default (name-less) parameter.
67bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  void set_argument(int32 argument) { argument_ = argument; }
68bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  bool has_argument() const {
69bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    // If argument has not been specified, clients should treat it as 0.  This
70bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    // makes the test below correct, without having a separate has_argument_
71bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    // bool field.
72bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    return argument_ != 0;
73bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  }
74bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  int32 argument() const { return argument_; }
75bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
76bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  // Accessors for the named parameters.
77bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  Parameter *add_parameter() {
78bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    parameters_.emplace_back();
79bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    return &(parameters_.back());
80bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  }
81bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  int parameter_size() const { return parameters_.size(); }
82bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  const Parameter &parameter(int i) const {
83bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    TC_DCHECK((i >= 0) && (i < parameter_size()));
84bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    return parameters_[i];
85bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  }
86bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
87bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  // Accessors for the sub (i.e., nested) features.  Nested features: as in
88bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  // offset(1).label.
89bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  FeatureFunctionDescriptor *add_feature() {
90bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    sub_features_.emplace_back(new FeatureFunctionDescriptor());
91bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    return sub_features_.back().get();
92bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  }
93bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  int feature_size() const { return sub_features_.size(); }
94bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  const FeatureFunctionDescriptor &feature(int i) const {
95bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    TC_DCHECK((i >= 0) && (i < feature_size()));
96bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    return *(sub_features_[i].get());
97bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  }
98bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  FeatureFunctionDescriptor *mutable_feature(int i) {
99bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    TC_DCHECK((i >= 0) && (i < feature_size()));
100bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    return sub_features_[i].get();
101bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  }
102bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
103bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi private:
104bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  // See comments for set_type().
105bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  std::string type_;
106bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
107bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  // See comments for set_name().
108bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  std::string name_;
109bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
110bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  // See comments for set_argument().
111bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  int32 argument_ = 0;
112bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
113bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  // See comemnts for add_parameter().
114bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  std::vector<Parameter> parameters_;
115bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
116bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  // See comments for add_feature().
117bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  std::vector<std::unique_ptr<FeatureFunctionDescriptor>> sub_features_;
118bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
119bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  TC_DISALLOW_COPY_AND_ASSIGN(FeatureFunctionDescriptor);
120bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi};
121bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
122bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi// List of FeatureFunctionDescriptors.  Used to store the result of parsing the
123bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi// spec for several feature functions.
124bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharificlass FeatureExtractorDescriptor {
125bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi public:
126bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  FeatureExtractorDescriptor() {}
127bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
128bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  int feature_size() const { return features_.size(); }
129bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
130bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  FeatureFunctionDescriptor *add_feature() {
131bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    features_.emplace_back(new FeatureFunctionDescriptor());
132bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    return features_.back().get();
133bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  }
134bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
135bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  const FeatureFunctionDescriptor &feature(int i) const {
136bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    TC_DCHECK((i >= 0) && (i < feature_size()));
137bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    return *(features_[i].get());
138bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  }
139bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
140bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  FeatureFunctionDescriptor *mutable_feature(int i) {
141bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    TC_DCHECK((i >= 0) && (i < feature_size()));
142bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi    return features_[i].get();
143bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  }
144bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
145bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi private:
146bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  std::vector<std::unique_ptr<FeatureFunctionDescriptor>> features_;
147bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
148bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi  TC_DISALLOW_COPY_AND_ASSIGN(FeatureExtractorDescriptor);
149bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi};
150bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
151bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi}  // namespace nlp_core
152bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi}  // namespace libtextclassifier
153bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi
154bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#endif  // LIBTEXTCLASSIFIER_COMMON_FEATURE_DESCRIPTORS_H_
155