1b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*
2b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
3b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
4b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Licensed under the Apache License, Version 2.0 (the "License");
5b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * you may not use this file except in compliance with the License.
6b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * You may obtain a copy of the License at
7b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
8b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *     http://www.apache.org/licenses/LICENSE-2.0
9b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
10b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Unless required by applicable law or agreed to in writing, software
11b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * distributed under the License is distributed on an "AS IS" BASIS,
12b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * See the License for the specific language governing permissions and
14b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * limitations under the License.
15b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
16b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
17b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @file picokdt.c
18b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
19b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * knowledge handling for decision trees
20b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
21b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
22b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * All rights reserved.
23b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
24b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * History:
25b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - 2009-04-20 -- initial version
26b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
27b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
28b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
29b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoos.h"
30b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodbg.h"
31b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picobase.h"
32b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoknow.h"
33b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodata.h"
34b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokdt.h"
35b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
36b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus
37b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern "C" {
38b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
39b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if 0
40b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
41b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
42b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
43b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
44b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
45b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* decision tree */
46b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
47b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
48b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
49b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @addtogroup picokdt
50b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen  * ---------------------------------------------------\n
51b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * <b> Pico KDT support </b>\n
52b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ---------------------------------------------------\n
53b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   overview extended binary tree file:
54b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen  - dt consists of optional attribute mapping tables and a non-empty
55b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    tree part
56b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen  - using the attribute mapping tables an attribute value as used
57b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    throughout the TTS can be mapped to its smaller representation
58b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    used in the tree
59b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen  - multi-byte values always little endian
60b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
61b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen  -------------------------------------------------------------------
62b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen  - bin-file, decision tree knowledge base in binary form
63b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
64b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - dt-kb = header inputmaptables outputmaptables tree
65b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
66b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
67b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - header = INPMAPTABLEPOS2 OUTMAPTABLEPOS2 TREEPOS2
68b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
69b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - INPMAPTABLEPOS2: two bytes, equals offest in number of bytes from
70b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                     the start of kb to the start of input map tables,
71b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                     may not be 0
72b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - OUTMAPTABLEPOS2: two bytes, equals offest in number of bytes from
73b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                     the start of kb to the start of outtables,
74b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                     may not be 0
75b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - TREEPOS2: two bytes, equals offest in number of bytes from the
76b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen              start of kb to the start of the tree
77b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
78b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
79b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - inputmaptables = maptables
80b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - outputmaptables = maptables
81b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - maptables = NRMAPTABLES1 {maptable}=NRMAPTABLES1
82b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - maptable = LENTABLE2 TABLETYPE1 (   bytemaptable
83b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                      | wordmaptable
84b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                      | graphinmaptable
85b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                      | bytetovarmaptable )
86b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - bytemaptable (in or out, usage varies) =  NRBYTES2   {BYTE1}=NRBYTES2
87b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - wordmaptable (in or out, usage varies) =  NRWORDS2   {WORD2}=NRWORDS2
88b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - graphinmaptable (in only)              =  NRGRAPHS2  {GRAPH1:4}=NRGRAPHS2
89b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - bytetovarmaptable (out only)           =  NRINBYTES2 outvarsearchind
90b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                              outvaroutputs
91b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - outvarsearchind = {OUTVAROFFSET2}=NRINBYTES2
92b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - outvaroutputs = {VARVALID1:}=NRINBYTES2
93b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
94b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - bytemaptable: fixed size, *Map*Fixed \n
95b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - wordmaptable: fixed size, *Map*Fixed \n
96b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - graphinmaptable: search value is variable size (UTF8 grapheme), \n
97b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                     value to be mapped to is fixed size, one byte \n
98b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - bytetovarmaptable: search value is fixed size, one byte, values \n
99b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       to be mapped to are of variable size (e.g. several \n
100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       phones) \n
101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - NRMAPTABLES1: one byte representing the number of map tables
103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - LENTABLE2: two bytes, equals offset to the next table (or next
104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               part of kb, e.g. tree),
105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               if LENTABLE2 = 3, and
106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               TABLETYPE1 = EMPTY -> empty table, no mapping to be done
107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - TABLETYPE1: one byte, type of map table (byte, word, or graph=utf8)
108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - NRBYTES2: two bytes, number of bytes following in the table (one
109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen              would be okay, to simplify some implementation also set
110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen              to 2)
111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - BYTE1: one btye, the sequence is used to determine the values
112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen           being mapped to, starting with 0
113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - NRWORDS2: two bytes, number of words (two btyes) following in the table
114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - WORD2: two bytes, the sequence is used to determine the values
115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen           being mapped to, starting with 0
116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - NRGRAPHS2: two bytes, number of graphemes encoded in UTF8 following
117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               in table
118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - GRAPH1:4: one to four bytes, UTF8 representation of a grapheme, the
119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen              sequence of graphemes is used to determine the value being
120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen              mapped to, starting with 0, the length information is
121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen              encoded in UTF8, no need for extra length info
122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - NRINBYTES2: two bytes, number of single byte IDs the tree can produce
123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - OUTVAROFFSET2: two bytes, offset from the start of the
124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   outvaroutputs to the start of the following output
125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   phone ID group, ie. the first outvaroffset is the
126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   offset to the start of the second PHONEID
127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   group. Using the previous outvaroffset (or the start
128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   of the outvaroutputs) the start and lenth of the
129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   PHONEID group can be determined and we can get the
130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   sequence of output values we map the chunk value to
131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - VARVALID1:: one to several bytes, one byte each for an output phone ID
132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - tree = treenodeinfos TREEBODYSIZE4 treebody
134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - treenodeinfos = NRVFIELDS1 vfields NRATTRIBUTES1 NRQFIELDS1 qfields
135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - vfields = {VFIELD1}=NRVFIELDS1
136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - qfields = {QFIELD1}=NRATTRIBUTES1xNRQFIELDS1
137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - treebody = "cf. code"
138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - TREEBODYSIZE4: four bytes, size of treebody in number of bytes
140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - NRVFIELDS1: one byte, number of node properties in the following
141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                vector (predefined and fixed sequence of properties)
142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - VFIELD1: number of bits used to represent a node property
143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - NRATTRIBUTES1: one byte, number of attributes (rows) in the
144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   following matrix
145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - NRQFIELDS1: one byte, number (columns) of question-dependent node
146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                properties per attribute in the following matrix
147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                (predefined and fixed sequence of properties)
148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - QFIELD1: number of bits used to represent a question-dependent
149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             property in the matrix
150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    - Currently,
153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        - NRVFIELDS1 is fixed at 2 for all trees, ie.
154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        - vfields = 2 aVFIELD1 bVFIELD1
155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        - aVFIELD1: nr of bits for questions
156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        - bVFIELD1: nr of bits for decisions
157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        - NRQFIELDS1 is fixed at 5 for all trees, ie. \n
159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        - qfields = NRATTRIBUTES1 5 aQFIELD1 bQFIELD1 cQFIELD1 dQFIELD1 eQFIELD1 \n
160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            - aQFIELD1: nr of bits for fork count \n
161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            - bQFIELD1: nr of bits for start position for subsets \n
162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            - cQFIELD1: nr of bits for group size \n
163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            - dQFIELD1: nr of bits for offset to reach output \n
164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            - eQFIELD1: nr of bits for threshold (if continuous node) \n
165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* decision tree data defines */
170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* may not be changed with current implementation */
171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* maptables fields */
174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOKDT_MTSPOS_NRMAPTABLES   0
175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* position of first byte of first maptable (for omt the only table */
177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOKDT_MTPOS_START          1
178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* maptable fields */
180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOKDT_MTPOS_LENTABLE       0
181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOKDT_MTPOS_TABLETYPE      2
182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOKDT_MTPOS_NUMBER         3
183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOKDT_MTPOS_MAPSTART       5
184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* treenodeinfos fields */
186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOKDT_NIPOS_NRVFIELDS      0
187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOKDT_NIPOS_NRATTS         3
188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOKDT_NIPOS_NRQFIELDS      4
189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* fixed treenodeinfos number of fields */
191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOKDT_NODEINFO_NRVFIELDS   2
192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOKDT_NODEINFO_NRQFIELDS   5
193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* fixed number of bits used */
195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOKDT_NODETYPE_NRBITS      2
196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOKDT_SUBSETTYPE_NRBITS    2
197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOKDT_ISDECIDE_NRBITS      1
198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* number of inpmaptables for each tree. Since we have a possibly
200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   empty input map table for each att, currently these values must be
201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   equal to PICOKDT_NRATT* */
202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef enum {
203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICOKDT_NRINPMT_POSP = 12,
204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICOKDT_NRINPMT_POSD =  7,
205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICOKDT_NRINPMT_G2P  = 16,
206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICOKDT_NRINPMT_PHR  =  8,
207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICOKDT_NRINPMT_ACC  = 13,
208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICOKDT_NRINPMT_PAM  = 60
209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} kdt_nrinpmaptables_t;
210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* number of outmaptables for each tree, at least one, possibly empty,
212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   output map table for each tree */
213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef enum {
214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICOKDT_NROUTMT_POSP =  1,
215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICOKDT_NROUTMT_POSD =  1,
216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICOKDT_NROUTMT_G2P  =  1,
217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICOKDT_NROUTMT_PHR  =  1,
218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICOKDT_NROUTMT_ACC  =  1,
219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICOKDT_NROUTMT_PAM  =  1
220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} kdt_nroutmaptables_t;
221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* maptable types */
223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef enum {
224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICOKDT_MTTYPE_EMPTY     = 0,
225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICOKDT_MTTYPE_BYTE      = 1,
226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICOKDT_MTTYPE_WORD      = 2,
227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICOKDT_MTTYPE_GRAPH     = 3,
228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICOKDT_MTTYPE_BYTETOVAR = 4
229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} kdt_mttype_t;
230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* decision tree types and loading */
234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*  object       : Dt*KnowledgeBase
236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *  shortcut     : kdt*
237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *  derived from : picoknow_KnowledgeBase
238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* subobj shared by all decision trees */
241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct {
242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picokdt_kdttype_t type;
243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 *inpmaptable;
244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 *outmaptable;
245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 *tree;
246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 beg_offset[128];  /* for efficiency */
247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* tree-internal details for faster processing */
249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 *vfields;
250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 *qfields;
251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8  nrattributes;
252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 *treebody;
253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*picoos_uint8  nrvfields;*/  /* fix PICOKDT_NODEINFO_NRVFIELDS */
254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*picoos_uint8  nrqfields;*/  /* fix PICOKDT_NODEINFO_NRQFIELDS */
255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* direct output vector (no output mapping) */
257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 dset;    /* TRUE if class set, FALSE otherwise */
258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 dclass;
259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} kdt_subobj_t;
260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* subobj specific for each decision tree type */
262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct {
263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t dt;
264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 invec[PICOKDT_NRATT_POSP];    /* input vector */
265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 inveclen;  /* nr of ele set in invec; must be =nrattributes */
266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} kdtposp_subobj_t;
267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct {
269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t dt;
270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 invec[PICOKDT_NRATT_POSD];    /* input vector */
271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 inveclen;  /* nr of ele set in invec; must be =nrattributes */
272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} kdtposd_subobj_t;
273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct {
275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t dt;
276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 invec[PICOKDT_NRATT_G2P];    /* input vector */
277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 inveclen;  /* nr of ele set in invec; must be =nrattributes */
278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} kdtg2p_subobj_t;
279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct {
281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t dt;
282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 invec[PICOKDT_NRATT_PHR];    /* input vector */
283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 inveclen;  /* nr of ele set in invec; must be =nrattributes */
284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} kdtphr_subobj_t;
285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct {
287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t dt;
288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 invec[PICOKDT_NRATT_ACC];    /* input vector */
289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 inveclen;  /* nr of ele set in invec; must be =nrattributes */
290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} kdtacc_subobj_t;
291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct {
293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t dt;
294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 invec[PICOKDT_NRATT_PAM];    /* input vector */
295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 inveclen;  /* nr of ele set in invec; must be =nrattributes */
296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} kdtpam_subobj_t;
297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kdtDtInitialize(register picoknow_KnowledgeBase this,
300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     picoos_Common common,
301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     kdt_subobj_t *dtp) {
302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 inppos;
303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 outpos;
304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 treepos;
305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 curpos = 0, pos;
306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 lentable;
307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i;
308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 imtnr;
309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("start"));
311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* get inmap, outmap, tree offsets */
313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((PICO_OK == picoos_read_mem_pi_uint16(this->base, &curpos, &inppos))
314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        && (PICO_OK == picoos_read_mem_pi_uint16(this->base, &curpos, &outpos))
315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        && (PICO_OK == picoos_read_mem_pi_uint16(this->base, &curpos,
316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                 &treepos))) {
317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* all pos are mandatory, verify */
319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (inppos && outpos && treepos) {
320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            dtp->inpmaptable = this->base + inppos;
321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            dtp->outmaptable = this->base + outpos;
322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            dtp->tree = this->base + treepos;
323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* precalc beg offset table */
324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            imtnr=dtp->inpmaptable[0];
325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            pos=1;
326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            dtp->beg_offset[0] = 1;
327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            for (i = 0; i < imtnr; i++) {
328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                lentable = ((picoos_uint16)(dtp->inpmaptable[pos+1])) << 8 |
329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    dtp->inpmaptable[pos];
330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                pos += lentable;
331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                dtp->beg_offset[i+1] = pos;
332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {
334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            dtp->inpmaptable = NULL;
335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            dtp->outmaptable = NULL;
336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            dtp->tree = NULL;
337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_ERROR(("invalid kb position info"));
338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picoos_emRaiseException(common->em, PICO_EXC_FILE_CORRUPT,
339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           NULL, NULL);
340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* nr of outmaptables is equal 1 for all trees, verify */
343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (dtp->outmaptable[PICOKDT_MTSPOS_NRMAPTABLES] != 1) {
344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_ERROR(("wrong number of outmaptables"));
345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picoos_emRaiseException(common->em, PICO_EXC_FILE_CORRUPT,
346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           NULL, NULL);
347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* check if this is an empty table, ie. len == 3 */
350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ((dtp->outmaptable[PICOKDT_MTPOS_START + PICOKDT_MTPOS_LENTABLE]
351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             == 3)
352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            && (dtp->outmaptable[PICOKDT_MTPOS_START + PICOKDT_MTPOS_LENTABLE
353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                 + 1] == 0)) {
354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* verify that this is supposed to be an empty table and
355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               set outmaptable to NULL if so */
356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (dtp->outmaptable[PICOKDT_MTPOS_START + PICOKDT_MTPOS_TABLETYPE]
357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                == PICOKDT_MTTYPE_EMPTY) {
358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                dtp->outmaptable = NULL;
359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_ERROR(("table length vs. type problem"));
361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return picoos_emRaiseException(common->em,
362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                               PICO_EXC_FILE_CORRUPT,
363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                               NULL, NULL);
364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtp->vfields = dtp->tree + 1;
368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtp->qfields = dtp->tree + PICOKDT_NODEINFO_NRVFIELDS + 3;
369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtp->nrattributes = dtp->tree[PICOKDT_NIPOS_NRATTS];
370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtp->treebody = dtp->qfields + 4 +
371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            (dtp->nrattributes * PICOKDT_NODEINFO_NRQFIELDS); /* TREEBODYSIZE4*/
372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /*dtp->nrvfields = dtp->tree[PICOKDT_NIPOS_NRVFIELDS]; <- is fix */
374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /*dtp->nrqfields = dtp->tree[PICOKDT_NIPOS_NRQFIELDS]; <- is fix */
375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* verify that nrvfields ad nrqfields are correct */
376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ((PICOKDT_NODEINFO_NRVFIELDS != dtp->tree[PICOKDT_NIPOS_NRVFIELDS]) ||
377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            (PICOKDT_NODEINFO_NRQFIELDS != dtp->tree[PICOKDT_NIPOS_NRQFIELDS])) {
378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_ERROR(("problem with nr of vfields (%d) or qfields (%d)",
379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           dtp->tree[PICOKDT_NIPOS_NRVFIELDS],
380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           dtp->tree[PICOKDT_NIPOS_NRQFIELDS]));
381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picoos_emRaiseException(common->em, PICO_EXC_FILE_CORRUPT,
382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           NULL, NULL);
383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtp->dset = 0;
385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtp->dclass = 0;
386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("tree init: nratt: %d, posomt: %d, postree: %d",
387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       dtp->nrattributes, (dtp->outmaptable - dtp->inpmaptable),
388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       (dtp->tree - dtp->inpmaptable)));
389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_OK;
390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("problem reading kb in memory"));
392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(common->em, PICO_EXC_FILE_CORRUPT,
393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       NULL, NULL);
394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kdtDtCheck(register picoknow_KnowledgeBase this,
399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                picoos_Common common,
400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                kdt_subobj_t *dtp,
401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                kdt_nratt_t nratt,
402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                kdt_nrinpmaptables_t nrinpmt,
403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                kdt_nroutmaptables_t nroutmt,
404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                kdt_mttype_t mttype) {
405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check nr attributes */
406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check nr inpmaptables */
407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check nr outmaptables */
408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check outmaptable is word type */
409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((nratt != dtp->nrattributes)
410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        || (dtp->inpmaptable == NULL)
411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        || (dtp->outmaptable == NULL)
412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        || (dtp->inpmaptable[PICOKDT_MTSPOS_NRMAPTABLES] != nrinpmt)
413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        || (dtp->outmaptable[PICOKDT_MTSPOS_NRMAPTABLES] != nroutmt)
414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        || (dtp->outmaptable[PICOKDT_MTPOS_START+PICOKDT_MTPOS_TABLETYPE]
415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            != mttype)) {
416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("check failed, nratt %d, nrimt %d, nromt %d, omttype %d",
417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       dtp->nrattributes,
418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       dtp->inpmaptable[PICOKDT_MTSPOS_NRMAPTABLES],
419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       dtp->outmaptable[PICOKDT_MTSPOS_NRMAPTABLES],
420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       dtp->outmaptable[PICOKDT_MTPOS_START +
421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        PICOKDT_MTPOS_TABLETYPE]));
422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(common->em, PICO_EXC_FILE_CORRUPT,
423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       NULL, NULL);
424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kdtPosPInitialize(register picoknow_KnowledgeBase this,
431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       picoos_Common common) {
432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t status;
433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtposp_subobj_t *dtposp;
434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t *dt;
435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i;
436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this || NULL == this->subObj) {
438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(common->em, PICO_EXC_KB_MISSING,
439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       NULL, NULL);
440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtposp = (kdtposp_subobj_t *)this->subObj;
442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt = &(dtposp->dt);
443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt->type = PICOKDT_KDTTYPE_POSP;
444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((status = kdtDtInitialize(this, common, dt)) != PICO_OK) {
445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return status;
446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((status = kdtDtCheck(this, common, dt, PICOKDT_NRATT_POSP,
448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                             PICOKDT_NRINPMT_POSP, PICOKDT_NROUTMT_POSP,
449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                             PICOKDT_MTTYPE_WORD)) != PICO_OK) {
450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return status;
451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* init specialized subobj part */
454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < PICOKDT_NRATT_POSP; i++) {
455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtposp->invec[i] = 0;
456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtposp->inveclen = 0;
458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("posp tree initialized"));
459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kdtPosDInitialize(register picoknow_KnowledgeBase this,
464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       picoos_Common common) {
465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t status;
466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtposd_subobj_t *dtposd;
467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t *dt;
468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i;
469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this || NULL == this->subObj) {
471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(common->em, PICO_EXC_KB_MISSING,
472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       NULL, NULL);
473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtposd = (kdtposd_subobj_t *)this->subObj;
475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt = &(dtposd->dt);
476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt->type = PICOKDT_KDTTYPE_POSD;
477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((status = kdtDtInitialize(this, common, dt)) != PICO_OK) {
478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return status;
479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((status = kdtDtCheck(this, common, dt, PICOKDT_NRATT_POSD,
481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                             PICOKDT_NRINPMT_POSD, PICOKDT_NROUTMT_POSD,
482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                             PICOKDT_MTTYPE_WORD)) != PICO_OK) {
483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return status;
484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* init spezialized subobj part */
487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < PICOKDT_NRATT_POSD; i++) {
488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtposd->invec[i] = 0;
489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtposd->inveclen = 0;
491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("posd tree initialized"));
492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kdtG2PInitialize(register picoknow_KnowledgeBase this,
497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                      picoos_Common common) {
498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t status;
499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtg2p_subobj_t *dtg2p;
500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t *dt;
501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i;
502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this || NULL == this->subObj) {
504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(common->em, PICO_EXC_KB_MISSING,
505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       NULL, NULL);
506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtg2p = (kdtg2p_subobj_t *)this->subObj;
508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt = &(dtg2p->dt);
509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt->type = PICOKDT_KDTTYPE_G2P;
510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((status = kdtDtInitialize(this, common, dt)) != PICO_OK) {
511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return status;
512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((status = kdtDtCheck(this, common, dt, PICOKDT_NRATT_G2P,
515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                             PICOKDT_NRINPMT_G2P, PICOKDT_NROUTMT_G2P,
516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                             PICOKDT_MTTYPE_BYTETOVAR)) != PICO_OK) {
517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return status;
518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* init spezialized subobj part */
521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < PICOKDT_NRATT_G2P; i++) {
522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtg2p->invec[i] = 0;
523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtg2p->inveclen = 0;
525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("g2p tree initialized"));
526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kdtPhrInitialize(register picoknow_KnowledgeBase this,
531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                      picoos_Common common) {
532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t status;
533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtphr_subobj_t *dtphr;
534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t *dt;
535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i;
536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this || NULL == this->subObj) {
538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(common->em, PICO_EXC_KB_MISSING,
539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       NULL, NULL);
540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtphr = (kdtphr_subobj_t *)this->subObj;
542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt = &(dtphr->dt);
543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt->type = PICOKDT_KDTTYPE_PHR;
544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((status = kdtDtInitialize(this, common,dt)) != PICO_OK) {
545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return status;
546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((status = kdtDtCheck(this, common, dt, PICOKDT_NRATT_PHR,
549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                             PICOKDT_NRINPMT_PHR, PICOKDT_NROUTMT_PHR,
550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                             PICOKDT_MTTYPE_WORD)) != PICO_OK) {
551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return status;
552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* init spezialized subobj part */
555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < PICOKDT_NRATT_PHR; i++) {
556b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtphr->invec[i] = 0;
557b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
558b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtphr->inveclen = 0;
559b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("phr tree initialized"));
560b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
561b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
562b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
563b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
564b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kdtAccInitialize(register picoknow_KnowledgeBase this,
565b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                      picoos_Common common) {
566b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t status;
567b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtacc_subobj_t *dtacc;
568b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t *dt;
569b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i;
570b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
571b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this || NULL == this->subObj) {
572b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(common->em, PICO_EXC_KB_MISSING,
573b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       NULL, NULL);
574b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
575b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtacc = (kdtacc_subobj_t *)this->subObj;
576b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt = &(dtacc->dt);
577b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt->type = PICOKDT_KDTTYPE_ACC;
578b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((status = kdtDtInitialize(this, common, dt)) != PICO_OK) {
579b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return status;
580b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
581b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
582b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((status = kdtDtCheck(this, common, dt, PICOKDT_NRATT_ACC,
583b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                             PICOKDT_NRINPMT_ACC, PICOKDT_NROUTMT_ACC,
584b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                             PICOKDT_MTTYPE_WORD)) != PICO_OK) {
585b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return status;
586b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
587b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
588b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* init spezialized subobj part */
589b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < PICOKDT_NRATT_ACC; i++) {
590b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtacc->invec[i] = 0;
591b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
592b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtacc->inveclen = 0;
593b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("acc tree initialized"));
594b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
595b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
596b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
597b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
598b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kdtPamInitialize(register picoknow_KnowledgeBase this,
599b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                      picoos_Common common) {
600b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t status;
601b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtpam_subobj_t *dtpam;
602b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t *dt;
603b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i;
604b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
605b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this || NULL == this->subObj) {
606b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(common->em, PICO_EXC_KB_MISSING,
607b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       NULL, NULL);
608b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
609b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtpam = (kdtpam_subobj_t *)this->subObj;
610b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt = &(dtpam->dt);
611b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt->type = PICOKDT_KDTTYPE_PAM;
612b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((status = kdtDtInitialize(this, common, dt)) != PICO_OK) {
613b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return status;
614b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
615b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
616b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((status = kdtDtCheck(this, common, dt, PICOKDT_NRATT_PAM,
617b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                             PICOKDT_NRINPMT_PAM, PICOKDT_NROUTMT_PAM,
618b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                             PICOKDT_MTTYPE_WORD)) != PICO_OK) {
619b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return status;
620b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
621b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
622b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* init spezialized subobj part */
623b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < PICOKDT_NRATT_PAM; i++) {
624b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtpam->invec[i] = 0;
625b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
626b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtpam->inveclen = 0;
627b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("pam tree initialized"));
628b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
629b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
630b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
631b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
632b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kdtSubObjDeallocate(register picoknow_KnowledgeBase this,
633b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         picoos_MemoryManager mm) {
634b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL != this) {
635b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocate(mm, (void *) &this->subObj);
636b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
637b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
638b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
639b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
640b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
641b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* we don't offer a specialized constructor for a *KnowledgeBase but
642b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * instead a "specializer" of an allready existing generic
643b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * picoknow_KnowledgeBase */
644b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
645b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picokdt_specializeDtKnowledgeBase(picoknow_KnowledgeBase this,
646b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                picoos_Common common,
647b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                const picokdt_kdttype_t kdttype) {
648b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t status;
649b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
650b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this) {
651b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(common->em, PICO_EXC_KB_MISSING,
652b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       NULL, NULL);
653b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
654b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->subDeallocate = kdtSubObjDeallocate;
655b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    switch (kdttype) {
656b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKDT_KDTTYPE_POSP:
657b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            this->subObj = picoos_allocate(common->mm,sizeof(kdtposp_subobj_t));
658b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (NULL == this->subObj) {
659b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return picoos_emRaiseException(common->em, PICO_EXC_OUT_OF_MEM,
660b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                               NULL, NULL);
661b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
662b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            status = kdtPosPInitialize(this, common);
663b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
664b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKDT_KDTTYPE_POSD:
665b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            this->subObj = picoos_allocate(common->mm,sizeof(kdtposd_subobj_t));
666b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (NULL == this->subObj) {
667b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return picoos_emRaiseException(common->em, PICO_EXC_OUT_OF_MEM,
668b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                               NULL, NULL);
669b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
670b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            status = kdtPosDInitialize(this, common);
671b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
672b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKDT_KDTTYPE_G2P:
673b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            this->subObj = picoos_allocate(common->mm,sizeof(kdtg2p_subobj_t));
674b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (NULL == this->subObj) {
675b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return picoos_emRaiseException(common->em, PICO_EXC_OUT_OF_MEM,
676b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                               NULL, NULL);
677b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
678b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            status = kdtG2PInitialize(this, common);
679b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
680b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKDT_KDTTYPE_PHR:
681b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            this->subObj = picoos_allocate(common->mm,sizeof(kdtphr_subobj_t));
682b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (NULL == this->subObj) {
683b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return picoos_emRaiseException(common->em, PICO_EXC_OUT_OF_MEM,
684b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                               NULL, NULL);
685b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
686b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            status = kdtPhrInitialize(this, common);
687b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
688b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKDT_KDTTYPE_ACC:
689b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            this->subObj = picoos_allocate(common->mm,sizeof(kdtacc_subobj_t));
690b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (NULL == this->subObj) {
691b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return picoos_emRaiseException(common->em, PICO_EXC_OUT_OF_MEM,
692b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                               NULL, NULL);
693b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
694b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            status = kdtAccInitialize(this, common);
695b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
696b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKDT_KDTTYPE_PAM:
697b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            this->subObj = picoos_allocate(common->mm,sizeof(kdtpam_subobj_t));
698b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (NULL == this->subObj) {
699b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return picoos_emRaiseException(common->em, PICO_EXC_OUT_OF_MEM,
700b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                               NULL, NULL);
701b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
702b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            status = kdtPamInitialize(this, common);
703b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
704b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        default:
705b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picoos_emRaiseException(common->em, PICO_ERR_OTHER,
706b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           NULL, NULL);
707b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
708b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
709b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (status != PICO_OK) {
710b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocate(common->mm, (void *) &this->subObj);
711b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(common->em, status, NULL, NULL);
712b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
713b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
714b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
715b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
716b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
717b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
718b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* decision tree getDt* */
719b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
720b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
721b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicokdt_DtPosP picokdt_getDtPosP(picoknow_KnowledgeBase this) {
722b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return ((NULL == this) ? NULL : ((picokdt_DtPosP) this->subObj));
723b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
724b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
725b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicokdt_DtPosD picokdt_getDtPosD(picoknow_KnowledgeBase this) {
726b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return ((NULL == this) ? NULL : ((picokdt_DtPosD) this->subObj));
727b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
728b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
729b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicokdt_DtG2P  picokdt_getDtG2P (picoknow_KnowledgeBase this) {
730b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return ((NULL == this) ? NULL : ((picokdt_DtG2P) this->subObj));
731b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
732b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
733b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicokdt_DtPHR  picokdt_getDtPHR (picoknow_KnowledgeBase this) {
734b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return ((NULL == this) ? NULL : ((picokdt_DtPHR) this->subObj));
735b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
736b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
737b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicokdt_DtACC  picokdt_getDtACC (picoknow_KnowledgeBase this) {
738b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return ((NULL == this) ? NULL : ((picokdt_DtACC) this->subObj));
739b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
740b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
741b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicokdt_DtPAM  picokdt_getDtPAM (picoknow_KnowledgeBase this) {
742b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return ((NULL == this) ? NULL : ((picokdt_DtPAM) this->subObj));
743b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
744b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
745b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
746b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
747b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
748b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* decision tree support functions, tree */
749b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
750b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
751b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
752b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef enum {
753b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    eQuestion  = 0,   /* index to #bits to identify question */
754b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    eDecide    = 1    /* index to #bits to identify decision */
755b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} kdt_vfields_ind_t;
756b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
757b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef enum {
758b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    eForkCount = 0,   /* index to #bits for number of forks */
759b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    eBitNo     = 1,   /* index to #bits for index of 1st element */
760b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    eBitCount  = 2,   /* index to #bits for size of the group */
761b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    eJump      = 3,   /* index to #bits for offset to reach output node */
762b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    eCut       = 4    /* for contin. node: #bits for threshold checked */
763b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} kdt_qfields_ind_t;
764b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
765b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef enum {
766b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    eNTerminal   = 0,
767b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    eNBinary     = 1,
768b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    eNContinuous = 2,
769b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    eNDiscrete   = 3
770b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} kdt_nodetypes_t;
771b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
772b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef enum {
773b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    eOneValue = 0,
774b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    eTwoValues = 1,
775b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    eWithoutBitMask = 2,
776b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    eBitMask = 3
777b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} kdt_subsettypes_t;
778b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
779b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
780b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* Name    :   kdt_jump
781b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Function:   maps the iJump offset to byte + bit coordinates
782b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Input   :   iJump   absolute bit offset (0..(nr-bytes-treebody)*8)
783b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Output  :   iByteNo the first byte containing the bits to extract
784b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       (0..(nr-bytes-treebody))
785b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               iBitNo  the first bit to be extracted (0..7)
786b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Returns :   void
787b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Notes   :   updates the iByteNo + iBitNo fields
788b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
789b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void kdt_jump(const picoos_uint32 iJump,
790b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                     picoos_uint32 *iByteNo,
791b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                     picoos_int8 *iBitNo) {
792b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 iByteSize;
793b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
794b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iByteSize = (iJump / 8 );
795b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *iBitNo = (iJump - (iByteSize * 8)) + (7 - *iBitNo);
796b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *iByteNo += iByteSize;
797b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (*iBitNo >= 8) {
798b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (*iByteNo)++;
799b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *iBitNo = 15 - *iBitNo;
800b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
801b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *iBitNo = 7 - *iBitNo;
802b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
803b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
804b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
805b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
806b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* replaced inline for speedup */
807b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* Name    :   kdtIsVal
808b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Function:   Returns the binary value of the bit pointed to by iByteNo, iBitNo
809b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Input   :   iByteNo ofsset to the byte containing the bits to extract
810b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       (0..sizeof(treebody))
811b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               iBitNo  ofsset to the first bit to be extracted (0..7)
812b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Returns :   0/1 depending on the bit pointed to
813b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
814b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*
815b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 kdtIsVal(register kdt_subobj_t *this,
816b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                             picoos_uint32 iByteNo,
817b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                             picoos_int8 iBitNo) {
818b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return ((this->treebody[iByteNo] & ((1)<<iBitNo)) > 0);
819b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
820b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
821b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
822b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
823b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* @todo : consider replacing inline for speedup */
824b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
825b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* Name    :   kdtGetQFieldsVal (was: m_QuestDependentFields)
826b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Function:   gets a byte from qfields
827b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Input   :   this      handle to a dt subobj
828b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               attind    index of the attribute
829b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               qind      index of the byte to be read
830b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Returns :   the requested byte
831b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Notes   :   check that attind < this->nrattributes needed before calling
832b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               this function!
833b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
834b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 kdtGetQFieldsVal(register kdt_subobj_t *this,
835b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     const picoos_uint8 attind,
836b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     const kdt_qfields_ind_t qind) {
837b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check of qind done in initialize and (for some compilers) with typing */
838b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check of attind needed before calling this function */
839b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return this->qfields[(attind * PICOKDT_NODEINFO_NRQFIELDS) + qind];
840b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
841b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
842b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
843b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* Name    :   kdtGetShiftVal (was: get_shift_value)
844b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Function:   returns the (treebody) value pointed to by iByteNo, iBitNo,
845b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               and with size iSize
846b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Input   :   this    reference to the processing unit struct
847b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               iSize   number of bits to be extracted (0..N)
848b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               iByteNo ofsset to the byte containing the bits to extract
849b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       (0..sizeof(treebody))
850b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               iBitNo  ofsset to the first bit to be extracted (0..7)
851b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Returns :   the value requested (if size==0 --> 0 is returned)
852b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
853b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*
854b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint32 orig_kdtGetShiftVal(register kdt_subobj_t *this,
855b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    const picoos_int16 iSize,
856b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    picoos_uint32 *iByteNo,
857b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    picoos_int8 *iBitNo) {
858b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 iVal;
859b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int16 i;
860b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
861b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iVal = 0;
862b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = iSize-1; i >= 0; i--) {
863b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ( (this->treebody[*iByteNo] & ((1)<<(*iBitNo))) > 0) {
864b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            iVal |= ( (1) << i );
865b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
866b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (*iBitNo)--;
867b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (*iBitNo < 0) {
868b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            *iBitNo = 7;
869b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            (*iByteNo)++;
870b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
871b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
872b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return iVal;
873b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
874b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
875b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* refactor */
876b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint32 kdtGetShiftVal(register kdt_subobj_t *this,
877b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_int16 iSize, picoos_uint32 *iByteNo, picoos_int8 *iBitNo)
878b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
879b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 v, b, iVal;
880b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int16 i, j, len;
881b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 val;
882b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
883b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (iSize < 4) {
884b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        iVal = 0;
885b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        for (i = iSize - 1; i >= 0; i--) {
886b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* no check that *iByteNo is within valid treebody range */
887b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if ((this->treebody[*iByteNo] & ((1) << (*iBitNo))) > 0) {
888b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                iVal |= ((1) << i);
889b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
890b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            (*iBitNo)--;
891b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (*iBitNo < 0) {
892b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                *iBitNo = 7;
893b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                (*iByteNo)++;
894b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
895b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
896b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return iVal;
897b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
898b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
899b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    b = *iByteNo;
900b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    j = *iBitNo;
901b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    len = iSize;
902b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *iBitNo = j - iSize;
903b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    v = 0;
904b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while (*iBitNo < 0) {
905b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *iBitNo += 8;
906b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (*iByteNo)++;
907b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
908b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
909b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    val = this->treebody[b++];
910b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (j < 7) {
911b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        switch (j) {
912b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 0:
913b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                val &= 0x01;
914b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
915b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1:
916b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                val &= 0x03;
917b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
918b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 2:
919b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                val &= 0x07;
920b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
921b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 3:
922b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                val &= 0x0f;
923b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
924b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 4:
925b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                val &= 0x1f;
926b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
927b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 5:
928b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                val &= 0x3f;
929b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
930b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 6:
931b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                val &= 0x7f;
932b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
933b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
934b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
935b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    len -= j + 1;
936b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (len < 0) {
937b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        val >>= -len;
938b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
939b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    v = val;
940b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while (len > 0) {
941b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (len >= 8) {
942b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            j = 8;
943b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {
944b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            j = len;
945b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
946b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        v <<= j;
947b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        val = this->treebody[b++];
948b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (j < 8) {
949b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            switch (j) {
950b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                case 1:
951b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    val &= 0x80;
952b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    val >>= 7;
953b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    break;
954b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                case 2:
955b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    val &= 0xc0;
956b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    val >>= 6;
957b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    break;
958b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                case 3:
959b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    val &= 0xe0;
960b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    val >>= 5;
961b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    break;
962b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                case 4:
963b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    val &= 0xf0;
964b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    val >>= 4;
965b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    break;
966b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                case 5:
967b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    val &= 0xf8;
968b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    val >>= 3;
969b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    break;
970b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                case 6:
971b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    val &= 0xfc;
972b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    val >>= 2;
973b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    break;
974b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                case 7:
975b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    val &= 0xfe;
976b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    val >>= 1;
977b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    break;
978b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
979b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
980b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        v |= val;
981b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        len -= j;
982b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
983b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return v;
984b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
985b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
986b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
987b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* Name    :   kdtAskTree
988b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Function:   Tree Traversal routine
989b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Input   :   iByteNo ofsset to the first byte containing the bits
990b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               to extract (0..sizeof(treebody))
991b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               iBitNo  ofsset to the first bit to be extracted (0..7)
992b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Returns :   >0    continue, no solution yet found
993b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               =0    solution found
994b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               <0    error, no solution found
995b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   Notes   :
996b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
997b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_int8 kdtAskTree(register kdt_subobj_t *this,
998b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                              picoos_uint16 *invec,
999b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                              const kdt_nratt_t invecmax,
1000b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                              picoos_uint32 *iByteNo,
1001b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                              picoos_int8 *iBitNo) {
1002b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 iNodeType;
1003b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 iQuestion;
1004b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 iVal;
1005b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 iForks;
1006b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 iID;
1007b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1008b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 iCut, iSubsetType, iBitPos, iBitCount, iPos, iJump, iDecision;
1009b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 i;
1010b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_char iIsDecide;
1011b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1012b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("start"));
1013b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1014b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* get node type, value should be in kdt_nodetype_t range */
1015b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iNodeType = kdtGetShiftVal(this, PICOKDT_NODETYPE_NRBITS, iByteNo, iBitNo);
1016b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("iNodeType: %d", iNodeType));
1017b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1018b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* get attribute to be used in question, check if in range, and get val */
1019b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check of vfields argument done in initialize */
1020b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iQuestion = kdtGetShiftVal(this, this->vfields[eQuestion], iByteNo, iBitNo);
1021b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((iQuestion < this->nrattributes) && (iQuestion < invecmax)) {
1022b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        iVal = invec[iQuestion];
1023b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
1024b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->dset = FALSE;
1025b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("invalid question"));
1026b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return -1;    /* iQuestion invalid */
1027b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1028b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iForks = 0;
1029b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iID = -1;
1030b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("iQuestion: %d", iQuestion));
1031b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1032b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    switch (iNodeType) {
1033b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case eNBinary: {
1034b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            iForks = 2;
1035b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            iID = iVal;
1036b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
1037b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1038b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case eNContinuous: {
1039b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            iForks = 2;
1040b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            iID = 1;
1041b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            iCut = kdtGetShiftVal(this, kdtGetQFieldsVal(this, iQuestion, eCut),
1042b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  iByteNo, iBitNo); /*read the threshold*/
1043b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (iVal <= iCut) {
1044b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                iID = 0;
1045b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1046b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
1047b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1048b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case eNDiscrete: {
1049b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            iForks =
1050b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                kdtGetShiftVal(this,
1051b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                               kdtGetQFieldsVal(this, iQuestion, eForkCount),
1052b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                               iByteNo, iBitNo);
1053b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1054b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            for (i = 0; i < iForks-1; i++) {
1055b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                iSubsetType =
1056b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    kdtGetShiftVal(this, PICOKDT_SUBSETTYPE_NRBITS,
1057b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   iByteNo, iBitNo);
1058b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1059b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                switch (iSubsetType) {
1060b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    case eOneValue: {
1061b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if (iID > -1) {
1062b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            kdt_jump(kdtGetQFieldsVal(this, iQuestion, eBitNo),
1063b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     iByteNo, iBitNo);
1064b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            break;
1065b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1066b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        iBitPos =
1067b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            kdtGetShiftVal(this,
1068b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           kdtGetQFieldsVal(this, iQuestion,
1069b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                            eBitNo),
1070b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           iByteNo, iBitNo);
1071b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if (iVal == iBitPos) {
1072b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            iID = i;
1073b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1074b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        break;
1075b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1076b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    case eTwoValues: {
1077b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if (iID > -1) {
1078b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            kdt_jump((kdtGetQFieldsVal(this, iQuestion, eBitNo) +
1079b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                      kdtGetQFieldsVal(this, iQuestion, eBitCount)),
1080b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     iByteNo, iBitNo);
1081b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            break;
1082b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1083b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1084b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        iBitPos =
1085b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            kdtGetShiftVal(this, kdtGetQFieldsVal(this, iQuestion,
1086b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                                  eBitNo),
1087b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           iByteNo, iBitNo);
1088b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        iBitCount =
1089b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            kdtGetShiftVal(this, kdtGetQFieldsVal(this, iQuestion,
1090b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                                  eBitCount),
1091b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           iByteNo, iBitNo);
1092b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if ((iVal == iBitPos) || (iVal == iBitCount)) {
1093b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            iID = i;
1094b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1095b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        break;
1096b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1097b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    case eWithoutBitMask: {
1098b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if (iID > -1) {
1099b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            kdt_jump((kdtGetQFieldsVal(this, iQuestion, eBitNo) +
1100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                      kdtGetQFieldsVal(this, iQuestion, eBitCount)),
1101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     iByteNo, iBitNo);
1102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            break;
1103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        iBitPos =
1106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            kdtGetShiftVal(this, kdtGetQFieldsVal(this, iQuestion,
1107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                                  eBitNo),
1108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           iByteNo, iBitNo);
1109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        iBitCount =
1110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            kdtGetShiftVal(this, kdtGetQFieldsVal(this, iQuestion,
1111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                                  eBitCount),
1112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           iByteNo, iBitNo);
1113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if ((iVal >= iBitPos) && (iVal < (iBitPos + iBitCount))) {
1114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            iID = i;
1115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        break;
1117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    case eBitMask: {
1119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        iBitPos = 0;
1120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if (iID > -1) {
1121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            kdt_jump(kdtGetQFieldsVal(this, iQuestion, eBitNo),
1122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     iByteNo, iBitNo);
1123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        } else {
1124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            iBitPos =
1125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                kdtGetShiftVal(this,
1126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                               kdtGetQFieldsVal(this, iQuestion,
1127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                                eBitNo),
1128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                               iByteNo, iBitNo);
1129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        iBitCount =
1132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            kdtGetShiftVal(this,
1133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           kdtGetQFieldsVal(this, iQuestion,
1134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                            eBitCount),
1135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           iByteNo, iBitNo);
1136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if (iID > -1) {
1137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            kdt_jump(iBitCount, iByteNo, iBitNo);
1138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            break;
1139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if ((iVal >= iBitPos) && (iVal < (iBitPos + iBitCount))) {
1142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            iPos = iVal - iBitPos;
1143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            kdt_jump((iVal - iBitPos), iByteNo, iBitNo);
1144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                         /* if (kdtIsVal(this, *iByteNo, *iBitNo))*/
1145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            if ((this->treebody[*iByteNo] & ((1)<<(*iBitNo))) > 0) {
1146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                iID = i;
1147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            }
1148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            kdt_jump((iBitCount - (iVal-iBitPos)), iByteNo, iBitNo);
1149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        } else {
1150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            kdt_jump(iBitCount, iByteNo, iBitNo);
1151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        break;
1153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }/*end case eBitMask*/
1154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }/*end switch (iSubsetType)*/
1155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }/*end for ( i = 0; i < iForks-1; i++ ) */
1156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /*default tree branch*/
1158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (-1 == iID) {
1159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                iID = iForks-1;
1160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
1162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }/*end case eNDiscrete*/
1163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }/*end switch (iNodeType)*/
1164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < iForks; i++) {
1166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        iIsDecide = kdtGetShiftVal(this, PICOKDT_ISDECIDE_NRBITS, iByteNo, iBitNo);
1167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("doing forks: %d", i));
1169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (!iIsDecide) {
1171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (iID == i) {
1172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                iJump =
1173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    kdtGetShiftVal(this, kdtGetQFieldsVal(this, iQuestion, eJump),
1174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   iByteNo, iBitNo);
1175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                kdt_jump(iJump, iByteNo, iBitNo);
1176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                this->dset = FALSE;
1177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return 1;    /* to be continued, no solution yet found */
1178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
1179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                kdt_jump(kdtGetQFieldsVal(this, iQuestion, eJump),
1180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                         iByteNo, iBitNo);
1181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {
1183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (iID == i) {
1184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* check of vfields argument done in initialize */
1185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                iDecision = kdtGetShiftVal(this, this->vfields[eDecide],
1186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           iByteNo, iBitNo);
1187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                this->dclass = iDecision;
1188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                this->dset = TRUE;
1189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return 0;    /* solution found */
1190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
1191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* check of vfields argument done in initialize */
1192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                kdt_jump(this->vfields[eDecide], iByteNo, iBitNo);
1193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }/*end if (!iIsDecide)*/
1195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }/*end for (i = 0; i < iForks; i++ )*/
1196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->dset = FALSE;
1198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("problem determining class"));
1199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return -1; /* solution not found, problem determining a class */
1200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
1205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* decision tree support functions, mappings */
1206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
1207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* size==1 -> MapInByte, size==2 -> MapInWord,
1210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   size determined from table type contained in kb.
1211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   if the inmaptable is empty, outval = inval */
1212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 kdtMapInFixed(const kdt_subobj_t *dt,
1214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  const picoos_uint8 imtnr,
1215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  const picoos_uint16 inval,
1216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  picoos_uint16 *outval,
1217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  picoos_uint16 *outfallbackval) {
1218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 size;
1219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 pos;
1220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 lentable;
1221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 posbound;
1222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i;
1223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *outval = 0;
1225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *outfallbackval = 0;
1226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    size = 0;
1228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos = 0;
1229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check what can be checked */
1231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (imtnr >= dt->inpmaptable[pos++]) {   /* outside tablenr range? */
1232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("check failed: nrtab: %d, imtnr: %d",
1233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       dt->inpmaptable[pos-1], imtnr));
1234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* go forward to the needed tablenr */
1238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (imtnr > 0) {
1239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        pos = dt->beg_offset[imtnr];
1240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* get length */
1243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    lentable = ((picoos_uint16)(dt->inpmaptable[pos+1])) << 8 |
1244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dt->inpmaptable[pos];
1245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    posbound = pos + lentable;
1246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos += 2;
1247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check type of table and set size */
1249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (dt->inpmaptable[pos] == PICOKDT_MTTYPE_EMPTY) {
1250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* empty table no mapping needed */
1251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("empty table: %d", imtnr));
1252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *outval = inval;
1253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return TRUE;
1254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if (dt->inpmaptable[pos] == PICOKDT_MTTYPE_BYTE) {
1255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        size = 1;
1256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if (dt->inpmaptable[pos] == PICOKDT_MTTYPE_WORD) {
1257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        size = 2;
1258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
1259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* wrong table type */
1260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("wrong table type %d", dt->inpmaptable[pos]));
1261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos++;
1264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* set fallback value in case of failed mapping, and set upper bound pos */
1266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *outfallbackval = ((picoos_uint16)(dt->inpmaptable[pos+1])) << 8 |
1267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dt->inpmaptable[pos];
1268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos += 2;
1269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* size must be 1 or 2 here, keep 'redundant' so save time */
1271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (size == 1) {
1272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        for (i = 0; (i < *outfallbackval) && (pos < posbound); i++) {
1273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (inval == dt->inpmaptable[pos]) {
1274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                *outval = i;
1275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_TRACE(("s1 %d in %d -> out %d", imtnr, inval, *outval));
1276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return TRUE;
1277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            pos++;
1279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if (size == 2) {
1281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        posbound--;
1282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        for (i = 0; (i < *outfallbackval) && (pos < posbound); i++) {
1283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (inval == (((picoos_uint16)(dt->inpmaptable[pos+1])) << 8 |
1284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                          dt->inpmaptable[pos])) {
1285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                *outval = i;
1286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_TRACE(("s2 %d in %d -> out %d", imtnr, inval, *outval));
1287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return TRUE;
1288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            pos += 2;
1290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
1292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* impossible size */
1293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("wrong size %d", size));
1294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("no mapping found, fallback: %d", *outfallbackval));
1298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return FALSE;
1299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 kdtMapInGraph(const kdt_subobj_t *dt,
1303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  const picoos_uint8 imtnr,
1304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  const picoos_uint8 *inval,
1305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  const picoos_uint8 invalmaxlen,
1306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  picoos_uint16 *outval,
1307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  picoos_uint16 *outfallbackval) {
1308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 ilen;
1309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 tlen;
1310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 cont;
1311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 pos;
1312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 lentable;
1313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 posbound;
1314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i;
1315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 j;
1316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *outfallbackval = 0;
1318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos = 0;
1320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check what can be checked */
1321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((imtnr >= dt->inpmaptable[pos++]) ||     /* outside tablenr range? */
1322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (invalmaxlen == 0) ||                    /* too short? */
1323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        ((ilen = picobase_det_utf8_length(inval[0])) == 0) ||   /* invalid? */
1324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (ilen > invalmaxlen)) {                  /* not accessible? */
1325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("check failed: nrtab: %d, imtnr: %d, invalmaxlen: %d, "
1326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       "ilen: %d",
1327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       dt->inpmaptable[pos-1], imtnr, invalmaxlen, ilen));
1328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* go forward to the needed tablenr */
1332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < imtnr; i++) {
1333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        lentable = ((picoos_uint16)(dt->inpmaptable[pos+1])) << 8 |
1334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            dt->inpmaptable[pos];
1335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        pos += lentable;
1336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* get length and check type of inpmaptable */
1339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    lentable = ((picoos_uint16)(dt->inpmaptable[pos+1])) << 8 |
1340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dt->inpmaptable[pos];
1341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    posbound = pos + lentable;
1342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos += 2;
1343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if defined(PICO_DEBUG)
1345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (1) {
1346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        int id;
1347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("imtnr %d", imtnr));
1348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        for (id = pos-2; id < posbound; id++) {
1349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_TRACE(("imtbyte pos %d, %c %d", id - (pos-2),
1350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           dt->inpmaptable[id], dt->inpmaptable[id]));
1351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
1354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check type of table */
1356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (dt->inpmaptable[pos] != PICOKDT_MTTYPE_GRAPH) {
1357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* empty table does not make sense for graph */
1358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* wrong table type */
1359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("wrong table type"));
1360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos++;
1363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* set fallback value in case of failed mapping, and set upper bound pos */
1365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *outfallbackval = ((picoos_uint16)(dt->inpmaptable[pos+1])) << 8 |
1366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dt->inpmaptable[pos];
1367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos += 2;
1368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* sequential search */
1370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; (i < *outfallbackval) && (pos < posbound); i++) {
1371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        tlen = picobase_det_utf8_length(dt->inpmaptable[pos]);
1372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ((pos + tlen) > posbound) {
1373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_ERROR(("trying outside imt, posb: %d, pos: %d, tlen: %d",
1374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           posbound, pos, tlen));
1375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return FALSE;
1376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (ilen == tlen) {
1378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            cont = TRUE;
1379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            for (j = 0; cont && (j < ilen); j++) {
1380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (dt->inpmaptable[pos + j] != inval[j]) {
1381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    cont = FALSE;
1382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (cont && (j == ilen)) {    /* match found */
1385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                *outval = i;
1386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_TRACE(("found mapval, posb %d, pos %d, i %d, tlen %d",
1387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                               posbound, pos, i, tlen));
1388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return TRUE;
1389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        pos += tlen;
1392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("outside imt %d, posb/pos/i: %d/%d/%d, fallback: %d",
1394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   imtnr, posbound, pos, i, *outfallbackval));
1395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return FALSE;
1396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* size==1 -> MapOutByte,    size==2 -> MapOutWord */
1400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 kdtMapOutFixed(const kdt_subobj_t *dt,
1401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   const picoos_uint16 inval,
1402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   picoos_uint16 *outval) {
1403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 size;
1404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 nr;
1405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* no check of lentable vs. nr in initialize done */
1407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    size = 0;
1409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* type */
1411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nr = dt->outmaptable[PICOKDT_MTPOS_START + PICOKDT_MTPOS_TABLETYPE];
1412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check type of table and set size */
1414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (nr == PICOKDT_MTTYPE_EMPTY) {
1415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* empty table no mapping needed */
1416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("empty table"));
1417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *outval = inval;
1418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return TRUE;
1419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if (nr == PICOKDT_MTTYPE_BYTE) {
1420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        size = 1;
1421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if (nr == PICOKDT_MTTYPE_WORD) {
1422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        size = 2;
1423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
1424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* wrong table type */
1425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("wrong table type %d", nr));
1426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* number of mapvalues */
1430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nr = ((picoos_uint16)(dt->outmaptable[PICOKDT_MTPOS_START +
1431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          PICOKDT_MTPOS_NUMBER + 1])) << 8
1432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        | dt->outmaptable[PICOKDT_MTPOS_START + PICOKDT_MTPOS_NUMBER];
1433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (inval < nr) {
1435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (size == 1) {
1436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            *outval = dt->outmaptable[PICOKDT_MTPOS_START +
1437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                      PICOKDT_MTPOS_MAPSTART + (size * inval)];
1438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {
1439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            *outval = ((picoos_uint16)(dt->outmaptable[PICOKDT_MTPOS_START +
1440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                          PICOKDT_MTPOS_MAPSTART + (size * inval) + 1])) << 8
1441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     | dt->outmaptable[PICOKDT_MTPOS_START +
1442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                          PICOKDT_MTPOS_MAPSTART + (size * inval)];
1443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return TRUE;
1445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
1446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *outval = 0;
1447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* size==1 -> ReverseMapOutByte,    size==2 -> ReverseMapOutWord */
1453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* outmaptable also used to map from decoded tree output domain to
1454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   direct tree output domain */
1455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 kdtReverseMapOutFixed(const kdt_subobj_t *dt,
1456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          const picoos_uint16 inval,
1457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          picoos_uint16 *outval,
1458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          picoos_uint16 *outfallbackval) {
1459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 size;
1460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 pos;
1461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 lentable;
1462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 posbound;
1463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i;
1464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* no check of lentable vs. nr in initialize done */
1466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    size = 0;
1468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos = 0;
1469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *outval = 0;
1470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *outfallbackval = 0;
1471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (dt->outmaptable == NULL) {
1473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* empty table no mapping needed */
1474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("empty table"));
1475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *outval = inval;
1476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return TRUE;
1477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check what can be checked */
1480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (dt->outmaptable[pos++] != 1) {   /* only one omt possible */
1481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("check failed: nrtab: %d", dt->outmaptable[pos-1]));
1482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* get length */
1486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    lentable = ((picoos_uint16)(dt->outmaptable[pos+1])) << 8 |
1487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dt->outmaptable[pos];
1488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    posbound = pos + lentable;
1489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos += 2;
1490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check type of table and set size */
1492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* if (dt->outmaptable[pos] == PICOKDT_MTTYPE_EMPTY), in
1493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen       ...Initialize the omt is set to NULL if not existing, checked
1494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen       above */
1495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (dt->outmaptable[pos] == PICOKDT_MTTYPE_BYTE) {
1497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        size = 1;
1498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if (dt->outmaptable[pos] == PICOKDT_MTTYPE_WORD) {
1499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        size = 2;
1500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
1501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* wrong table type */
1502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("wrong table type %d", dt->outmaptable[pos]));
1503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos++;
1506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* set fallback value in case of failed mapping, and set upper bound pos */
1508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *outfallbackval = ((picoos_uint16)(dt->outmaptable[pos+1])) << 8 |
1509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dt->outmaptable[pos];
1510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos += 2;
1511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* size must be 1 or 2 here, keep 'redundant' so save time */
1513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (size == 1) {
1514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        for (i = 0; (i < *outfallbackval) && (pos < posbound); i++) {
1515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (inval == dt->outmaptable[pos]) {
1516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                *outval = i;
1517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_TRACE(("s1 inval %d -> outval %d", inval, *outval));
1518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return TRUE;
1519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            pos++;
1521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if (size == 2) {
1523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        posbound--;
1524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        for (i = 0; (i < *outfallbackval) && (pos < posbound); i++) {
1525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (inval == (((picoos_uint16)(dt->outmaptable[pos+1])) << 8 |
1526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                          dt->outmaptable[pos])) {
1527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                *outval = i;
1528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_TRACE(("s2 inval %d -> outval %d", inval, *outval));
1529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return TRUE;
1530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            pos += 2;
1532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
1534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* impossible size */
1535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("wrong size %d", size));
1536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("no mapping found, fallback: %d", *outfallbackval));
1540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return FALSE;
1541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtPosDreverseMapOutFixed(const picokdt_DtPosD this,
1545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          const picoos_uint16 inval,
1546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          picoos_uint16 *outval,
1547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          picoos_uint16 *outfallbackval) {
1548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtposd_subobj_t * dtposd = (kdtposd_subobj_t *)this;
1550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t * dt = &(dtposd->dt);
1551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return kdtReverseMapOutFixed(dt,inval, outval, outfallbackval);
1552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* not yet impl. size==1 -> MapOutByteToVar,
1555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   fix:  size==2 -> MapOutWordToVar */
1556b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 kdtMapOutVar(const kdt_subobj_t *dt,
1557b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                 const picoos_uint16 inval,
1558b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                 picoos_uint8 *nr,
1559b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                 picoos_uint16 *outval,
1560b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                 const picoos_uint16 outvalmaxlen) {
1561b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 pos;
1562b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 off2ind;
1563b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 lentable;
1564b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 nrinbytes;
1565b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 size;
1566b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 offset1;
1567b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i;
1568b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1569b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (dt->outmaptable == NULL) {
1570b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* empty table not possible */
1571b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("no table found"));
1572b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1573b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1574b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1575b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* nr of tables == 1 already checked in *Initialize, no need here, go
1576b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen       directly to position 1 */
1577b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos = 1;
1578b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1579b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* get length of table */
1580b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    lentable = (((picoos_uint16)(dt->outmaptable[pos + 1])) << 8 |
1581b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                dt->outmaptable[pos]);
1582b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos += 2;
1583b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1584b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check table type */
1585b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (dt->outmaptable[pos] != PICOKDT_MTTYPE_BYTETOVAR) {
1586b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* wrong table type */
1587b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("wrong table type %d", dt->outmaptable[pos]));
1588b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1589b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1590b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    size = 2;
1591b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos++;
1592b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1593b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* get nr of ele in maptable (= nr of possible invals) */
1594b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nrinbytes = (((picoos_uint16)(dt->outmaptable[pos+1])) << 8 |
1595b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                 dt->outmaptable[pos]);
1596b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos += 2;
1597b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1598b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check what's checkable */
1599b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (nrinbytes == 0) {
1600b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("table with length zero"));
1601b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1602b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if (inval >= nrinbytes) {
1603b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("inval %d outside valid range %d", inval, nrinbytes));
1604b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1605b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1606b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1607b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("inval %d, lentable %d, nrinbytes %d, pos %d", inval,
1608b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   lentable, nrinbytes, pos));
1609b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1610b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* set off2ind to the position of the start of offset2-val */
1611b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* offset2 points to start of next ele */
1612b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    off2ind = pos + (size*inval);
1613b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1614b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* get number of output values, offset2 - offset1 */
1615b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (inval == 0) {
1616b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        offset1 = 0;
1617b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
1618b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        offset1 = (((picoos_uint16)(dt->outmaptable[off2ind - 1])) << 8 |
1619b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dt->outmaptable[off2ind - 2]);
1620b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1621b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *nr = (((picoos_uint16)(dt->outmaptable[off2ind + 1])) << 8 |
1622b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen           dt->outmaptable[off2ind]) - offset1;
1623b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1624b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("offset1 %d, nr %d, pos %d", offset1, *nr, pos));
1625b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1626b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* set pos to position of 1st value being mapped to */
1627b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos += (size * nrinbytes) + offset1;
1628b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1629b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((pos + *nr - 1) > lentable) {
1630b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* outside table, should not happen */
1631b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("problem with table index, pos %d, nr %d, len %d",
1632b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       pos, *nr, lentable));
1633b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1634b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1635b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (*nr > outvalmaxlen) {
1636b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* not enough space in outval */
1637b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("overflow in outval, %d > %d", *nr, outvalmaxlen));
1638b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1639b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1640b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1641b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* finally, copy outmap result to outval */
1642b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < *nr; i++) {
1643b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        outval[i] = dt->outmaptable[pos++];
1644b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1645b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return TRUE;
1646b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1647b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1648b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1649b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1650b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
1651b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* decision tree POS prediction (PosP) functions */
1652b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
1653b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1654b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* number of prefix and suffix graphemes used to construct the input vector */
1655b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define KDT_POSP_NRGRAPHPREFATT   4
1656b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define KDT_POSP_NRGRAPHSUFFATT   6
1657b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define KDT_POSP_NRGRAPHATT      10
1658b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1659b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* positions of specgraph and nrgraphs attributes */
1660b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define KDT_POSP_SPECGRAPHATTPOS 10
1661b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define KDT_POSP_NRGRAPHSATTPOS  11
1662b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1663b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1664b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* construct PosP input vector
1665b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1666b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   PosP invec: 12 elements
1667b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1668b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   prefix        0-3  prefix graphemes (encoded using tree inpmaptable 0-3)
1669b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   suffix        4-9  suffix graphemes (encoded using tree inpmaptable 4-9)
1670b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   isspecchar    10   is a special grapheme (e.g. hyphen) inside the word (0/1)?
1671b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   nr-utf-graphs 11   number of graphemes (ie. UTF8 chars)
1672b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1673b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   if there are less than 10 graphemes, each grapheme is used only
1674b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   once, with the suffix having higher priority, ie.  elements 0-9 are
1675b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   filled as follows:
1676b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1677b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    #graph
1678b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    1        0 0 0 0  0 0 0 0 0 1
1679b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    2        0 0 0 0  0 0 0 0 1 2
1680b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    3        0 0 0 0  0 0 0 1 2 3
1681b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    4        0 0 0 0  0 0 1 2 3 4
1682b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    5        0 0 0 0  0 1 2 3 4 5
1683b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    6        0 0 0 0  1 2 3 4 5 6
1684b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    7        1 0 0 0  2 3 4 5 6 7
1685b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    8        1 2 0 0  3 4 5 6 7 8
1686b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    9        1 2 3 0  4 5 6 7 8 9
1687b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    10       1 2 3 4  5 6 7 8 9 10
1688b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    11       1 2 3 4  6 7 8 9 10 11
1689b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    ...
1690b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1691b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    1-6: Fill chbuf
1692b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    7-10: front to invec 1st part, remove front, add rear
1693b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    >10: remove front, add rear
1694b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    no more graph ->
1695b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while chbuflen>0:
1696b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen      add rear to the last empty slot in 2nd part of invec, remove rear
1697b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
1698b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1699b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1700b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtPosPconstructInVec(const picokdt_DtPosP this,
1701b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          const picoos_uint8 *graph,
1702b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          const picoos_uint16 graphlen,
1703b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          const picoos_uint8 specgraphflag) {
1704b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtposp_subobj_t *dtposp;
1705b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1706b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* utf8 circular char buffer, used as restricted input deque */
1707b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* 2nd part of graph invec has KDT_POSP_NRGRAPHSUFFATT elements, */
1708b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* max of UTF8_MAXLEN bytes per utf8 char */
1709b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 chbuf[KDT_POSP_NRGRAPHSUFFATT][PICOBASE_UTF8_MAXLEN];
1710b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 chbrear;   /* next free pos */
1711b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 chbfront;  /* next read pos */
1712b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 chblen;    /* empty=0; full=KDT_POSP_NRGRAPHSUFFATT */
1713b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1714b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 poscg;    /* position of current graph (= utf8 char) */
1715b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 lencg = 0;    /* length of current grapheme */
1716b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 nrutfg;   /* number of utf graphemes */
1717b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 invecpos;  /* next element to add in invec */
1718b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 fallback; /* fallback value for failed graph encodings */
1719b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i;
1720b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1721b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtposp = (kdtposp_subobj_t *)this;
1722b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    chbrear = 0;
1723b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    chbfront = 0;
1724b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    chblen = 0;
1725b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    poscg = 0;
1726b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nrutfg = 0;
1727b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    invecpos = 0;
1728b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1729b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("graphlen %d", graphlen));
1730b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1731b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* not needed, since all elements are set
1732b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < PICOKDT_NRATT_POSP; i++) {
1733b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtposp->invec[i] = '\x63';
1734b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1735b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    */
1736b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1737b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtposp->inveclen = 0;
1738b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1739b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((poscg < graphlen) &&
1740b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen           ((lencg = picobase_det_utf8_length(graph[poscg])) > 0)) {
1741b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (chblen >= KDT_POSP_NRGRAPHSUFFATT) {      /* chbuf full */
1742b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (invecpos < KDT_POSP_NRGRAPHPREFATT) { /* prefix not full */
1743b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* att-encode front utf graph and add in invec */
1744b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (!kdtMapInGraph(&(dtposp->dt), invecpos,
1745b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   chbuf[chbfront], PICOBASE_UTF8_MAXLEN,
1746b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   &(dtposp->invec[invecpos]),
1747b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   &fallback)) {
1748b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if (fallback) {
1749b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        dtposp->invec[invecpos] = fallback;
1750b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    } else {
1751b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        return FALSE;
1752b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1753b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1754b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                invecpos++;
1755b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1756b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* remove front utf graph */
1757b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            chbfront++;
1758b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            chbfront %= KDT_POSP_NRGRAPHSUFFATT;
1759b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            chblen--;
1760b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1761b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* add current utf graph to chbuf */
1762b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        for (i=0; i<lencg; i++) {
1763b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            chbuf[chbrear][i] = graph[poscg++];
1764b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1765b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (i < PICOBASE_UTF8_MAXLEN) {
1766b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            chbuf[chbrear][i] = '\0';
1767b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1768b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        chbrear++;
1769b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        chbrear %= KDT_POSP_NRGRAPHSUFFATT;
1770b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        chblen++;
1771b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* increase utf graph count */
1772b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        nrutfg++;
1773b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1774b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1775b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((lencg == 0) || (chblen == 0)) {
1776b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1777b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if (chblen > 0) {
1778b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1779b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        while (invecpos < KDT_POSP_NRGRAPHPREFATT) { /* fill up prefix */
1780b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (!kdtMapInGraph(&(dtposp->dt), invecpos,
1781b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                               PICOKDT_OUTSIDEGRAPH_DEFSTR,
1782b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                               PICOKDT_OUTSIDEGRAPH_DEFLEN,
1783b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                               &(dtposp->invec[invecpos]), &fallback)) {
1784b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (fallback) {
1785b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    dtposp->invec[invecpos] = fallback;
1786b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                } else {
1787b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return FALSE;
1788b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1789b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1790b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            invecpos++;
1791b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1792b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1793b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        for (i = (KDT_POSP_NRGRAPHATT - 1);
1794b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             i >= KDT_POSP_NRGRAPHPREFATT; i--) {
1795b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (chblen > 0) {
1796b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (chbrear == 0) {
1797b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    chbrear = KDT_POSP_NRGRAPHSUFFATT - 1;
1798b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                } else {
1799b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    chbrear--;
1800b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1801b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (!kdtMapInGraph(&(dtposp->dt), i, chbuf[chbrear],
1802b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   PICOBASE_UTF8_MAXLEN,
1803b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   &(dtposp->invec[i]), &fallback)) {
1804b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if (fallback) {
1805b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        dtposp->invec[i] = fallback;
1806b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    } else {
1807b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        return FALSE;
1808b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1809b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1810b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                chblen--;
1811b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
1812b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (!kdtMapInGraph(&(dtposp->dt), i,
1813b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   PICOKDT_OUTSIDEGRAPH_DEFSTR,
1814b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   PICOKDT_OUTSIDEGRAPH_DEFLEN,
1815b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   &(dtposp->invec[i]), &fallback)) {
1816b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if (fallback) {
1817b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        dtposp->invec[i] = fallback;
1818b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    } else {
1819b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        return FALSE;
1820b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1821b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1822b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1823b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1824b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1825b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* set isSpecChar attribute, reuse var i */
1826b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        i = (specgraphflag ? 1 : 0);
1827b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (!kdtMapInFixed(&(dtposp->dt), KDT_POSP_SPECGRAPHATTPOS, i,
1828b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           &(dtposp->invec[KDT_POSP_SPECGRAPHATTPOS]),
1829b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           &fallback)) {
1830b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (fallback) {
1831b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                dtposp->invec[KDT_POSP_SPECGRAPHATTPOS] = fallback;
1832b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
1833b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return FALSE;
1834b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1835b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1836b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1837b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* set nrGraphs attribute */
1838b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (!kdtMapInFixed(&(dtposp->dt), KDT_POSP_NRGRAPHSATTPOS, nrutfg,
1839b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           &(dtposp->invec[KDT_POSP_NRGRAPHSATTPOS]),
1840b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           &fallback)) {
1841b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (fallback) {
1842b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                dtposp->invec[KDT_POSP_NRGRAPHSATTPOS] = fallback;
1843b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
1844b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return FALSE;
1845b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1846b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1847b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("posp-invec: [%d,%d,%d,%d|%d,%d,%d,%d,%d,%d|%d|%d]",
1848b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       dtposp->invec[0], dtposp->invec[1], dtposp->invec[2],
1849b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       dtposp->invec[3], dtposp->invec[4], dtposp->invec[5],
1850b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       dtposp->invec[6], dtposp->invec[7], dtposp->invec[8],
1851b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       dtposp->invec[9], dtposp->invec[10],
1852b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       dtposp->invec[11], dtposp->invec[12]));
1853b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtposp->inveclen = PICOKDT_NRINPMT_POSP;
1854b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return TRUE;
1855b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1856b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1857b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return FALSE;
1858b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1859b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1860b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1861b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtPosPclassify(const picokdt_DtPosP this) {
1862b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 iByteNo;
1863b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int8 iBitNo;
1864b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int8 rv;
1865b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtposp_subobj_t *dtposp;
1866b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t *dt;
1867b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1868b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtposp = (kdtposp_subobj_t *)this;
1869b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt = &(dtposp->dt);
1870b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iByteNo = 0;
1871b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iBitNo = 7;
1872b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((rv = kdtAskTree(dt, dtposp->invec, PICOKDT_NRATT_POSP,
1873b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            &iByteNo, &iBitNo)) > 0) {
1874b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("asking tree"));
1875b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1876b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("done: %d", dt->dclass));
1877b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return ((rv == 0) && dt->dset);
1878b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1879b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1880b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1881b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtPosPdecomposeOutClass(const picokdt_DtPosP this,
1882b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                             picokdt_classify_result_t *dtres) {
1883b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtposp_subobj_t *dtposp;
1884b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 val;
1885b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1886b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtposp = (kdtposp_subobj_t *)this;
1887b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1888b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (dtposp->dt.dset &&
1889b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        kdtMapOutFixed(&(dtposp->dt), dtposp->dt.dclass, &val)) {
1890b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtres->set = TRUE;
1891b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtres->class = val;
1892b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return TRUE;
1893b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
1894b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtres->set = FALSE;
1895b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1896b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1897b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1898b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1899b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1900b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1901b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
1902b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* decision tree POS disambiguation (PosD) functions */
1903b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
1904b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1905b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1906b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtPosDconstructInVec(const picokdt_DtPosD this,
1907b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          const picoos_uint16 * input) {
1908b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtposd_subobj_t *dtposd;
1909b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i;
1910b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 fallback = 0;
1911b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1912b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtposd = (kdtposd_subobj_t *)this;
1913b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtposd->inveclen = 0;
1914b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1915b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("in: [%d,%d,%d|%d|%d,%d,%d]",
1916b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   input[0], input[1], input[2],
1917b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   input[3], input[4], input[5],
1918b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   input[6]));
1919b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < PICOKDT_NRATT_POSD; i++) {
1920b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1921b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* do the imt mapping for all inval */
1922b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (!kdtMapInFixed(&(dtposd->dt), i, input[i],
1923b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           &(dtposd->invec[i]), &fallback)) {
1924b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (fallback) {
1925b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG(("*** using fallback for input mapping: %i -> %i", input[i], fallback));
1926b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                dtposd->invec[i] = fallback;
1927b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
1928b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_ERROR(("problem doing input mapping"));
1929b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return FALSE;
1930b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1931b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1932b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1933b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1934b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("out: [%d,%d,%d|%d|%d,%d,%d]",
1935b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtposd->invec[0], dtposd->invec[1], dtposd->invec[2],
1936b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtposd->invec[3], dtposd->invec[4], dtposd->invec[5],
1937b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtposd->invec[6]));
1938b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtposd->inveclen = PICOKDT_NRINPMT_POSD;
1939b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return TRUE;
1940b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1941b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1942b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1943b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtPosDclassify(const picokdt_DtPosD this,
1944b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    picoos_uint16 *treeout) {
1945b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 iByteNo;
1946b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int8 iBitNo;
1947b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int8 rv;
1948b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtposd_subobj_t *dtposd;
1949b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t *dt;
1950b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1951b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtposd = (kdtposd_subobj_t *)this;
1952b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt = &(dtposd->dt);
1953b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iByteNo = 0;
1954b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iBitNo = 7;
1955b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((rv = kdtAskTree(dt, dtposd->invec, PICOKDT_NRATT_POSD,
1956b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            &iByteNo, &iBitNo)) > 0) {
1957b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("asking tree"));
1958b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1959b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("done: %d", dt->dclass));
1960b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((rv == 0) && dt->dset) {
1961b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *treeout = dt->dclass;
1962b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return TRUE;
1963b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
1964b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1965b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1966b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1967b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1968b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1969b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* decompose the tree output and return the class in dtres
1970b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   dtres:         POS classification result
1971b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   returns:       TRUE if okay, FALSE otherwise
1972b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
1973b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtPosDdecomposeOutClass(const picokdt_DtPosD this,
1974b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                             picokdt_classify_result_t *dtres) {
1975b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtposd_subobj_t *dtposd;
1976b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 val;
1977b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1978b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtposd = (kdtposd_subobj_t *)this;
1979b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1980b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (dtposd->dt.dset &&
1981b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        kdtMapOutFixed(&(dtposd->dt), dtposd->dt.dclass, &val)) {
1982b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtres->set = TRUE;
1983b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtres->class = val;
1984b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return TRUE;
1985b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
1986b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtres->set = FALSE;
1987b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1988b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1989b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1990b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1991b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1992b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1993b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
1994b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* decision tree grapheme-to-phoneme (G2P) functions */
1995b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
1996b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1997b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1998b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* get the nr'th (starting at 0) utf char in utfgraph */
1999b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 kdtGetUTF8char(const picoos_uint8 *utfgraph,
2000b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   const picoos_uint16 graphlen,
2001b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   const picoos_uint16 nr,
2002b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   picoos_uint8 *utf8char) {
2003b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i;
2004b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 pos;
2005b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2006b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos = 0;
2007b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < nr; i++) {
2008b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (!picobase_get_next_utf8charpos(utfgraph, graphlen, &pos)) {
2009b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return FALSE;
2010b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
2011b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2012b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return picobase_get_next_utf8char(utfgraph, graphlen, &pos, utf8char);
2013b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
2014b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2015b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* determine the utfchar count (starting at 1) of the utfchar starting at pos */
2016b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint16 kdtGetUTF8Nr(const picoos_uint8 *utfgraph,
2017b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  const picoos_uint16 graphlen,
2018b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  const picoos_uint16 pos) {
2019b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 postmp;
2020b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 count;
2021b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2022b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    count = 0;
2023b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    postmp = 0;
2024b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((postmp <= pos) && (count < graphlen)) {
2025b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (!picobase_get_next_utf8charpos(utfgraph, graphlen, &postmp)) {
2026b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_ERROR(("invalid utf8 string, count: %d, pos: %d, post: %d",
2027b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           count, pos, postmp));
2028b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return count + 1;
2029b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
2030b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        count++;
2031b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2032b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return count;
2033b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
2034b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2035b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2036b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtG2PconstructInVec(const picokdt_DtG2P this,
2037b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint8 *graph,
2038b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint16 graphlen,
2039b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint8 count,
2040b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint8 pos,
2041b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint8 nrvow,
2042b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint8 ordvow,
2043b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         picoos_uint8 *primstressflag,
2044b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint16 phonech1,
2045b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint16 phonech2,
2046b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint16 phonech3) {
2047b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtg2p_subobj_t *dtg2p;
2048b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 fallback = 0;
2049b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 iAttr;
2050b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 utf8char[PICOBASE_UTF8_MAXLEN + 1];
2051b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 inval;
2052b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int16 cinv;
2053b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 retval;
2054b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 utfgraphlen;
2055b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 utfcount;
2056b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2057b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtg2p = (kdtg2p_subobj_t *)this;
2058b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    retval = TRUE;
2059b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    inval = 0;
2060b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2061b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("in:  [%d,%d,%d|%d,%d|%d|%d,%d,%d]", graphlen, count, pos,
2062b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   nrvow, ordvow, *primstressflag, phonech1, phonech2,
2063b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   phonech3));
2064b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2065b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtg2p->inveclen = 0;
2066b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2067b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* many speed-ups possible */
2068b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2069b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* graph attributes */
2070b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*   count   >     =         <=     count
2071b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen       iAttr lowbound eow     upbound  delta
2072b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen         0     4      4       graphlen    5
2073b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen         1     3      3       graphlen    4
2074b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen         2     2      2       graphlen    3
2075b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen         3     1      1       graphlen    2
2076b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen         4     0      -       graphlen    1
2077b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2078b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen         5     0  graphlen    graphlen-1  0
2079b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen         6     0  graphlen-1  graphlen-2 -1
2080b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen         7     0  graphlen-2  graphlen-3 -2
2081b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen         8     0  graphlen-3  graphlen-4 -3
2082b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     */
2083b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2084b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* graph attributes left (context -4/-3/-2/-1) and current, MapInGraph */
2085b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2086b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    utfgraphlen = picobase_utf8_length(graph, graphlen);
2087b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (utfgraphlen <= 0) {
2088b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        utfgraphlen = 0;
2089b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2090b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    utfcount = kdtGetUTF8Nr(graph, graphlen, count);
2091b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2092b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    cinv = 4;
2093b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (iAttr = 0; iAttr < 5; iAttr++) {
2094b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ((utfcount > cinv) && (utfcount <= utfgraphlen)) {
2095b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2096b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*            utf8char[0] = graph[count - cinv - 1];*/
2097b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (!kdtGetUTF8char(graph, graphlen, utfcount-cinv-1,
2098b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                utf8char)) {
2099b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_WARN(("problem getting UTF char %d", utfcount-cinv-1));
2100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                utf8char[0] = PICOKDT_OUTSIDEGRAPH_DEFCH;
2101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                utf8char[1] = '\0';
2102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
2103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {
2104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if ((utfcount == cinv) && (iAttr != 4)) {
2105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                utf8char[0] = PICOKDT_OUTSIDEGRAPH_EOW_DEFCH;
2106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
2107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                utf8char[0] = PICOKDT_OUTSIDEGRAPH_DEFCH;
2108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
2109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            utf8char[1] = '\0';
2110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
2111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (!kdtMapInGraph(&(dtg2p->dt), iAttr,
2113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           utf8char, PICOBASE_UTF8_MAXLEN,
2114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           &(dtg2p->invec[iAttr]),
2115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           &fallback)) {
2116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (fallback) {
2117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                dtg2p->invec[iAttr] = fallback;
2118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
2119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_WARN(("setting attribute %d to zero", iAttr));
2120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                dtg2p->invec[iAttr] = 0;
2121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                retval = FALSE;
2122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
2123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
2124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("invec %d %c", iAttr, utf8char[0]));
2125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        cinv--;
2126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* graph attributes right (context 1/2/3/4), MapInGraph */
2129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    cinv = utfgraphlen;
2130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (iAttr = 5; iAttr < 9; iAttr++) {
2131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ((utfcount > 0) && (utfcount <= (cinv - 1))) {
2132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*            utf8char[0] = graph[count + graphlen - cinv];*/
2133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (!kdtGetUTF8char(graph, graphlen, utfcount+utfgraphlen-cinv,
2134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                utf8char)) {
2135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_WARN(("problem getting UTF char %d",
2136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                              utfcount+utfgraphlen-cinv-1));
2137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                utf8char[0] = PICOKDT_OUTSIDEGRAPH_DEFCH;
2138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                utf8char[1] = '\0';
2139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
2140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {
2141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (utfcount == cinv) {
2142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                utf8char[0] = PICOKDT_OUTSIDEGRAPH_EOW_DEFCH;
2143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                utf8char[1] = '\0';
2144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
2145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                utf8char[0] = PICOKDT_OUTSIDEGRAPH_DEFCH;
2146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                utf8char[1] = '\0';
2147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
2148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
2149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (!kdtMapInGraph(&(dtg2p->dt), iAttr,
2150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           utf8char, PICOBASE_UTF8_MAXLEN,
2151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           &(dtg2p->invec[iAttr]),
2152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           &fallback)) {
2153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (fallback) {
2154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                dtg2p->invec[iAttr] = fallback;
2155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
2156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_WARN(("setting attribute %d to zero", iAttr));
2157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                dtg2p->invec[iAttr] = 0;
2158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                retval = FALSE;
2159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
2160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
2161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("invec %d %c", iAttr, utf8char[0]));
2162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        cinv--;
2163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* other attributes, MapInFixed */
2166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (iAttr = 9; iAttr < PICOKDT_NRATT_G2P; iAttr++) {
2167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        switch (iAttr) {
2168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 9:     /* word POS, Fix1 */
2169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                inval = pos;
2170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
2171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 10:    /* nr of vowel-like graphs in word, if vowel, Fix2  */
2172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                inval = nrvow;
2173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
2174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 11:    /* order of current vowel-like graph in word, Fix2 */
2175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                inval = ordvow;
2176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
2177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 12:    /* primary stress mark, Fix2 */
2178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (*primstressflag == 1) {
2179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /*already set previously*/
2180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    inval = 1;
2181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                } else {
2182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    inval = 0;
2183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
2184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
2185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 13:    /* phone chunk right context +1, Hist */
2186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                inval = phonech1;
2187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
2188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 14:    /* phone chunk right context +2, Hist */
2189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                inval = phonech2;
2190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
2191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 15:    /* phone chunk right context +3, Hist */
2192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                inval = phonech3;
2193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
2194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
2195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("invec %d %d", iAttr, inval));
2197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (!kdtMapInFixed(&(dtg2p->dt), iAttr, inval,
2199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           &(dtg2p->invec[iAttr]), &fallback)) {
2200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (fallback) {
2201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                dtg2p->invec[iAttr] = fallback;
2202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
2203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_WARN(("setting attribute %d to zero", iAttr));
2204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                dtg2p->invec[iAttr] = 0;
2205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                retval = FALSE;
2206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
2207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
2208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("out: [%d,%d%,%d,%d|%d|%d,%d,%d,%d|%d,%d,%d,%d|"
2211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   "%d,%d,%d]", dtg2p->invec[0], dtg2p->invec[1],
2212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtg2p->invec[2], dtg2p->invec[3], dtg2p->invec[4],
2213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtg2p->invec[5], dtg2p->invec[6], dtg2p->invec[7],
2214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtg2p->invec[8], dtg2p->invec[9], dtg2p->invec[10],
2215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtg2p->invec[11], dtg2p->invec[12], dtg2p->invec[13],
2216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtg2p->invec[14], dtg2p->invec[15]));
2217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtg2p->inveclen = PICOKDT_NRINPMT_G2P;
2219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return retval;
2220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
2221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtG2Pclassify(const picokdt_DtG2P this,
2226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   picoos_uint16 *treeout) {
2227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 iByteNo;
2228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int8 iBitNo;
2229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int8 rv;
2230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtg2p_subobj_t *dtg2p;
2231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t *dt;
2232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtg2p = (kdtg2p_subobj_t *)this;
2234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt = &(dtg2p->dt);
2235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iByteNo = 0;
2236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iBitNo = 7;
2237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((rv = kdtAskTree(dt, dtg2p->invec, PICOKDT_NRATT_G2P,
2238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            &iByteNo, &iBitNo)) > 0) {
2239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("asking tree"));
2240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("done: %d", dt->dclass));
2242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((rv == 0) && dt->dset) {
2243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *treeout = dt->dclass;
2244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return TRUE;
2245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
2246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
2247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
2249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtG2PdecomposeOutClass(const picokdt_DtG2P this,
2253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  picokdt_classify_vecresult_t *dtvres) {
2254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtg2p_subobj_t *dtg2p;
2255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtg2p = (kdtg2p_subobj_t *)this;
2257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (dtg2p->dt.dset &&
2259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        kdtMapOutVar(&(dtg2p->dt), dtg2p->dt.dclass, &(dtvres->nr),
2260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                     dtvres->classvec, PICOKDT_MAXSIZE_OUTVEC)) {
2261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return TRUE;
2262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
2263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtvres->nr = 0;
2264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
2265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return TRUE;
2267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
2268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
2272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* decision tree phrasing (PHR) functions */
2273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
2274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtPHRconstructInVec(const picokdt_DtPHR this,
2276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint8 pre2,
2277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint8 pre1,
2278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint8 src,
2279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint8 fol1,
2280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint8 fol2,
2281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint16 nrwordspre,
2282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint16 nrwordsfol,
2283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint16 nrsyllsfol) {
2284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtphr_subobj_t *dtphr;
2285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i;
2286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 inval = 0;
2287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 fallback = 0;
2288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtphr = (kdtphr_subobj_t *)this;
2290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("in:  [%d,%d|%d|%d,%d|%d,%d,%d]",
2291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   pre2, pre1, src, fol1, fol2,
2292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   nrwordspre, nrwordsfol, nrsyllsfol));
2293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtphr->inveclen = 0;
2294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < PICOKDT_NRATT_PHR; i++) {
2296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        switch (i) {
2297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 0: inval = pre2; break;
2298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1: inval = pre1; break;
2299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 2: inval = src; break;
2300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 3: inval = fol1;  break;
2301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 4: inval = fol2; break;
2302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 5: inval = nrwordspre; break;
2303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 6: inval = nrwordsfol; break;
2304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7: inval = nrsyllsfol; break;
2305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            default:
2306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_ERROR(("size mismatch"));
2307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return FALSE;
2308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
2309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
2310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* do the imt mapping for all inval */
2312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (!kdtMapInFixed(&(dtphr->dt), i, inval,
2313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           &(dtphr->invec[i]), &fallback)) {
2314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (fallback) {
2315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                dtphr->invec[i] = fallback;
2316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
2317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_ERROR(("problem doing input mapping"));
2318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return FALSE;
2319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
2320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
2321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("out: [%d,%d|%d|%d,%d|%d,%d,%d]",
2324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtphr->invec[0], dtphr->invec[1], dtphr->invec[2],
2325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtphr->invec[3], dtphr->invec[4], dtphr->invec[5],
2326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtphr->invec[6], dtphr->invec[7]));
2327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtphr->inveclen = PICOKDT_NRINPMT_PHR;
2328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return TRUE;
2329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
2330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtPHRclassify(const picokdt_DtPHR this) {
2333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 iByteNo;
2334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int8 iBitNo;
2335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int8 rv;
2336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtphr_subobj_t *dtphr;
2337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t *dt;
2338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtphr = (kdtphr_subobj_t *)this;
2340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt = &(dtphr->dt);
2341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iByteNo = 0;
2342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iBitNo = 7;
2343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((rv = kdtAskTree(dt, dtphr->invec, PICOKDT_NRATT_PHR,
2344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            &iByteNo, &iBitNo)) > 0) {
2345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("asking tree"));
2346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("done: %d", dt->dclass));
2348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return ((rv == 0) && dt->dset);
2349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
2350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtPHRdecomposeOutClass(const picokdt_DtPHR this,
2353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            picokdt_classify_result_t *dtres) {
2354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtphr_subobj_t *dtphr;
2355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 val;
2356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtphr = (kdtphr_subobj_t *)this;
2358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (dtphr->dt.dset &&
2360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        kdtMapOutFixed(&(dtphr->dt), dtphr->dt.dclass, &val)) {
2361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtres->set = TRUE;
2362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtres->class = val;
2363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return TRUE;
2364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
2365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtres->set = FALSE;
2366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
2367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
2369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
2373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* decision tree phono-acoustical model (PAM) functions */
2374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
2375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtPAMconstructInVec(const picokdt_DtPAM this,
2377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint8 *vec,
2378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint8 veclen) {
2379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtpam_subobj_t *dtpam;
2380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i;
2381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 fallback = 0;
2382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtpam = (kdtpam_subobj_t *)this;
2384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("in0:  %d %d %d %d %d %d %d %d %d %d",
2386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   vec[0], vec[1], vec[2], vec[3], vec[4],
2387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   vec[5], vec[6], vec[7], vec[8], vec[9]));
2388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("in1:  %d %d %d %d %d %d %d %d %d %d",
2389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   vec[10], vec[11], vec[12], vec[13], vec[14],
2390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   vec[15], vec[16], vec[17], vec[18], vec[19]));
2391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("in2:  %d %d %d %d %d %d %d %d %d %d",
2392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   vec[20], vec[21], vec[22], vec[23], vec[24],
2393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   vec[25], vec[26], vec[27], vec[28], vec[29]));
2394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("in3:  %d %d %d %d %d %d %d %d %d %d",
2395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   vec[30], vec[31], vec[32], vec[33], vec[34],
2396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   vec[35], vec[36], vec[37], vec[38], vec[39]));
2397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("in4:  %d %d %d %d %d %d %d %d %d %d",
2398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   vec[40], vec[41], vec[42], vec[43], vec[44],
2399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   vec[45], vec[46], vec[47], vec[48], vec[49]));
2400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("in5:  %d %d %d %d %d %d %d %d %d %d",
2401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   vec[50], vec[51], vec[52], vec[53], vec[54],
2402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   vec[55], vec[56], vec[57], vec[58], vec[59]));
2403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtpam->inveclen = 0;
2405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check veclen */
2407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (veclen != PICOKDT_NRINPMT_PAM) {
2408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("wrong number of input vector elements"));
2409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
2410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < PICOKDT_NRATT_PAM; i++) {
2413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* do the imt mapping for all vec eles */
2415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (!kdtMapInFixed(&(dtpam->dt), i, vec[i],
2416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           &(dtpam->invec[i]), &fallback)) {
2417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (fallback) {
2418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                dtpam->invec[i] = fallback;
2419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
2420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_ERROR(("problem doing input mapping, %d %d", i,vec[i]));
2421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return FALSE;
2422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
2423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
2424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("in0:  %d %d %d %d %d %d %d %d %d %d",
2427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[0], dtpam->invec[1], dtpam->invec[2],
2428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[3], dtpam->invec[4], dtpam->invec[5],
2429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[6], dtpam->invec[7], dtpam->invec[8],
2430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[9]));
2431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("in1:  %d %d %d %d %d %d %d %d %d %d",
2432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[10], dtpam->invec[11], dtpam->invec[12],
2433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[13], dtpam->invec[14], dtpam->invec[15],
2434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[16], dtpam->invec[17], dtpam->invec[18],
2435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[19]));
2436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("in2:  %d %d %d %d %d %d %d %d %d %d",
2437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[20], dtpam->invec[21], dtpam->invec[22],
2438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[23], dtpam->invec[24], dtpam->invec[25],
2439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[26], dtpam->invec[27], dtpam->invec[28],
2440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[29]));
2441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("in3:  %d %d %d %d %d %d %d %d %d %d",
2442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[30], dtpam->invec[31], dtpam->invec[32],
2443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[33], dtpam->invec[34], dtpam->invec[35],
2444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[36], dtpam->invec[37], dtpam->invec[38],
2445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[39]));
2446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("in4:  %d %d %d %d %d %d %d %d %d %d",
2447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[40], dtpam->invec[41], dtpam->invec[42],
2448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[43], dtpam->invec[44], dtpam->invec[45],
2449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[46], dtpam->invec[47], dtpam->invec[48],
2450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[49]));
2451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("in5:  %d %d %d %d %d %d %d %d %d %d",
2452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[50], dtpam->invec[51], dtpam->invec[52],
2453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[53], dtpam->invec[54], dtpam->invec[55],
2454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[56], dtpam->invec[57], dtpam->invec[58],
2455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtpam->invec[59]));
2456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtpam->inveclen = PICOKDT_NRINPMT_PAM;
2458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return TRUE;
2459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
2460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtPAMclassify(const picokdt_DtPAM this) {
2463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 iByteNo;
2464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int8 iBitNo;
2465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int8 rv;
2466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtpam_subobj_t *dtpam;
2467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t *dt;
2468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtpam = (kdtpam_subobj_t *)this;
2470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt = &(dtpam->dt);
2471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iByteNo = 0;
2472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iBitNo = 7;
2473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((rv = kdtAskTree(dt, dtpam->invec, PICOKDT_NRATT_PAM,
2474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            &iByteNo, &iBitNo)) > 0) {
2475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("asking tree"));
2476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("done: %d", dt->dclass));
2478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return ((rv == 0) && dt->dset);
2479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
2480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtPAMdecomposeOutClass(const picokdt_DtPAM this,
2483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            picokdt_classify_result_t *dtres) {
2484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtpam_subobj_t *dtpam;
2485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 val;
2486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtpam = (kdtpam_subobj_t *)this;
2488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (dtpam->dt.dset &&
2490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        kdtMapOutFixed(&(dtpam->dt), dtpam->dt.dclass, &val)) {
2491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtres->set = TRUE;
2492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtres->class = val;
2493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return TRUE;
2494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
2495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtres->set = FALSE;
2496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
2497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
2499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
2503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* decision tree accentuation (ACC) functions */
2504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/
2505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtACCconstructInVec(const picokdt_DtACC this,
2507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint8 pre2,
2508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint8 pre1,
2509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint8 src,
2510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint8 fol1,
2511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint8 fol2,
2512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint16 hist1,
2513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint16 hist2,
2514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint16 nrwordspre,
2515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint16 nrsyllspre,
2516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint16 nrwordsfol,
2517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint16 nrsyllsfol,
2518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint16 footwordsfol,
2519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         const picoos_uint16 footsyllsfol) {
2520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtacc_subobj_t *dtacc;
2521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i;
2522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 inval = 0;
2523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 fallback = 0;
2524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtacc = (kdtacc_subobj_t *)this;
2526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("in:  [%d,%d,%d,%d,%d|%d,%d|%d,%d,%d,%d|%d,%d]",
2527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   pre2, pre1, src, fol1, fol2, hist1, hist2,
2528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   nrwordspre, nrsyllspre, nrwordsfol, nrsyllsfol,
2529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   footwordsfol, footsyllsfol));
2530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtacc->inveclen = 0;
2531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < PICOKDT_NRATT_ACC; i++) {
2533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        switch (i) {
2534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 0: inval = pre2; break;
2535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 1: inval = pre1; break;
2536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 2: inval = src; break;
2537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 3: inval = fol1;  break;
2538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 4: inval = fol2; break;
2539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 5: inval = hist1; break;
2540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 6: inval = hist2; break;
2541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 7: inval = nrwordspre; break;
2542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 8: inval = nrsyllspre; break;
2543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 9: inval = nrwordsfol; break;
2544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 10: inval = nrsyllsfol; break;
2545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 11: inval = footwordsfol; break;
2546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case 12: inval = footsyllsfol; break;
2547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            default:
2548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_ERROR(("size mismatch"));
2549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return FALSE;
2550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
2551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
2552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (((i == 5) || (i == 6)) && (inval == PICOKDT_HISTORY_ZERO)) {
2554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* in input to this function the HISTORY_ZERO is used to
2555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               mark the no-value-available case. For sparsity reasons
2556b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               this was not used in the training. For
2557b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               no-value-available cases, instead, do reverse out
2558b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               mapping of ACC0 to get tree domain for ACC0  */
2559b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (!kdtReverseMapOutFixed(&(dtacc->dt), PICODATA_ACC0,
2560b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       &inval, &fallback)) {
2561b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (fallback) {
2562b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    inval = fallback;
2563b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                } else {
2564b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICODBG_ERROR(("problem doing reverse output mapping"));
2565b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return FALSE;
2566b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
2567b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
2568b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
2569b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2570b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* do the imt mapping for all inval */
2571b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (!kdtMapInFixed(&(dtacc->dt), i, inval,
2572b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           &(dtacc->invec[i]), &fallback)) {
2573b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (fallback) {
2574b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                dtacc->invec[i] = fallback;
2575b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
2576b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_ERROR(("problem doing input mapping"));
2577b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return FALSE;
2578b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
2579b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
2580b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2581b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2582b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("out: [%d,%d,%d,%d,%d|%d,%d|%d,%d,%d,%d|%d,%d]",
2583b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtacc->invec[0], dtacc->invec[1], dtacc->invec[2],
2584b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtacc->invec[3], dtacc->invec[4], dtacc->invec[5],
2585b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtacc->invec[6], dtacc->invec[7], dtacc->invec[8],
2586b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtacc->invec[9], dtacc->invec[10], dtacc->invec[11],
2587b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   dtacc->invec[12]));
2588b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtacc->inveclen = PICOKDT_NRINPMT_ACC;
2589b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return TRUE;
2590b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
2591b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2592b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2593b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtACCclassify(const picokdt_DtACC this,
2594b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   picoos_uint16 *treeout) {
2595b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 iByteNo;
2596b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int8 iBitNo;
2597b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int8 rv;
2598b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtacc_subobj_t *dtacc;
2599b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdt_subobj_t *dt;
2600b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2601b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtacc = (kdtacc_subobj_t *)this;
2602b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dt = &(dtacc->dt);
2603b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iByteNo = 0;
2604b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    iBitNo = 7;
2605b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((rv = kdtAskTree(dt, dtacc->invec, PICOKDT_NRATT_ACC,
2606b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            &iByteNo, &iBitNo)) > 0) {
2607b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("asking tree"));
2608b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2609b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("done: %d", dt->dclass));
2610b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((rv == 0) && dt->dset) {
2611b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *treeout = dt->dclass;
2612b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return TRUE;
2613b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
2614b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
2615b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2616b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
2617b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2618b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2619b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdt_dtACCdecomposeOutClass(const picokdt_DtACC this,
2620b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            picokdt_classify_result_t *dtres) {
2621b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdtacc_subobj_t *dtacc;
2622b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 val;
2623b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2624b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dtacc = (kdtacc_subobj_t *)this;
2625b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2626b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (dtacc->dt.dset &&
2627b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        kdtMapOutFixed(&(dtacc->dt), dtacc->dt.dclass, &val)) {
2628b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtres->set = TRUE;
2629b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtres->class = val;
2630b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return TRUE;
2631b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
2632b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        dtres->set = FALSE;
2633b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
2634b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
2635b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
2636b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2637b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus
2638b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
2639b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
2640b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2641b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
2642b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* end */
2643