14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  grxmldoc.h  *
34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the 'License');          *
74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  you may not use this file except in compliance with the License.         *
84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  You may obtain a copy of the License at                                  *
104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0                           *
114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software      *
134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  distributed under the License is distributed on an 'AS IS' BASIS,        *
144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  See the License for the specific language governing permissions and      *
164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  limitations under the License.                                           *
174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/
194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef __grxmldoc_h__
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define  __grxmldoc_h__
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// #define MEMTRACE // Uses mtrace() to detect leaks
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "hashmap.h"
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "tinyxml.h"
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stack>
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "vocab.h"
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SCRIPT_LABEL_PREFIX "_"
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SCRIPT_LABEL_PREFIX_LEN 1
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass Node;
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <typename T1, typename T2> class HashMap;
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass Graph;
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass SubGraph;
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass GRXMLDoc
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectpublic:
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    typedef TiXmlNode XMLNode;
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Some convenience items for string comparison
4373018b4a1d088cdda0e7bd059fddf1f308a8195aIan Rogers    enum KeywordValues {NodeTypeGrammar, NodeTypeRule, NodeTypeRuleReference, NodeTypeOneOf, NodeTypeItem, NodeTypeTag, NodeTypeCount, NodeTypeMeta, NodeTypeBadValue};
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    typedef  std::map<std::string, KeywordValues> KEYWDPAIR;
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    typedef struct {
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	bool hasRuleRef;
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	std::string RuleRefName;
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	int tagID;
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    } ItemData;
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    GRXMLDoc();
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ~GRXMLDoc();
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Optional use of voc and model files
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   // TODO: Rearrange access to voc and models
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef OPENFSTSDK
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    void initialize_SR(char* parfile);
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    void shutdown_SR();
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    Vocabulary *getVocabulary() { return m_pVocab;}
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    AcousticModel* getModel() { return m_pModel;}
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int addPhonemeToList( std::string const& s );
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool findPhoneme( int i, std::string & s );
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool getHMMSequence (int centre, int left, int right, std::vector<int> & modelSequence);
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //  Lookup functions
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool findSubGraph(std::string & s, SubGraph *&p_SubGraph);
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool findRule(int i, std::string &s );
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool findTag(int i, std::string &s );
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool findLabel(int i, std::string &s );
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool findSubGraphIndex( SubGraph *p_SubGraph, std::string &s );
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool findRuleIndex( std::string s, int &i );
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool findTagIndex( std::string s, int &i );
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool findLabelIndex( std::string s, int &i );
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool findSortedLabel(int i, std::string &s );
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool findSortedLabelIndex( int i, int &sortedIndex );
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool findMeta(const std::string & sn, std::string &s);
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool setMeta(const std::string & sn, const std::string &s);
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    void sortLabels();
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    void addOLabelToOList( std::string & s);
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool WriteOLabels(const std::string& fileName);
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Take DOM object and create word graph. Creates SubGraph, rule, tag and label lists.
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool parseGrammar( XMLNode &node, std::string & xMLFileName );
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Generate output files
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    void writeMapFile( std::string & fileName );
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    void writeScriptFile( std::string & fileName );
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    void writeGraphFiles( std::string & fileName, bool bDoWriteRecogGraphs );
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    void writeParamsFile( std::string & fileName );
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    void printLists();
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    void printSubgraphs();
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectprotected:
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    void initializeLists();
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool parseNode( XMLNode &node, SubGraph *&p_SubGraph, const unsigned int level );
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool beginNode( XMLNode &node, SubGraph *&p_SubGraph, const unsigned int level );
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool endNode( XMLNode &node, SubGraph *&p_SubGraph, const unsigned int level );
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool beginParseGrammarNode( XMLNode &node );
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool endParseGrammarNode( XMLNode &node );
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool beginParseMetaNode( XMLNode &node );
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool endParseMetaNode( XMLNode &node );
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool beginParseRuleNode( XMLNode &node, SubGraph *&p_SubGraph);
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool endParseRuleNode( XMLNode &node, SubGraph *&p_SubGraph );
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool beginItem( XMLNode &node, SubGraph *&p_SubGraph );
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool endItem( XMLNode &node, SubGraph *&p_SubGraph );
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool processCDATA( XMLNode &node, SubGraph *&p_SubGraph );
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool beginOneOf( XMLNode &node, SubGraph *&p_SubGraph );
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool endOneOf( XMLNode &node, SubGraph *&p_SubGraph );
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool beginRuleRef( XMLNode &grmNode, SubGraph *&p_SubGraph );
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool endRuleRef(XMLNode &node, SubGraph *&p_SubGraph );
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool fixRuleRef( SubGraph *&p_SubGraph );
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool getRuleRefName(XMLNode &node, std::string &ruleName);
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool extendAltExpression( XMLNode &node, int level );
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool beginTag( XMLNode &node, SubGraph *&p_SubGraph );
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool endTag( XMLNode &node, SubGraph *&p_SubGraph );
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool beginCount( XMLNode &node, SubGraph *&p_SubGraph );
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool endCount( XMLNode &node, SubGraph *&p_SubGraph );
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    void printNode( XMLNode &node, int level );
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool addRuleToList(std::string const& ruleName, SubGraph *&p_SubGraph);
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool deleteRules();
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool addTagToList( std::string const& s );
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool addLabelToList( std::string const& s );
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    void printSubgraph( SubGraph &p_SubGraph );
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectprivate:
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    Graph *m_pGraph;	// The top-level container object for the word graph;
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    KEYWDPAIR  m_NodeKeyWords;
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // The unique attributes of the GRML doc
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string m_XMLMode;
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string m_XMLLanguage;
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string m_RootRule;
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string m_XMLTagFormat;
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string m_XMLVersion;
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string m_XMLBase;
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string m_XMLFileName;
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //  We store indices for all labels used in the word graph.
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //  Store all these labels in the m_LabelList table, which is auto-indexed.
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //  We need a list of the rule names so that we can distinguish them from other labels.
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //  Store these rule names in the m_RuleList table with an index equal to the label index for the rule.
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //  Thus, when we need the index of a rule, we go straight to m_RuleList
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //	and when we need the label of a rule or any other item we use m_LabelList.
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    HashMap<std::string,SubGraph*> m_SubgraphList;
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    HashMap<int,std::string> m_TagList;	// <item tag = ...
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    HashMap<int,std::string> m_LabelList; // Stores all network label IDs, including rule names
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    HashMap<int,std::string> m_SortedLabelList; // Used to sort the labels fo
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    HashMap<int, std::string> m_PhonemeList;    // Stores triphones
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    HashMap<std::string,int> m_RuleList; // Stores rule name and index used in the LabelList. Use to distinguish which are rules.
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    HashMap<int, std::string> m_RuleScope;
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    HashMap<int, std::string> m_SlotList;
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    HashMap<std::string, std::string> m_MetaKeyValPairs; //Store word-penalty value
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    HashMap<std::string, int> m_OutputPtxtLabels;
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::stack<ItemData*> m_ItemVarsStack;
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::stack<std::string> m_RuleListStack;
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int m_RuleAutoIndex;
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int m_TagAutoIndex;
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int m_LabelAutoIndex;
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int m_PhonemeAutoIndex;
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int m_ExpandedRulesAutoIndex;
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int m_TagID; // Use to stash tag index for items.
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Note the subgraph list does not have an auto-index as it is string-indexed.
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // All these lists also have an internal numeric index which can be used.
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef OPENFSTSDK
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    Vocabulary *m_pVocab;
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    AcousticModel *m_pModel;
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project};
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif // __grxmldoc_h__
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
181