update fst build struct
This commit is contained in:
parent
0aa47daf89
commit
169f6b3ad8
|
@ -99,22 +99,54 @@ FstState fstStateCreateFrom(FstSlice* data, CompiledAddr addr);
|
||||||
FstState fstStateCreate(State state);
|
FstState fstStateCreate(State state);
|
||||||
|
|
||||||
//compile
|
//compile
|
||||||
void fstStateCompileForOneTransNext(FstState state, FstCountingWriter *w, CompiledAddr addr, uint8_t inp);
|
void fstStateCompileForOneTransNext(FstState* state, FstCountingWriter *w, CompiledAddr addr, uint8_t inp);
|
||||||
void fstStateCompileForOneTrans(FstState state, FstCountingWriter *w, CompiledAddr addr, FstTransition trn);
|
void fstStateCompileForOneTrans(FstState* state, FstCountingWriter *w, CompiledAddr addr, FstTransition trn);
|
||||||
void fstStateCompileForAnyTrans(FstState state, FstCountingWriter *w, CompiledAddr addr, FstBuilderNode *node);
|
void fstStateCompileForAnyTrans(FstState* state, FstCountingWriter *w, CompiledAddr addr, FstBuilderNode *node);
|
||||||
|
|
||||||
// set_comm_input
|
// set_comm_input
|
||||||
void fstStateSetCommInputForOneTransNext(FstState state, uint8_t inp);
|
void fstStateSetCommInput(FstState* state, uint8_t inp);
|
||||||
void fstStateSetCommInputForOneTrans(FstState state, uint8_t inp);
|
|
||||||
|
|
||||||
// comm_input
|
// comm_input
|
||||||
uint8_t fstStateCommInputForOneTransNext(FstState state);
|
uint8_t fstStateCommInput(FstState* state);
|
||||||
uint8_t fstStateCommInputForOneTrans(FstState state);
|
|
||||||
|
|
||||||
// input_len
|
// input_len
|
||||||
|
|
||||||
uint64_t fstStateInputLenForOneTransNext(FstState state);
|
uint64_t fstStateInputLen(FstState* state);
|
||||||
uint64_t fstStateInputLenForOneTrans(FstState state);
|
|
||||||
|
|
||||||
|
// end_addr
|
||||||
|
uint64_t fstStateEndAddrForOneTransNext(FstState* state, FstSlice *data);
|
||||||
|
uint64_t fstStateEndAddrForOneTrans(FstState *state, FstSlice *data, PackSizes sizes);
|
||||||
|
uint64_t fstStateEndAddrForAnyTrans(FstState *state, uint64_t version, FstSlice *date, PackSizes sizes, uint64_t nTrans);
|
||||||
|
// input
|
||||||
|
uint8_t fstStateInput(FstState *state, FstNode *node);
|
||||||
|
uint8_t fstStateInputForAnyTrans(FstState *state, FstNode *node, uint64_t i);
|
||||||
|
|
||||||
|
// trans_addr
|
||||||
|
CompiledAddr fstStateTransAddr(FstState *state, FstNode *node);
|
||||||
|
CompiledAddr fstStateTransAddrForAnyTrans(FstState *state, FstNode *node, uint64_t i);
|
||||||
|
|
||||||
|
// sizes
|
||||||
|
PackSizes fstStateSizes(FstState *state, FstSlice *data);
|
||||||
|
// Output
|
||||||
|
Output fstStateOutput(FstState *state, FstNode *node);
|
||||||
|
Output fstStateOutputForAnyTrans(FstState *state, FstNode *node, uint64_t i);
|
||||||
|
|
||||||
|
// anyTrans specify function
|
||||||
|
|
||||||
|
void fstStateSetFinalState(FstState *state, bool yes);
|
||||||
|
bool fstStateIsFinalState(FstState *state);
|
||||||
|
void fstStateSetStateNtrans(FstState *state, uint8_t n);
|
||||||
|
// state_ntrans
|
||||||
|
void fstStateStateNtrans(FstState *state);
|
||||||
|
uint64_t fstStateTotalTransSize(FstState *state, uint64_t version, PackSizes size, uint64_t nTrans);
|
||||||
|
uint64_t fstStateTransIndexSize(FstState *state, uint64_t version, uint64_t nTrans);
|
||||||
|
uint64_t fstStateNtransLen(FstState *state);
|
||||||
|
uint64_t fstStateNtrans(FstState *state);
|
||||||
|
Output fstStateFinalOutput(FstState *state, uint64_t version, FstSlice *date, PackSizes sizes, uint64_t nTrans);
|
||||||
|
uint64_t fstStateFindInput(FstState *state, FstNode *node, uint8_t b);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
#ifndef __INDEX_FST_COMM_H__
|
||||||
|
#define __INDEX_FST_COMM_H__
|
||||||
|
|
||||||
|
extern const uint8_t COMMON_INPUTS[];
|
||||||
|
extern char const COMMON_INPUTS_INV[];
|
||||||
|
|
||||||
|
#endif
|
|
@ -18,7 +18,7 @@
|
||||||
#define __INDEX_FST_UTIL_H__
|
#define __INDEX_FST_UTIL_H__
|
||||||
|
|
||||||
#include "tarray.h"
|
#include "tarray.h"
|
||||||
|
#include "index_fst_common.h"
|
||||||
|
|
||||||
typedef uint64_t FstType;
|
typedef uint64_t FstType;
|
||||||
typedef uint64_t CompiledAddr;
|
typedef uint64_t CompiledAddr;
|
||||||
|
@ -44,6 +44,8 @@ extern const uint64_t TRANS_INDEX_THRESHOLD;
|
||||||
//
|
//
|
||||||
// `0` is a legal value which means there are no transitions/outputs
|
// `0` is a legal value which means there are no transitions/outputs
|
||||||
|
|
||||||
|
|
||||||
|
extern
|
||||||
#define FST_SET_TRANSITION_PACK_SIZE(v, sz) do {v = (v & 0b00001111) | (sz << 4} while(0)
|
#define FST_SET_TRANSITION_PACK_SIZE(v, sz) do {v = (v & 0b00001111) | (sz << 4} while(0)
|
||||||
#define FST_GET_TRANSITION_PACK_SIZE(v) (((v) & 0b11110000) >> 4)
|
#define FST_GET_TRANSITION_PACK_SIZE(v) (((v) & 0b11110000) >> 4)
|
||||||
#define FST_SET_OUTPUT_PACK_SIZE(v, sz) do { v = (v & 0b11110000) | sz } while(0)
|
#define FST_SET_OUTPUT_PACK_SIZE(v, sz) do { v = (v & 0b11110000) | sz } while(0)
|
||||||
|
@ -79,7 +81,7 @@ FstSlice fstSliceCreate(uint8_t *data, uint64_t dLen);
|
||||||
bool fstSliceEmpty(FstSlice *slice);
|
bool fstSliceEmpty(FstSlice *slice);
|
||||||
int fstSliceCompare(FstSlice *a, FstSlice *b);
|
int fstSliceCompare(FstSlice *a, FstSlice *b);
|
||||||
|
|
||||||
#define FST_SLICE_LEN(s) (s->end - s->start + 1)
|
#define FST_SLICE_LEN(s) ((s)->end - (s)->start + 1)
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -185,8 +185,119 @@ static FstState stateDict[] = {
|
||||||
FstState fstStateCreate(State state){
|
FstState fstStateCreate(State state){
|
||||||
uint8_t idx = (uint8_t)state;
|
uint8_t idx = (uint8_t)state;
|
||||||
return stateDict[idx];
|
return stateDict[idx];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
//compile
|
||||||
|
void fstStateCompileForOneTransNext(FstState* state, FstCountingWriter *w, CompiledAddr addr, uint8_t inp) {
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
void fstStateCompileForOneTrans(FstState* state, FstCountingWriter *w, CompiledAddr addr, FstTransition trn) {
|
||||||
|
return ;
|
||||||
|
|
||||||
|
}
|
||||||
|
void fstStateCompileForAnyTrans(FstState* state, FstCountingWriter *w, CompiledAddr addr, FstBuilderNode *node) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set_comm_input
|
||||||
|
void fstStateSetCommInput(FstState* s, uint8_t inp) {
|
||||||
|
assert(s->state == OneTransNext || s->state == OneTrans);
|
||||||
|
|
||||||
|
uint8_t val;
|
||||||
|
COMMON_INDEX(inp, 0x111111, val);
|
||||||
|
s->val = (s->val & stateDict[s->state].val) | val;
|
||||||
|
}
|
||||||
|
|
||||||
|
// comm_input
|
||||||
|
uint8_t fstStateCommInput(FstState* s) {
|
||||||
|
assert(s->state == OneTransNext || s->state == OneTrans);
|
||||||
|
uint8_t v = s->val & 0b00111111;
|
||||||
|
//v = 0 indicate that common_input is None
|
||||||
|
return v == 0 ? 0 : COMMON_INPUT(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
// input_len
|
||||||
|
|
||||||
|
uint64_t fstStateInputLen(FstState* s) {
|
||||||
|
assert(s->state == OneTransNext || s->state == OneTrans);
|
||||||
|
return fstStateCommInput(s) == 0 ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// end_addr
|
||||||
|
uint64_t fstStateEndAddrForOneTransNext(FstState* s, FstSlice *data) {
|
||||||
|
return FST_SLICE_LEN(data) - 1 - fstStateInputLen(s);
|
||||||
|
}
|
||||||
|
uint64_t fstStateEndAddrForOneTrans(FstState *s, FstSlice *data, PackSizes sizes) {
|
||||||
|
return FST_SLICE_LEN(data) - 1 - fstStateInputLen(s) - 1 - FST_GET_TRANSITION_PACK_SIZE(sizes) - FST_GET_OUTPUT_PACK_SIZE(sizes);
|
||||||
|
}
|
||||||
|
uint64_t fstStateEndAddrForAnyTrans(FstState *state, uint64_t version, FstSlice *date, PackSizes sizes, uint64_t nTrans) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// input
|
||||||
|
uint8_t fstStateInput(FstState *state, FstNode *node) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
uint8_t fstStateInputForAnyTrans(FstState *state, FstNode *node, uint64_t i) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// trans_addr
|
||||||
|
CompiledAddr fstStateTransAddr(FstState *state, FstNode *node) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
CompiledAddr fstStateTransAddrForAnyTrans(FstState *state, FstNode *node, uint64_t i) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// sizes
|
||||||
|
PackSizes fstStateSizes(FstState *state, FstSlice *data) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// Output
|
||||||
|
Output fstStateOutput(FstState *state, FstNode *node) {
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
Output fstStateOutputForAnyTrans(FstState *state, FstNode *node, uint64_t i) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// anyTrans specify function
|
||||||
|
|
||||||
|
void fstStateSetFinalState(FstState *state, bool yes) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
bool fstStateIsFinalState(FstState *state) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
void fstStateSetStateNtrans(FstState *state, uint8_t n) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// state_ntrans
|
||||||
|
void fstStateStateNtrans(FstState *state) {
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
uint64_t fstStateTotalTransSize(FstState *state, uint64_t version, PackSizes size, uint64_t nTrans) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
uint64_t fstStateTransIndexSize(FstState *state, uint64_t version, uint64_t nTrans) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
uint64_t fstStateNtransLen(FstState *state) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
uint64_t fstStateNtrans(FstState *state) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
Output fstStateFinalOutput(FstState *state, uint64_t version, FstSlice *date, PackSizes sizes, uint64_t nTrans) {
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
uint64_t fstStateFindInput(FstState *state, FstNode *node, uint8_t b) {
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// fst node function
|
// fst node function
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
|
|
||||||
const uint8_t COMMON_INPUTS[] = {
|
const uint8_t COMMON_INPUTS[] = {
|
||||||
84, // '\x00'
|
84, // '\x00'
|
||||||
85, // '\x01'
|
85, // '\x01'
|
||||||
|
@ -273,7 +274,7 @@ const uint8_t COMMON_INPUTS[] = {
|
||||||
255, // 'ÿ'
|
255, // 'ÿ'
|
||||||
};
|
};
|
||||||
|
|
||||||
char const COMMON_INPUTS_INV[] = {
|
const char COMMON_INPUTS_INV[] = {
|
||||||
't', 'e', '/', 'o', 'a', 's', 'r', 'i', 'p', 'c', 'n', 'w',
|
't', 'e', '/', 'o', 'a', 's', 'r', 'i', 'p', 'c', 'n', 'w',
|
||||||
'.', 'h', 'l', 'm', '-', 'd', 'u', '0', '1', '2', 'g', '=',
|
'.', 'h', 'l', 'm', '-', 'd', 'u', '0', '1', '2', 'g', '=',
|
||||||
':', 'b', 'f', '3', 'y', '5', '&', '_', '4', 'v', '9', '6',
|
':', 'b', 'f', '3', 'y', '5', '&', '_', '4', 'v', '9', '6',
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#include "index_fst_util.h"
|
#include "index_fst_util.h"
|
||||||
|
#include "index_fst_common.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue