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