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