6#ifndef DEEPLIMA_SRC_INFERENCE_RNN_SEQ_CLS_H
7#define DEEPLIMA_SRC_INFERENCE_RNN_SEQ_CLS_H
22std::ostream&
operator<< (std::ostream& out,
const std::vector<T>& v) {
25 std::copy (v.begin(), v.end(), std::ostream_iterator<T>(out,
", "));
45template <
class Model,
class InputVectorizer,
class Out>
47 public ThreadPool< RnnSequenceClassifier<Model, InputVectorizer, Out> >,
218 this_ptr->predict(worker_id,
219 this_ptr->get_tensor(),
312 virtual void init(uint32_t max_feat,
316 uint32_t num_threads,
317 bool precomputed_input=
false)
334 for (
size_t i = 0; i < num_threads; i++)
345 m_output->resize(Model::get_output_str_dicts_names().size());
349 v.resize(InputVectorizer::size());
350 assert(v.size() > 0);
354 void load(
const std::string& fn)
360 void get_classes_from_fn(
const std::string& fn, std::vector<std::string>& classes_names, std::vector<std::vector<std::string>>& classes){
361 Model::get_classes_from_fn(fn, classes_names, classes);
366 assert(cls < m_output->size());
368 assert(
m_slots[idx].m_lock_count == 1);
369 assert(
m_slots[idx].m_work_started);
376 return m_slots[idx].m_output_begin;
382 return m_slots[idx].m_work_started;
388 return m_slots[idx].m_output_end;
394 return m_slots[idx].m_lock_count;
400 m_slots[idx].m_lock_count += v;
410 assert(
m_slots[idx].m_lock_count > 0);
413 if (0 ==
m_slots[idx].m_lock_count)
432 if (timepoint >= InputVectorizer::size() -
m_overlap)
464 slot.m_lengths = lengths;
506 inline void start_job(uint32_t idx,
bool no_more_data=
false)
563 std::cerr << (
void*)
this <<
" " <<
"SLOTS: ";
566 std::cerr <<
" | " << int(
m_slots[i].m_lock_count);
568 std::cerr <<
" |" << std::endl;
std::vector< std::vector< size_t > > m_lengths
bool get_slot_started(uint32_t idx) const
void pretty_print() const
int32_t next_slot(uint32_t idx)
void clear_slot(uint32_t idx)
void start_job_impl(uint32_t idx)
Push the slot idx in the thread pool for starting the job on it.
uint64_t get_slot_end(uint32_t idx) const
virtual void init(uint32_t max_feat, uint32_t overlap, uint32_t num_slots, uint32_t slot_len, uint32_t num_threads, bool precomputed_input=false)
uint32_t get_num_slots() const
void load(const std::string &fn)
virtual ~RnnSequenceClassifier()
void increment_timepoint(uint64_t &timepoint)
std::vector< slot_t > m_slots
uint8_t get_lock_count(uint32_t idx) const
uint32_t get_slot_size() const
int32_t prev_slot(uint32_t idx)
void get_classes_from_fn(const std::string &fn, std::vector< std::string > &classes_names, std::vector< std::vector< std::string > > &classes)
std::shared_ptr< StdMatrix< Out > > get_output()
void set_slot_begin(uint32_t idx, uint64_t slot_begin)
void set_slot_end(uint32_t idx, uint64_t slot_end)
void increment_lock_count(uint32_t idx, uint8_t v=1)
static void run_one_job(ThisClass *this_ptr, size_t worker_id, void *p)
void decrement_lock_count(uint32_t idx)
int32_t get_slot_idx(uint64_t timepoint) const
uint64_t get_slot_begin(uint32_t idx) const
RnnSequenceClassifier< Model, InputVectorizer, Out > ThisClass
void start_job(uint32_t idx, bool no_more_data=false)
uint8_t get_output(uint64_t pos, uint8_t cls)
void set_slot_lengths(uint32_t idx, const std::vector< size_t > &lengths)
ThreadPool< ThisClass > RnnSequenceClassifierThreadPool
void wait_for_slot(uint32_t idx)
uint64_t get_start_timepoint() const
friend RnnSequenceClassifierThreadPool
virtual void reset()
Need to be called to be able to reuse this classifier on several sequences.
std::shared_ptr< StdMatrix< Out > > m_output
void init(size_t num_threads)
void wait_for_any_job_notification(const std::function< bool()> fn)
std::ostream & operator<<(std::ostream &out, const std::vector< T > &v)
slot_t represents the part of the job processed by a classifier thread (tokenizer or tagger).
std::vector< size_t > m_lengths
slot_t & operator=(const slot_t &s)
std::atomic< uint8_t > m_lock_count