40 const std::vector<std::string>& class_names,
41 const std::vector<std::vector<std::string>>& class_values)
43 m_upos_idx = std::numeric_limits<size_t>::max();
46 decltype(uint_dicts) enc_uint_dict;
47 enc_uint_dict.push_back(uint_dicts[0]);
58 assert(class_names.size() == class_values.size());
60 for (
size_t feat_idx = 0; feat_idx < lang_morph_model.get_feats_count(); ++feat_idx)
62 std::vector<uint64_t> v;
63 auto cls_idx = std::numeric_limits<size_t>::max();
65 const auto& feat_name = lang_morph_model.get_feat_name(feat_idx);
66 auto it = std::find(class_names.begin(), class_names.end(), feat_name);
68 if (class_names.end() != it)
70 const auto& feat_vec = lang_morph_model.get_feat_vec_ref(feat_idx);
71 auto it_diff = it - class_names.begin();
72 if (it_diff != std::numeric_limits<ptrdiff_t>::max())
74 assert(cls_idx != std::numeric_limits<uint64_t>::max());
75 assert(cls_idx != std::numeric_limits<size_t>::max());
77 v.resize(class_values[cls_idx].
size(), 0);
79 for (
size_t j = 0; j < feat_vec.size(); ++j)
82 for (
size_t k = 0; k < class_values[cls_idx].size(); ++k)
84 if (feat_vec[j] == class_values[cls_idx][k]
85 || (
"_" == feat_vec[j] &&
"-" == class_values[cls_idx][k]))
95 std::cerr <<
"Warning: classifier doesn't provide required feature: \""
96 << feat_name <<
"\"" << std::endl;
99 auto dd = std::make_shared<Dict<uint64_t>>(v);
103 enc_feats_dict.push_back(d);
105 if (cls_idx != std::numeric_limits<size_t>::max() && cls_idx < class_names.size() && class_names[cls_idx] ==
"upos")
112 if (
m_upos_idx == std::numeric_limits<size_t>::max())
114 throw std::logic_error(
"Underlying classifier doesn't provide UPOS.");
130 std::vector<size_t> feats(lang_morph_model.get_feats_count());
134 if (feat_idx == std::numeric_limits<size_t>::max())
136 throw std::runtime_error(std::string(
"get_morph_feats wrong feat_idx: max size_t"));
138 else if (feat_idx >= feat2cls.size())
140 throw std::runtime_error(std::string(
"get_morph_feats wrong feat_idx: larger than feat2cls size"));
142 assert(feat_idx < feat2cls.size() && feat_idx != std::numeric_limits<size_t>::max());
143 auto class_idx = feat2cls[feat_idx];
144 if (class_idx == std::numeric_limits<size_t>::max())
145 return std::numeric_limits<uint64_t>::max();
146 assert(class_idx != std::numeric_limits<uint64_t>::max());
147 return classes->get(idx, class_idx);
virtual void predict(size_t worker_id, const Eigen::MatrixXf &inputs, int64_t input_begin, int64_t input_end, int64_t output_begin, int64_t output_end, std::shared_ptr< StdMatrix< uint8_t > > &output, const std::vector< std::string > &outputs_names)=0