From afedc8c1cb28505609f7f48fd82f0684f29c207a Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Wed, 11 Jan 2017 15:47:00 +0800 Subject: write phonetic_lookup_heap.h --- src/lookup/phonetic_lookup_heap.h | 90 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 86 insertions(+), 4 deletions(-) (limited to 'src/lookup') diff --git a/src/lookup/phonetic_lookup_heap.h b/src/lookup/phonetic_lookup_heap.h index 30336b9..dd2dab3 100644 --- a/src/lookup/phonetic_lookup_heap.h +++ b/src/lookup/phonetic_lookup_heap.h @@ -21,13 +21,54 @@ #ifndef PHONETIC_LOOKUP_HEAP_H #define PHONETIC_LOOKUP_HEAP_H +static inline bool trellis_value_less_than(const trellis_value_t &lhs, + const trellis_value_t &rhs) { + /* min heap here */ + return lhs.m_poss > rhs.m_poss; +} + template struct trellis_node { private: gint32 m_nelem; - trellis_value_t m_elements[nbest+1]; + trellis_value_t m_elements[nbest]; + +public: + trellis_node(){ + m_nelem = 0; + /* always assume non-used m_elements contains random data. */ + } + public: - ... // helper methods + gint32 length() { return m_nelem; } + const trellis_value_t * begin() { return m_elements; } + const trellis_value_t * end() { return m_elements + m_nelem; } + + /* return true if the item is stored into m_elements. */ + bool eval_item(const trellis_value_t * item) { + /* min heap here, and always push heap. */ + + /* still have space */ + if (m_nelem < nbest) { + m_elements[m_nelem] = *item; + m_nelem ++; + push_heap(begin(), end(), trellis_value_less_than); + return true; + } + + /* find minium item */ + trellis_value_t * min = m_elements; + + /* compare new item */ + if (item->m_poss > min->m_poss) { + pop_heap(begin(), end(), trellis_value_less_than); + m_elements[m_nelem - 1] = *item; + push_heap(begin(), end(), trellis_value_less_than); + return true; + } + + return false; + } }; /* for space usage and performance. */ @@ -60,13 +101,54 @@ public: }; +static inline bool matrix_value_less_than(const matrix_value_t &lhs, + const matrix_value_t &rhs) { + /* min heap here */ + return lhs.m_poss > rhs.m_poss; +} + template struct matrix_step { private: gint32 m_nelem; - matrix_value_t m_elements[nbest+1]; + matrix_value_t m_elements[nbest]; + +public: + matrix_step(){ + m_nelem = 0; + /* always assume non-used m_elements contains random data. */ + } + public: - ... // helper methods + gint32 length() { return m_nelem; } + const matrix_value_t * begin() { return m_elements; } + const matrix_value_t * end() { return m_elements + m_nelem; } + + /* return true if the item is stored into m_elements. */ + bool eval_item(const matrix_value_t * item) { + /* min heap here, and always push heap. */ + + /* still have space */ + if (m_nelem < nbest) { + m_elements[m_nelem] = *item; + m_nelem ++; + push_heap(begin(), end(), trellis_value_less_than); + return true; + } + + /* find minium item */ + matrix_value_t * min = m_elements; + + /* compare new item */ + if (item->m_poss > min->m_poss) { + pop_heap(begin(), end(), trellis_value_less_than); + m_elements[m_nelem - 1] = *item; + push_heap(begin(), end(), trellis_value_less_than); + return true; + } + + return false; + } }; /* for space usage and performance. */ -- cgit