6#ifndef DEEPLIMA_EIGEN_WRP_WORD_SEQ_EMBD_VECTORIZER_H
7#define DEEPLIMA_EIGEN_WRP_WORD_SEQ_EMBD_VECTORIZER_H
12#include <boost/functional/hash.hpp>
22template <
class DataSet,
class StrFeatExtractor,
class UIntFeatExtractor,
class MatrixFloat,
class Idx=u
int64_t>
28 typedef typename DataSet::token_t
token_t;
85 const StrFeatExtractor& str_feat_extractor)
118 auto pfv = std::dynamic_pointer_cast<str_vectorizer_t>(feat_descr.m_pvectorizer);
119 assert(
nullptr != pfv);
125 if (0 == feat_descr.m_dim)
136 auto pfv = std::dynamic_pointer_cast<uint_vectorizer_t>(feat_descr.m_pvectorizer);
137 assert(
nullptr != pfv);
143 if (0 == feat_descr.m_dim)
158 throw std::runtime_error(
"Unsupported");
164 throw std::runtime_error(
"Unknown vectorizer used");
173 inline void vectorize_timepoint(MatrixFloat& target, uint64_t timepoint,
const typename DataSet::token_t& token)
const
175 for (
size_t feat_idx = 0; feat_idx <
m_features.size(); ++feat_idx)
177 const auto& feat_descr =
m_features[feat_idx];
181 auto pfv = std::dynamic_pointer_cast<uint_vectorizer_t>(feat_descr.m_pvectorizer);
187 auto pfv = std::dynamic_pointer_cast<str_vectorizer_t>(feat_descr.m_pvectorizer);
195template <
class DataSet,
196 class StrFeatExtractor,
197 class UIntFeatExtractor,
200 size_t NUM_BUCKETS=32,
201 size_t BUCKET_SIZE=1024*64>
266 if (!a.m_uint_feats.empty())
268 h = boost::hash_range(a.m_uint_feats.begin(), a.m_uint_feats.end());
270 boost::hash_combine(h, a.m_str_feats);
343 const char* p = str.data();
348 p = strchr(p, 0) + 1;
349 assert(
nullptr != p);
361 = eigen_wrp::EigenMatrixXf::matrix_t::Zero(
dim, 2);
422 inline void vectorize_timepoint(MatrixFloat& target, uint64_t timepoint,
const typename DataSet::token_t& token)
429 Idx idx =
get_vector(timepoint_features, &p_matrix);
430 assert(
nullptr != p_matrix);
431 target.col(timepoint) = p_matrix->col(idx);
435template <
class Model,
437 class StrFeatExtractor,
438 class UIntFeatExtractor,
441 size_t NUM_BUCKETS=32,
442 size_t BUCKET_SIZE=1024*64>
469 = eigen_wrp::EigenMatrixXf::matrix_t::Zero(
dim, 2);
482 :
Parent(features, bucket_size),
495 assert(
nullptr != pModel);
512 = eigen_wrp::EigenMatrixXf::matrix_t::Zero(
Parent::dim(), 1);
515 while (curr < dataset.size())
521 const typename DataSet::token_t& token = dataset[curr];
591 inline void vectorize_timepoint(MatrixFloat& target, uint64_t timepoint,
const typename DataSet::token_t& token)
598 Idx idx =
get_vector(timepoint_features, &p_matrix);
599 assert(
nullptr != p_matrix);
600 target.col(timepoint) = p_matrix->col(idx);
void set_uint_feat(size_t idx, uint64_t val)
void append_str_feat(char val)
const std::string & get_str_feat() const
bool operator==(const timepoint_features_t &other) const
void append_str_feat(const std::string &val)
timepoint_features_t(size_t num_uint_feats)
std::vector< uint64_t > m_uint_feats
uint64_t get_uint_feat(size_t idx) const
WordSeqEmbdVectorizer< DataSet, StrFeatExtractor, UIntFeatExtractor, MatrixFloat, Idx > Parent
Idx get_vector(const timepoint_features_t &key, eigen_wrp::EigenMatrixXf::matrix_t **matrix)
void init_curr_bucket(size_t dim)
Parent::feature_descr_t feature_descr_t
std::unordered_map< timepoint_features_t, Idx, timepoint_features_hash > m_precomputed_index
bool is_precomputing() const
WordSeqEmbdVectorizerWithCache(const std::vector< feature_descr_t > &features, size_t bucket_size=BUCKET_SIZE)
void create_key(timepoint_features_t &timepoint_features, const typename DataSet::token_t &token)
void precompute(const DataSet &dataset)
eigen_wrp::EigenMatrixXf::matrix_t m_temp_vectors
WordSeqEmbdVectorizerWithCache(size_t bucket_size=BUCKET_SIZE)
void compute_vector(const timepoint_features_t &key, eigen_wrp::EigenMatrixXf::matrix_t &matrix, Idx idx)
virtual void init_features(const std::vector< feature_descr_t > &features)
void vectorize_timepoint(MatrixFloat &target, uint64_t timepoint, const typename DataSet::token_t &token)
std::vector< eigen_wrp::EigenMatrixXf::matrix_t > m_precomputed_vectors
virtual void init_cache(size_t dim)
virtual void init_cache(size_t dim)
void set_model(Model *pModel)
void vectorize_timepoint(MatrixFloat &target, uint64_t timepoint, const typename DataSet::token_t &token)
Idx get_vector(const typename Parent::timepoint_features_t &key, eigen_wrp::EigenMatrixXf::matrix_t **matrix)
void precompute(const DataSet &dataset)
WordSeqEmbdVectorizerWithPrecomputing(size_t bucket_size=BUCKET_SIZE)
bool is_precomputing() const
WordSeqEmbdVectorizerWithCache< DataSet, StrFeatExtractor, UIntFeatExtractor, MatrixFloat, Idx, NUM_BUCKETS, BUCKET_SIZE > Parent
WordSeqEmbdVectorizerWithPrecomputing(const std::vector< typename Parent::feature_descr_t > &features, size_t bucket_size=1024 *64)
UIntFeatExtractor m_uint_feat_extractor
FeatureVectorizerToMatrix< MatrixFloat, const std::string &, Idx > str_vectorizer_t
void vectorize_timepoint(MatrixFloat &target, uint64_t timepoint, const typename DataSet::token_t &token) const
UIntFeatExtractor & get_uint_feat_extractor()
std::vector< feature_descr_t > m_features
std::vector< std::pair< std::shared_ptr< str_vectorizer_t >, size_t > > m_str_vectorizers
std::vector< std::pair< std::shared_ptr< uint_vectorizer_t >, size_t > > m_uint_vectorizers
UIntFeatExtractor uint_feat_extractor_t
const StrFeatExtractor m_str_feat_extractor
bool is_precomputing() const
FeatureVectorizerToMatrix< MatrixFloat, uint64_t, Idx > uint_vectorizer_t
WordSeqEmbdVectorizer(const std::vector< feature_descr_t > &features)
WordSeqEmbdVectorizer(const std::vector< feature_descr_t > &features, const StrFeatExtractor &str_feat_extractor)
void init_features(const std::vector< feature_descr_t > &features)
std::vector< uint32_t > m_features_pos
void precompute(const DataSet &)
std::size_t operator()(timepoint_features_t const &a) const noexcept
feature_descr_base_t(feature_type_t type, const std::string &name, int dim=0)
feature_descr_t(feature_type_t type, const std::string &name, std::shared_ptr< FeatureVectorizerBase< Idx > > pvectorizer)
std::shared_ptr< FeatureVectorizerBase< Idx > > m_pvectorizer