17898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/* 27898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Copyright (C) 2009 The Android Open Source Project 37898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * 47898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 57898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * you may not use this file except in compliance with the License. 67898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * You may obtain a copy of the License at 77898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * 87898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 97898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * 107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * See the License for the specific language governing permissions and 147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * limitations under the License. 157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifndef PINYINIME_ANDPY_INCLUDE_MATRIXSEARCH_H__ 187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#define PINYINIME_ANDPY_INCLUDE_MATRIXSEARCH_H__ 197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include <stdlib.h> 217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "./atomdictbase.h" 227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "./dicttrie.h" 237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "./searchutility.h" 247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "./spellingtrie.h" 257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "./splparser.h" 267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectnamespace ime_pinyin { 287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectstatic const size_t kMaxRowNum = kMaxSearchSteps; 307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projecttypedef struct { 327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // MileStoneHandle objects for the system and user dictionaries. 337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project MileStoneHandle dict_handles[2]; 347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // From which DMI node. -1 means it's from root. 357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project PoolPosType dmi_fr; 367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The spelling id for the Pinyin string from the previous DMI to this node. 377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If it is a half id like Shengmu, the node pointed by dict_node is the first 387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // node with this Shengmu, 397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 spl_id; 407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // What's the level of the dict node. Level of root is 0, but root is never 417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // recorded by dict_node. 427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project unsigned char dict_level:7; 437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If this node is for composing phrase, this bit is 1. 447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project unsigned char c_phrase:1; 457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Whether the spl_id is parsed with a split character at the end. 467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project unsigned char splid_end_split:1; 477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // What's the length of the spelling string for this match, for the whole 487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // word. 497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project unsigned char splstr_len:7; 507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Used to indicate whether all spelling ids from the root are full spelling 517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // ids. This information is useful for keymapping mode(not finished). Because 527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // in this mode, there is no clear boundaries, we prefer those results which 537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // have full spelling ids. 547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project unsigned char all_full_id:1; 557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} DictMatchInfo, *PDictMatchInfo; 567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projecttypedef struct MatrixNode { 587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LemmaIdType id; 597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project float score; 607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project MatrixNode *from; 617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // From which DMI node. Used to trace the spelling segmentation. 627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project PoolPosType dmi_fr; 637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 step; 647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} MatrixNode, *PMatrixNode; 657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projecttypedef struct { 677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The MatrixNode position in the matrix pool 687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project PoolPosType mtrx_nd_pos; 697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The DictMatchInfo position in the DictMatchInfo pool. 707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project PoolPosType dmi_pos; 717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 mtrx_nd_num; 727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 dmi_num:15; 737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Used to indicate whether there are dmi nodes in this step with full 747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // spelling id. This information is used to decide whether a substring of a 757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // valid Pinyin should be extended. 767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Example1: shoudao 787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // When the last char 'o' is added, the parser will find "dao" is a valid 797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Pinyin, and because all dmi nodes at location 'd' (including those for 807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // "shoud", and those for "d") have Shengmu id only, so it is not necessary 817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // to extend "ao", otherwise the result may be "shoud ao", that is not 827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // reasonable. 837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Example2: hengao 857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // When the last 'o' is added, the parser finds "gao" is a valid Pinyin. 867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Because some dmi nodes at 'g' has Shengmu ids (hen'g and g), but some dmi 877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // nodes at 'g' has full ids ('heng'), so it is necessary to extend "ao", thus 887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // "heng ao" can also be the result. 897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Similarly, "ganga" is expanded to "gang a". 917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // For Pinyin string "xian", because "xian" is a valid Pinyin, because all dmi 937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // nodes at 'x' only have Shengmu ids, the parser will not try "x ian" (and it 947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // is not valid either). If the parser uses break in the loop, the result 957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // always be "xian"; but if the parser uses continue in the loop, "xi an" will 967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // also be tried. This behaviour can be set via the function 977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // set_xi_an_switch(). 987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 dmi_has_full_id:1; 997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Points to a MatrixNode of the current step to indicate which choice the 1007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // user selects. 1017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project MatrixNode *mtrx_nd_fixed; 1027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} MatrixRow, *PMatrixRow; 1037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// When user inputs and selects candidates, the fixed lemma ids are stored in 1057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// lma_id_ of class MatrixSearch, and fixed_lmas_ is used to indicate how many 1067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// lemmas from the beginning are fixed. If user deletes Pinyin characters one 1077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// by one from the end, these fixed lemmas can be unlocked one by one when 1087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// necessary. Whenever user deletes a Chinese character and its spelling string 1097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// in these fixed lemmas, all fixed lemmas will be merged together into a unit 1107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// named ComposingPhrase with a lemma id kLemmaIdComposing, and this composing 1117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// phrase will be the first lemma in the sentence. Because it contains some 1127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// modified lemmas (by deleting a character), these merged lemmas are called 1137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// sub lemmas (sublma), and each of them are represented individually, so that 1147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// when user deletes Pinyin characters from the end, these sub lemmas can also 1157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// be unlocked one by one. 1167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projecttypedef struct { 1177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 spl_ids[kMaxRowNum]; 1187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 spl_start[kMaxRowNum]; 1197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char16 chn_str[kMaxRowNum]; // Chinese string. 1207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 sublma_start[kMaxRowNum]; // Counted in Chinese characters. 1217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t sublma_num; 1227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 length; // Counted in Chinese characters. 1237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} ComposingPhrase, *TComposingPhrase; 1247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectclass MatrixSearch { 1267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private: 1277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If it is true, prediction list by string whose length is greater than 1 1287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // will be limited to a reasonable number. 1297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const bool kPredictLimitGt1 = false; 1307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If it is true, the engine will prefer long history based prediction, 1327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // for example, when user inputs "BeiJing", we prefer "DaXue", etc., which are 1337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // based on the two-character history. 1347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const bool kPreferLongHistoryPredict = true; 1357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If it is true, prediction will only be based on user dictionary. this flag 1377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // is for debug purpose. 1387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const bool kOnlyUserDictPredict = false; 1397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The maximum buffer to store LmaPsbItems. 1417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const size_t kMaxLmaPsbItems = 1450; 1427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // How many rows for each step. 1447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const size_t kMaxNodeARow = 5; 1457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The maximum length of the sentence candidates counted in chinese 1477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // characters 1487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const size_t kMaxSentenceLength = 16; 1497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The size of the matrix node pool. 1517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const size_t kMtrxNdPoolSize = 200; 1527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The size of the DMI node pool. 1547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const size_t kDmiPoolSize = 800; 1557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Used to indicate whether this object has been initialized. 1577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool inited_; 1587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Spelling trie. 1607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project const SpellingTrie *spl_trie_; 1617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Used to indicate this switcher status: when "xian" is parseed, should 1637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // "xi an" also be extended. Default is false. 1647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // These cases include: xia, xian, xiang, zhuan, jiang..., etc. The string 1657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // should be valid for a FULL spelling, or a combination of two spellings, 1667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // first of which is a FULL id too. So even it is true, "da" will never be 1677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // split into "d a", because "d" is not a full spelling id. 1687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool xi_an_enabled_; 1697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // System dictionary. 1717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project DictTrie* dict_trie_; 1727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // User dictionary. 1747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project AtomDictBase* user_dict_; 1757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Spelling parser. 1777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project SpellingParser* spl_parser_; 1787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The maximum allowed length of spelling string (such as a Pinyin string). 1807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t max_sps_len_; 1817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The maximum allowed length of a result Chinese string. 1837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t max_hzs_len_; 1847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Pinyin string. Max length: kMaxRowNum - 1 1867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char pys_[kMaxRowNum]; 1877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The length of the string that has been decoded successfully. 1897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t pys_decoded_len_; 1907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Shared buffer for multiple purposes. 1927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t *share_buf_; 1937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project MatrixNode *mtrx_nd_pool_; 1957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project PoolPosType mtrx_nd_pool_used_; // How many nodes used in the pool 1967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project DictMatchInfo *dmi_pool_; 1977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project PoolPosType dmi_pool_used_; // How many items used in the pool 1987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project MatrixRow *matrix_; // The first row is for starting 2007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project DictExtPara *dep_; // Parameter used to extend DMI nodes. 2027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project NPredictItem *npre_items_; // Used to do prediction 2047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t npre_items_len_; 2057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The starting positions and lemma ids for the full sentence candidate. 2077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t lma_id_num_; 2087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 lma_start_[kMaxRowNum]; // Counted in spelling ids. 2097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LemmaIdType lma_id_[kMaxRowNum]; 2107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t fixed_lmas_; 2117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If fixed_lmas_ is bigger than i, Element i is used to indicate whether 2137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // the i'th lemma id in lma_id_ is the first candidate for that step. 2147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If all candidates are the first one for that step, the whole string can be 2157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // decoded by the engine automatically, so no need to add it to user 2167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // dictionary. (We are considering to add it to user dictionary in the 2177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // future). 2187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint8 fixed_lmas_no1_[kMaxRowNum]; 2197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Composing phrase 2217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ComposingPhrase c_phrase_; 2227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If dmi_c_phrase_ is true, the decoder will try to match the 2247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // composing phrase (And definitely it will match successfully). If it 2257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // is false, the decoder will try to match lemmas items in dictionaries. 2267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool dmi_c_phrase_; 2277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The starting positions and spelling ids for the first full sentence 2297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // candidate. 2307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t spl_id_num_; // Number of splling ids 2317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 spl_start_[kMaxRowNum]; // Starting positions 2327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 spl_id_[kMaxRowNum]; // Spelling ids 2337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Used to remember the last fixed position, counted in Hanzi. 2347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t fixed_hzs_; 2357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Lemma Items with possibility score, two purposes: 2377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 1. In Viterbi decoding, this buffer is used to get all possible candidates 2387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // for current step; 2397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 2. When the search is done, this buffer is used to get candiates from the 2407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // first un-fixed step and show them to the user. 2417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LmaPsbItem lpi_items_[kMaxLmaPsbItems]; 2427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t lpi_total_; 2437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Assign the pointers with NULL. The caller makes sure that all pointers are 2457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // not valid before calling it. This function only will be called in the 2467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // construction function and free_resource(). 2477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void reset_pointers_to_null(); 2487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool alloc_resource(); 2507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void free_resource(); 2527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2534248fb0083e2e0f2f9b379ea5ce898036b900218The Android Open Source Project // Reset the search space totally. 2544248fb0083e2e0f2f9b379ea5ce898036b900218The Android Open Source Project bool reset_search0(); 2554248fb0083e2e0f2f9b379ea5ce898036b900218The Android Open Source Project 2567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Reset the search space from ch_pos step. For example, if the original 2577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // input Pinyin is "an", reset_search(1) will reset the search space to the 2587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // result of "a". If the given position is out of range, return false. 2597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // if clear_fixed_this_step is true, and the ch_pos step is a fixed step, 2607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // clear its fixed status. if clear_dmi_his_step is true, clear the DMI nodes. 2617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If clear_mtrx_this_sTep is true, clear the mtrx nodes of this step. 2627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The DMI nodes will be kept. 2637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 2647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Note: this function should not destroy content of pys_. 2657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool reset_search(size_t ch_pos, bool clear_fixed_this_step, 2667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool clear_dmi_this_step, bool clear_mtrx_this_step); 2677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Delete a part of the content in pys_. 2697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void del_in_pys(size_t start, size_t len); 2707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Delete a spelling id and its corresponding Chinese character, and merge 2727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // the fixed lemmas into the composing phrase. 2737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // del_spl_pos indicates which spelling id needs to be delete. 2747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // This function will update the lemma and spelling segmentation information. 2757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The caller guarantees that fixed_lmas_ > 0 and del_spl_pos is within 2767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // the fixed lemmas. 2777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void merge_fixed_lmas(size_t del_spl_pos); 2787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Get spelling start posistions and ids. The result will be stored in 2807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // spl_id_num_, spl_start_[], spl_id_[]. 2817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // fixed_hzs_ will be also assigned. 2827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void get_spl_start_id(); 2837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Get all lemma ids with match the given spelling id stream(shorter than the 2857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // maximum length of a word). 2867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If pfullsent is not NULL, means the full sentence candidate may be the 2877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // same with the coming lemma string, if so, remove that lemma. 2887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The result is sorted in descendant order by the frequency score. 2897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t get_lpis(const uint16* splid_str, size_t splid_str_len, 2907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LmaPsbItem* lma_buf, size_t max_lma_buf, 2917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project const char16 *pfullsent, bool sort_by_psb); 2927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 get_lemma_str(LemmaIdType id_lemma, char16 *str_buf, uint16 str_max); 2947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 get_lemma_splids(LemmaIdType id_lemma, uint16 *splids, 2967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 splids_max, bool arg_valid); 2977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Extend a DMI node with a spelling id. ext_len is the length of the rows 3007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // to extend, actually, it is the size of the spelling string of splid. 3017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // return value can be 1 or 0. 3027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 1 means a new DMI is filled in (dmi_pool_used_ is the next blank DMI in 3037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // the pool). 3047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 0 means either the dmi node can not be extended with splid, or the splid 3057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // is a Shengmu id, which is only used to get lpi_items, or the result node 3067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // in DictTrie has no son, it is not nccessary to keep the new DMI. 3077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 3087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // This function modifies the content of lpi_items_ and lpi_total_. 3097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // lpi_items_ is used to get the LmaPsbItem list, lpi_total_ returns the size. 3107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The function's returned value has no relation with the value of lpi_num. 3117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 3127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If dmi == NULL, this function will extend the root node of DictTrie 3137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 3147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // This function will not change dmi_nd_pool_used_. Please change it after 3157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // calling this function if necessary. 3167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 3177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The caller should guarantees that NULL != dep. 3187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t extend_dmi(DictExtPara *dep, DictMatchInfo *dmi_s); 3197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Extend dmi for the composing phrase. 3217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t extend_dmi_c(DictExtPara *dep, DictMatchInfo *dmi_s); 3227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Extend a MatrixNode with the give LmaPsbItem list. 3247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // res_row is the destination row number. 3257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // This function does not change mtrx_nd_pool_used_. Please change it after 3267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // calling this function if necessary. 3277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // return 0 always. 3287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t extend_mtrx_nd(MatrixNode *mtrx_nd, LmaPsbItem lpi_items[], 3297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t lpi_num, PoolPosType dmi_fr, size_t res_row); 3307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Try to find a dmi node at step_to position, and the found dmi node should 3337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // match the given spelling id strings. 3347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project PoolPosType match_dmi(size_t step_to, uint16 spl_ids[], uint16 spl_id_num); 3357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool add_char(char ch); 3377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool prepare_add_char(char ch); 3387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Called after prepare_add_char, so the input char has been saved. 3407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool add_char_qwerty(); 3417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Prepare candidates from the last fixed hanzi position. 3437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void prepare_candidates(); 3447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Is the character in step pos a splitter character? 3467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The caller guarantees that the position is valid. 3477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool is_split_at(uint16 pos); 3487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void fill_dmi(DictMatchInfo *dmi, MileStoneHandle *handles, 3507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project PoolPosType dmi_fr, 3517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 spl_id, uint16 node_num, unsigned char dict_level, 3527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool splid_end_split, unsigned char splstr_len, 3537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project unsigned char all_full_id); 3547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t inner_predict(const char16 fixed_scis_ids[], uint16 scis_num, 3567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char16 predict_buf[][kMaxPredictSize + 1], 3577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t buf_len); 3587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Add the first candidate to the user dictionary. 3607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool try_add_cand0_to_userdict(); 3617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Add a user lemma to the user dictionary. This lemma is a subset of 3637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // candidate 0. lma_from is from which lemma in lma_ids_, lma_num is the 3647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // number of lemmas to be combined together as a new lemma. The caller 3657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // gurantees that the combined new lemma's length is less or equal to 3667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // kMaxLemmaSize. 3677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool add_lma_to_userdict(uint16 lma_from, uint16 lma_num, float score); 3687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Update dictionary frequencies. 3707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void update_dict_freq(); 3717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void debug_print_dmi(PoolPosType dmi_pos, uint16 nest_level); 3737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public: 3757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project MatrixSearch(); 3767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ~MatrixSearch(); 3777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool init(const char *fn_sys_dict, const char *fn_usr_dict); 3797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool init_fd(int sys_fd, long start_offset, long length, 3817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project const char *fn_usr_dict); 3827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void set_max_lens(size_t max_sps_len, size_t max_hzs_len); 3847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void close(); 3867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void flush_cache(); 3887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void set_xi_an_switch(bool xi_an_enabled); 3907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool get_xi_an_switch(); 3927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Reset the search space. Equivalent to reset_search(0). 3947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If inited, always return true; 3957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool reset_search(); 3967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Search a Pinyin string. 3987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Return value is the position successfully parsed. 3997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t search(const char *py, size_t py_len); 4007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Used to delete something in the Pinyin string kept by the engine, and do 4027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // a re-search. 4037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Return value is the new length of Pinyin string kept by the engine which 4047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // is parsed successfully. 4057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If is_pos_in_splid is false, pos is used to indicate that pos-th Pinyin 4067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // character needs to be deleted. If is_pos_in_splid is true, all Pinyin 4077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // characters for pos-th spelling id needs to be deleted. 4087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If the deleted character(s) is just after a fixed lemma or sub lemma in 4097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // composing phrase, clear_fixed_this_step indicates whether we needs to 4107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // unlock the last fixed lemma or sub lemma. 4117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If is_pos_in_splid is false, and pos-th character is in the range for the 4127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // fixed lemmas or composing string, this function will do nothing and just 4137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // return the result of the previous search. 4147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t delsearch(size_t pos, bool is_pos_in_splid, 4157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool clear_fixed_this_step); 4167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Get the number of candiates, called after search(). 4187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t get_candidate_num(); 4197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Get the Pinyin string stored by the engine. 4217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // *decoded_len returns the length of the successfully decoded string. 4227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project const char* get_pystr(size_t *decoded_len); 4237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Get the spelling boundaries for the first sentence candidate. 4257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Number of spellings will be returned. The number of valid elements in 4267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // spl_start is one more than the return value because the last one is used 4277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // to indicate the beginning of the next un-input speling. 4287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // For a Pinyin "women", the returned value is 2, spl_start is [0, 2, 5] . 4297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t get_spl_start(const uint16 *&spl_start); 4307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Get one candiate string. If full sentence candidate is available, it will 4327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // be the first one. 4337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char16* get_candidate(size_t cand_id, char16 *cand_str, size_t max_len); 4347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Get the first candiate, which is a "full sentence". 4367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // retstr_len is not NULL, it will be used to return the string length. 4377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If only_unfixed is true, only unfixed part will be fetched. 4387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char16* get_candidate0(char16* cand_str, size_t max_len, 4397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 *retstr_len, bool only_unfixed); 4407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Choose a candidate. The decoder will do a search after the fixed position. 4427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t choose(size_t cand_id); 4437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Cancel the last choosing operation, and return the new number of choices. 4457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t cancel_last_choice(); 4467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Get the length of fixed Hanzis. 4487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t get_fixedlen(); 4497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t get_predicts(const char16 fixed_buf[], 4517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char16 predict_buf[][kMaxPredictSize + 1], 4527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t buf_len); 4537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project}; 4547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 4557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif // PINYINIME_ANDPY_INCLUDE_MATRIXSEARCH_H__ 457