Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/moses-smt/mosesdecoder.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/moses2/MorphoTrie/MorphTrie.h')
-rw-r--r--contrib/moses2/MorphoTrie/MorphTrie.h100
1 files changed, 100 insertions, 0 deletions
diff --git a/contrib/moses2/MorphoTrie/MorphTrie.h b/contrib/moses2/MorphoTrie/MorphTrie.h
new file mode 100644
index 000000000..0b013b5bb
--- /dev/null
+++ b/contrib/moses2/MorphoTrie/MorphTrie.h
@@ -0,0 +1,100 @@
+#ifndef MORPHTRIE_H_
+#define MORPHTRIE_H_
+
+#include <vector>
+#include "Node.h"
+
+namespace Moses2
+{
+
+template<class KeyClass, class ValueClass>
+class MorphTrie
+{
+public:
+ MorphTrie()
+ {
+ }
+ Node<KeyClass, ValueClass>* insert(const std::vector<KeyClass>& word,
+ const ValueClass& value);
+ const Node<KeyClass, ValueClass>* getNode(
+ const std::vector<KeyClass>& words) const;
+ const Node<KeyClass, ValueClass> &getNode(const std::vector<KeyClass>& words,
+ size_t &stoppedAtInd) const;
+ std::vector<const Node<KeyClass, ValueClass>*> getNodes(
+ const std::vector<KeyClass>& words, size_t &stoppedAtInd) const;
+private:
+ Node<KeyClass, ValueClass> root;
+};
+
+template<class KeyClass, class ValueClass>
+Node<KeyClass, ValueClass>* MorphTrie<KeyClass, ValueClass>::insert(
+ const std::vector<KeyClass>& word, const ValueClass& value)
+{
+ Node<KeyClass, ValueClass>* cNode = &root;
+ for (size_t i = 0; i < word.size(); ++i) {
+ KeyClass cKey = word[i];
+ cNode = cNode->addSubnode(cKey);
+ }
+ cNode->setValue(value);
+ return cNode;
+}
+
+template<class KeyClass, class ValueClass>
+const Node<KeyClass, ValueClass>* MorphTrie<KeyClass, ValueClass>::getNode(
+ const std::vector<KeyClass>& words) const
+{
+ size_t stoppedAtInd;
+ const Node<KeyClass, ValueClass> &ret = getNode(words, stoppedAtInd);
+ if (stoppedAtInd < words.size()) {
+ return NULL;
+ }
+ return &ret;
+}
+
+template<class KeyClass, class ValueClass>
+const Node<KeyClass, ValueClass> &MorphTrie<KeyClass, ValueClass>::getNode(
+ const std::vector<KeyClass>& words, size_t &stoppedAtInd) const
+{
+ const Node<KeyClass, ValueClass> *prevNode = &root, *newNode;
+ for (size_t i = 0; i < words.size(); ++i) {
+ const KeyClass &cKey = words[i];
+ newNode = prevNode->findSub(cKey);
+ if (newNode == NULL) {
+ stoppedAtInd = i;
+ return *prevNode;
+ }
+ prevNode = newNode;
+ }
+
+ stoppedAtInd = words.size();
+ return *newNode;
+}
+
+template<class KeyClass, class ValueClass>
+std::vector<const Node<KeyClass, ValueClass>*> MorphTrie<KeyClass, ValueClass>::getNodes(
+ const std::vector<KeyClass>& words, size_t &stoppedAtInd) const
+{
+ std::vector<const Node<KeyClass, ValueClass>*> ret;
+ const Node<KeyClass, ValueClass> *prevNode = &root, *newNode;
+ ret.push_back(prevNode);
+
+ for (size_t i = 0; i < words.size(); ++i) {
+ const KeyClass &cKey = words[i];
+ newNode = prevNode->findSub(cKey);
+ if (newNode == NULL) {
+ stoppedAtInd = i;
+ return ret;
+ }
+ else {
+ ret.push_back(newNode);
+ }
+ prevNode = newNode;
+ }
+
+ stoppedAtInd = words.size();
+ return ret;
+}
+
+}
+
+#endif /* end of include guard: MORPHTRIE_H_ */