File size: 21,797 Bytes
bcec41a
 
 
 
a662e17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bcec41a
a662e17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bcec41a
a662e17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bcec41a
a662e17
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/* Generated by codegen.py from cnet.py: the network's ARCHITECTURE compiled to C.
 * No weight values live here. lexnet.c loads them from lexnet_weights.bin, gathers the
 * ones this kernel references into kc[]/kb[] via K_COEF/K_BIAS, and checks that the
 * file's structure hash equals K_STRUCT_HASH before running this kernel. */
#include <stdint.h>

#define K_STRUCT_HASH 0xA4E83D2A77498B78ULL
#define K_N_FEATS 14
#define K_N_COEF 512
#define K_N_BIAS 239
#define K_N_CLASSES 11

static inline double clip1(double x) { return fmin(fmax(x, 0.0), 1.0); }
static inline double relu(double x)  { return fmax(x, 0.0); }
static inline double clipn(double x, double hi) { return fmin(fmax(x, 0.0), hi); }

typedef struct { double C, L, S, Q, P, E, sf, star_in, closed, Sclose, Qclose, ls, bsP, W, N, d, h1, h2; } FState;
typedef struct { double W, copen2, lps, kwc, tyc, cst, fnc; } BState;

/* initial forward state is h0 from the weight file, in FSTATE order */
static inline void k_init_state(FState *s, const double *h0) { memcpy(s, h0, sizeof *s); }

/* One forward step: character features x, previous state p -> new state s,
 * plus the 15 bits the backward pass needs, packed into a uint16. */
static inline uint16_t k_fwd_step(const double *restrict kc, const double *restrict kb,
                                  const double *restrict x, const FState *restrict p, FState *restrict s) {
    const double u_contC = clip1(kb[0] + kc[0] * p->C + kc[1] * p->closed);
    const double u_contL = clip1(kb[1] + kc[2] * p->L + kc[3] * x[5]);
    const double u_contS = clip1(kb[2] + kc[4] * p->S + kc[5] * p->Sclose + kc[6] * x[5]);
    const double u_contQ = clip1(kb[3] + kc[7] * p->Q + kc[8] * p->Qclose + kc[9] * x[5]);
    const double u_contP = clip1(kb[4] + kc[10] * p->P + kc[11] * x[5] + kc[12] * p->bsP);
    const double u_opened = clip1(kb[5] + kc[13] * x[10] + kc[14] * p->sf);
    const double u_lo = clip1(kb[6] + kc[15] * x[9] + kc[16] * p->sf);
    const double u_closed = clip1(kb[7] + kc[17] * x[9] + kc[18] * p->star_in);
    const double u_ls = clip1(kb[8] + kc[19] * x[5] + kc[20] * p->ls + kc[21] * x[4]);
    const double u_wcont = clip1(kb[9] + kc[22] * p->W + kc[23] * x[2]);
    const double u_wstart0 = clip1(kb[10] + kc[24] * x[0] + kc[25] * p->N);
    const double u_nany = clip1(kb[11] + kc[26] * p->N + kc[27] * x[1]);
    const double u_d = clipn(kb[12] + kc[28] * p->d + kc[29] * p->W, 14.0);
    const double u_lt8 = clip1(kb[13] + kc[30] * p->d + kc[31] * p->W);
    const double u_ge8 = clip1(kb[14] + kc[32] * p->W + kc[33] * p->d);
    const double u_ge14 = clip1(kb[15] + kc[34] * p->W + kc[35] * p->d);
    const double u_C = clip1(kb[16] + kc[36] * u_opened + kc[37] * u_contC);
    const double u_L = clip1(kb[17] + kc[38] * u_lo + kc[39] * u_contL);
    const double u_copen2 = clip1(kb[18] + kc[40] * u_opened + kc[41] * u_lo);
    const double u_S = clip1(kb[19] + kc[42] * x[6] + kc[43] * u_contC + kc[44] * u_contL + kc[45] * u_contS + kc[46] * u_contQ);
    const double u_Q = clip1(kb[20] + kc[47] * x[7] + kc[48] * u_contC + kc[49] * u_contL + kc[50] * u_contS + kc[51] * u_contQ);
    const double u_P = clip1(kb[21] + kc[52] * x[11] + kc[53] * p->ls + kc[54] * u_contC + kc[55] * u_contL + kc[56] * u_contS + kc[57] * u_contQ + kc[58] * u_contP);
    const double u_Sclose = clip1(kb[22] + kc[59] * u_contS + kc[60] * x[6] + kc[61] * p->E);
    const double u_Qclose = clip1(kb[23] + kc[62] * u_contQ + kc[63] * x[7] + kc[64] * p->E);
    const double u_E = clip1(kb[24] + kc[65] * u_contS + kc[66] * u_contQ + kc[67] * x[8] + kc[68] * p->E);
    const double u_star_in = clip1(kb[25] + kc[69] * x[10] + kc[70] * u_contC);
    const double u_sf = clip1(kb[26] + kc[71] * x[9] + kc[72] * u_contC + kc[73] * u_contL + kc[74] * u_contS + kc[75] * u_contQ + kc[76] * u_lo);
    const double u_bsP = clip1(kb[27] + kc[77] * u_contP + kc[78] * x[8]);
    const double u_W = clip1(kb[28] + kc[79] * u_wcont + kc[80] * u_wstart0 + kc[81] * u_contC + kc[82] * u_contL + kc[83] * u_contS + kc[84] * u_contQ);
    const double u_N = clip1(kb[29] + kc[85] * x[3] + kc[86] * u_nany + kc[87] * u_wcont + kc[88] * u_wstart0 + kc[89] * u_contC + kc[90] * u_contL + kc[91] * u_contS + kc[92] * u_contQ);
    const double u_g1 = relu(kb[30] + kc[93] * p->h1 + kc[94] * p->W + kc[95] * x[2] + kc[96] * u_lt8);
    const double u_c1 = relu(kb[31] + kc[97] * x[13] + kc[98] * u_lt8);
    const double u_hold1 = relu(kb[32] + kc[99] * p->h1 + kc[100] * u_lt8);
    const double u_g2 = relu(kb[33] + kc[101] * p->h2 + kc[102] * x[2] + kc[103] * u_ge8 + kc[104] * u_ge14);
    const double u_c2 = relu(kb[34] + kc[105] * x[13] + kc[106] * u_ge8 + kc[107] * u_ge14);
    const double u_hold2 = relu(kb[35] + kc[108] * p->h2 + kc[109] * u_ge8 + kc[110] * u_ge14 + kc[111] * p->W);
    const double u_h1 = relu(kb[36] + kc[112] * u_g1 + kc[113] * u_c1 + kc[114] * u_hold1);
    const double u_h2 = relu(kb[37] + kc[115] * u_g2 + kc[116] * u_c2 + kc[117] * u_hold2);
    double ge1[74];
    for (int k = 0; k < 74; k++) ge1[k] = clip1(kb[38 + k] + kc[118 + k] * u_h1);
    double le1[74];
    for (int k = 0; k < 74; k++) le1[k] = clip1(kb[112 + k] + kc[192 + k] * u_h1);
    double ge2[7];
    for (int k = 0; k < 7; k++) ge2[k] = clip1(kb[186 + k] + kc[266 + k] * u_h2);
    double le2[7];
    for (int k = 0; k < 7; k++) le2[k] = clip1(kb[193 + k] + kc[273 + k] * u_h2);
    const double u_KW_short = clip1(kb[200] + kc[280] * u_h2 + kc[281] * ge1[0] + kc[282] * le1[0] + kc[283] * ge1[1] + kc[284] * le1[1] + kc[285] * ge1[2] + kc[286] * le1[2] + kc[287] * ge1[5] + kc[288] * le1[5] + kc[289] * ge1[7] + kc[290] * le1[7] + kc[291] * ge1[9] + kc[292] * le1[9] + kc[293] * ge1[10] + kc[294] * le1[10] + kc[295] * ge1[11] + kc[296] * le1[11] + kc[297] * ge1[17] + kc[298] * le1[17] + kc[299] * ge1[18] + kc[300] * le1[18] + kc[301] * ge1[24] + kc[302] * le1[24] + kc[303] * ge1[25] + kc[304] * le1[25] + kc[305] * ge1[28] + kc[306] * le1[28] + kc[307] * ge1[29] + kc[308] * le1[29] + kc[309] * ge1[31] + kc[310] * le1[31] + kc[311] * ge1[33] + kc[312] * le1[33] + kc[313] * ge1[35] + kc[314] * le1[35] + kc[315] * ge1[36] + kc[316] * le1[36] + kc[317] * ge1[37] + kc[318] * le1[37] + kc[319] * ge1[39] + kc[320] * le1[39] + kc[321] * ge1[40] + kc[322] * le1[40] + kc[323] * ge1[41] + kc[324] * le1[41] + kc[325] * ge1[42] + kc[326] * le1[42] + kc[327] * ge1[48] + kc[328] * le1[48] + kc[329] * ge1[52] + kc[330] * le1[52] + kc[331] * ge1[54] + kc[332] * le1[54] + kc[333] * ge1[57] + kc[334] * le1[57] + kc[335] * ge1[58] + kc[336] * le1[58] + kc[337] * ge1[66] + kc[338] * le1[66] + kc[339] * ge1[67] + kc[340] * le1[67] + kc[341] * ge1[68] + kc[342] * le1[68] + kc[343] * ge1[70] + kc[344] * le1[70]);
    const double u_is__Noreturn = clip1(kb[201] + kc[345] * ge1[71] + kc[346] * le1[71] + kc[347] * ge2[0] + kc[348] * le2[0]);
    const double u_is__Static_assert = clip1(kb[202] + kc[349] * ge1[72] + kc[350] * le1[72] + kc[351] * ge2[6] + kc[352] * le2[6]);
    const double u_is__Thread_local = clip1(kb[203] + kc[353] * ge1[73] + kc[354] * le1[73] + kc[355] * ge2[4] + kc[356] * le2[4]);
    const double u_is_constexpr = clip1(kb[204] + kc[357] * ge1[53] + kc[358] * le1[53] + kc[359] * ge2[1] + kc[360] * le2[1]);
    const double u_is_static_assert = clip1(kb[205] + kc[361] * ge1[59] + kc[362] * le1[59] + kc[363] * ge2[5] + kc[364] * le2[5]);
    const double u_is_thread_local = clip1(kb[206] + kc[365] * ge1[60] + kc[366] * le1[60] + kc[367] * ge2[3] + kc[368] * le2[3]);
    const double u_KW = clip1(kb[207] + kc[369] * u_KW_short + kc[370] * u_is__Noreturn + kc[371] * u_is__Static_assert + kc[372] * u_is__Thread_local + kc[373] * u_is_constexpr + kc[374] * u_is_static_assert + kc[375] * u_is_thread_local);
    const double u_TY_short = clip1(kb[208] + kc[376] * u_h2 + kc[377] * ge1[3] + kc[378] * le1[3] + kc[379] * ge1[6] + kc[380] * le1[6] + kc[381] * ge1[8] + kc[382] * le1[8] + kc[383] * ge1[12] + kc[384] * le1[12] + kc[385] * ge1[14] + kc[386] * le1[14] + kc[387] * ge1[15] + kc[388] * le1[15] + kc[389] * ge1[20] + kc[390] * le1[20] + kc[391] * ge1[21] + kc[392] * le1[21] + kc[393] * ge1[22] + kc[394] * le1[22] + kc[395] * ge1[23] + kc[396] * le1[23] + kc[397] * ge1[26] + kc[398] * le1[26] + kc[399] * ge1[27] + kc[400] * le1[27] + kc[401] * ge1[30] + kc[402] * le1[30] + kc[403] * ge1[32] + kc[404] * le1[32] + kc[405] * ge1[34] + kc[406] * le1[34] + kc[407] * ge1[38] + kc[408] * le1[38] + kc[409] * ge1[43] + kc[410] * le1[43] + kc[411] * ge1[44] + kc[412] * le1[44] + kc[413] * ge1[45] + kc[414] * le1[45] + kc[415] * ge1[47] + kc[416] * le1[47] + kc[417] * ge1[49] + kc[418] * le1[49] + kc[419] * ge1[50] + kc[420] * le1[50] + kc[421] * ge1[51] + kc[422] * le1[51] + kc[423] * ge1[55] + kc[424] * le1[55] + kc[425] * ge1[62] + kc[426] * le1[62] + kc[427] * ge1[63] + kc[428] * le1[63] + kc[429] * ge1[64] + kc[430] * le1[64] + kc[431] * ge1[65] + kc[432] * le1[65] + kc[433] * ge1[69] + kc[434] * le1[69]);
    const double u_is_ptrdiff_t = clip1(kb[209] + kc[435] * ge1[56] + kc[436] * le1[56] + kc[437] * ge2[2] + kc[438] * le2[2]);
    const double u_is_uintptr_t = clip1(kb[210] + kc[439] * ge1[61] + kc[440] * le1[61] + kc[441] * ge2[2] + kc[442] * le2[2]);
    const double u_TY = clip1(kb[211] + kc[443] * u_TY_short + kc[444] * u_is_ptrdiff_t + kc[445] * u_is_uintptr_t);
    const double u_CONST_short = clip1(kb[212] + kc[446] * u_h2 + kc[447] * ge1[4] + kc[448] * le1[4] + kc[449] * ge1[13] + kc[450] * le1[13] + kc[451] * ge1[16] + kc[452] * le1[16] + kc[453] * ge1[19] + kc[454] * le1[19] + kc[455] * ge1[46] + kc[456] * le1[46]);
    const double u_CONST = clip1(kb[213] + kc[457] * u_CONST_short);
    s->C = u_C;
    s->L = u_L;
    s->S = u_S;
    s->Q = u_Q;
    s->P = u_P;
    s->E = u_E;
    s->sf = u_sf;
    s->star_in = u_star_in;
    s->closed = u_closed;
    s->Sclose = u_Sclose;
    s->Qclose = u_Qclose;
    s->ls = u_ls;
    s->bsP = u_bsP;
    s->W = u_W;
    s->N = u_N;
    s->d = u_d;
    s->h1 = u_h1;
    s->h2 = u_h2;
    return (uint16_t)(((uint16_t)(u_C != 0.0) << 0) | ((uint16_t)(u_L != 0.0) << 1) | ((uint16_t)(u_S != 0.0) << 2) | ((uint16_t)(u_Q != 0.0) << 3) | ((uint16_t)(u_P != 0.0) << 4) | ((uint16_t)(u_W != 0.0) << 5) | ((uint16_t)(u_N != 0.0) << 6) | ((uint16_t)(u_KW != 0.0) << 7) | ((uint16_t)(u_TY != 0.0) << 8) | ((uint16_t)(u_CONST != 0.0) << 9) | ((uint16_t)(u_copen2 != 0.0) << 10) | ((uint16_t)(x[9] != 0.0) << 11) | ((uint16_t)(x[4] != 0.0) << 12) | ((uint16_t)(x[5] != 0.0) << 13) | ((uint16_t)(x[12] != 0.0) << 14));
}

/* One backward step: forward bits + right-neighbour state r -> new state s, class id. */
static inline int k_bwd_step(const double *restrict kc, const double *restrict kb,
                             uint16_t bits, const BState *restrict r, BState *restrict s) {
    const double f_C = (double)((bits >> 0) & 1);
    const double f_L = (double)((bits >> 1) & 1);
    const double f_S = (double)((bits >> 2) & 1);
    const double f_Q = (double)((bits >> 3) & 1);
    const double f_P = (double)((bits >> 4) & 1);
    const double f_W = (double)((bits >> 5) & 1);
    const double f_N = (double)((bits >> 6) & 1);
    const double f_KW = (double)((bits >> 7) & 1);
    const double f_TY = (double)((bits >> 8) & 1);
    const double f_CONST = (double)((bits >> 9) & 1);
    const double f_copen2 = (double)((bits >> 10) & 1);
    const double f_slash = (double)((bits >> 11) & 1);
    const double f_space = (double)((bits >> 12) & 1);
    const double f_nl = (double)((bits >> 13) & 1);
    const double f_lparen = (double)((bits >> 14) & 1);
    const double u_lps = clip1(kb[214] + kc[458] * f_lparen + kc[459] * f_space + kc[460] * r->lps);
    const double u_cmt = clip1(kb[215] + kc[461] * f_C + kc[462] * f_L + kc[463] * f_slash + kc[464] * r->copen2);
    const double u_kwc_end = clip1(kb[216] + kc[465] * f_W + kc[466] * r->W + kc[467] * f_KW);
    const double u_kwc_carry = clip1(kb[217] + kc[468] * f_W + kc[469] * r->W + kc[470] * r->kwc);
    const double u_tyc_end = clip1(kb[218] + kc[471] * f_W + kc[472] * r->W + kc[473] * f_TY);
    const double u_tyc_carry = clip1(kb[219] + kc[474] * f_W + kc[475] * r->W + kc[476] * r->tyc);
    const double u_cst_end = clip1(kb[220] + kc[477] * f_W + kc[478] * r->W + kc[479] * f_CONST);
    const double u_cst_carry = clip1(kb[221] + kc[480] * f_W + kc[481] * r->W + kc[482] * r->cst);
    const double u_fnc_end = clip1(kb[222] + kc[483] * f_W + kc[484] * r->W + kc[485] * r->lps + kc[486] * f_KW + kc[487] * f_TY + kc[488] * f_CONST);
    const double u_fnc_carry = clip1(kb[223] + kc[489] * f_W + kc[490] * r->W + kc[491] * r->fnc);
    const double u_kwc = clip1(kb[224] + kc[492] * u_kwc_end + kc[493] * u_kwc_carry);
    const double u_tyc = clip1(kb[225] + kc[494] * u_tyc_end + kc[495] * u_tyc_carry);
    const double u_cst = clip1(kb[226] + kc[496] * u_cst_end + kc[497] * u_cst_carry);
    const double u_fnc = clip1(kb[227] + kc[498] * u_fnc_end + kc[499] * u_fnc_carry);
    s->W = f_W;
    s->copen2 = f_copen2;
    s->lps = u_lps;
    s->kwc = u_kwc;
    s->tyc = u_tyc;
    s->cst = u_cst;
    s->fnc = u_fnc;
    double logit[K_N_CLASSES];
    logit[0] = kb[228];
    logit[1] = kb[229] + kc[500] * u_kwc;
    logit[2] = kb[230] + kc[501] * u_tyc;
    logit[3] = kb[231] + kc[502] * u_fnc;
    logit[4] = kb[232] + kc[503] * f_W;
    logit[5] = kb[233] + kc[504] * u_cst + kc[505] * f_N;
    logit[6] = kb[234] + kc[506] * f_S;
    logit[7] = kb[235] + kc[507] * f_Q;
    logit[8] = kb[236] + kc[508] * u_cmt;
    logit[9] = kb[237] + kc[509] * f_P;
    logit[10] = kb[238] + kc[510] * f_space + kc[511] * f_nl;
    int best = 0;
    for (int k = 1; k < K_N_CLASSES; k++) if (logit[k] > logit[best]) best = k;
    return best;
}

/* Where each kc[i] / kb[i] comes from: {cell (0 fwd, 1 bwd, 2 head), layer, row, col} */
static const int32_t K_COEF[K_N_COEF][4] = {
{0,0,0,14},{0,0,0,22},{0,0,1,15},{0,0,1,5},{0,0,2,16},{0,0,2,23},{0,0,2,5},{0,0,3,17},{0,0,3,24},{0,0,3,5},{0,0,4,18},{0,0,4,5},{0,0,4,26},{0,0,5,10},{0,0,5,20},{0,0,6,9},{0,0,6,20},{0,0,7,9},{0,0,7,21},{0,0,8,5},{0,0,8,25},{0,0,8,4},{0,0,9,27},{0,0,9,2},{0,0,10,0},{0,0,10,28},{0,0,11,28},{0,0,11,1},{0,0,12,29},{0,0,12,27},{0,0,13,29},{0,0,13,27},{0,0,14,27},{0,0,14,29},{0,0,15,27},{0,0,15,29},{0,1,0,5},{0,1,0,0},{0,1,1,6},{0,1,1,1},{0,1,2,5},{0,1,2,6},{0,1,3,20},{0,1,3,0},{0,1,3,1},{0,1,3,2},{0,1,3,3},{0,1,4,21},{0,1,4,0},{0,1,4,1},{0,1,4,2},{0,1,4,3},{0,1,5,25},{0,1,5,29},{0,1,5,0},{0,1,5,1},{0,1,5,2},{0,1,5,3},{0,1,5,4},{0,1,6,2},{0,1,6,20},{0,1,6,28},{0,1,7,3},{0,1,7,21},{0,1,7,28},{0,1,8,2},{0,1,8,3},{0,1,8,22},{0,1,8,28},{0,1,9,24},{0,1,9,0},{0,1,10,23},{0,1,10,0},{0,1,10,1},{0,1,10,2},{0,1,10,3},{0,1,10,6},{0,1,11,4},{0,1,11,22},{0,1,12,9},{0,1,12,10},{0,1,12,0},{0,1,12,1},{0,1,12,2},{0,1,12,3},{0,1,13,17},{0,1,13,11},{0,1,13,9},{0,1,13,10},{0,1,13,0},{0,1,13,1},{0,1,13,2},{0,1,13,3},{0,1,14,31},{0,1,14,30},{0,1,14,16},{0,1,14,13},{0,1,15,27},{0,1,15,13},{0,1,16,31},{0,1,16,13},{0,1,17,32},{0,1,17,16},{0,1,17,14},{0,1,17,15},{0,1,18,27},{0,1,18,14},{0,1,18,15},{0,1,19,32},{0,1,19,14},{0,1,19,15},{0,1,19,30},{0,2,0,14},{0,2,0,15},{0,2,0,16},{0,2,1,17},{0,2,1,18},{0,2,1,19},{0,3,12,0},{0,3,24,0},{0,3,20,0},{0,3,94,0},{0,3,160,0},{0,3,0,0},{0,3,106,0},{0,3,4,0},{0,3,88,0},{0,3,14,0},{0,3,16,0},{0,3,22,0},{0,3,96,0},{0,3,156,0},{0,3,104,0},{0,3,148,0},{0,3,152,0},{0,3,2,0},{0,3,6,0},{0,3,158,0},{0,3,92,0},{0,3,128,0},{0,3,130,0},{0,3,98,0},{0,3,44,0},{0,3,48,0},{0,3,108,0},{0,3,90,0},{0,3,18,0},{0,3,26,0},{0,3,132,0},{0,3,32,0},{0,3,100,0},{0,3,34,0},{0,3,112,0},{0,3,36,0},{0,3,38,0},{0,3,40,0},{0,3,126,0},{0,3,86,0},{0,3,70,0},{0,3,72,0},{0,3,10,0},{0,3,134,0},{0,3,136,0},{0,3,138,0},{0,3,154,0},{0,3,114,0},{0,3,42,0},{0,3,140,0},{0,3,150,0},{0,3,124,0},{0,3,54,0},{0,3,74,0},{0,3,8,0},{0,3,120,0},{0,3,116,0},{0,3,28,0},{0,3,30,0},{0,3,78,0},{0,3,82,0},{0,3,122,0},{0,3,142,0},{0,3,144,0},{0,3,146,0},{0,3,102,0},{0,3,46,0},{0,3,50,0},{0,3,52,0},{0,3,110,0},{0,3,56,0},{0,3,58,0},{0,3,62,0},{0,3,66,0},{0,3,13,0},{0,3,25,0},{0,3,21,0},{0,3,95,0},{0,3,161,0},{0,3,1,0},{0,3,107,0},{0,3,5,0},{0,3,89,0},{0,3,15,0},{0,3,17,0},{0,3,23,0},{0,3,97,0},{0,3,157,0},{0,3,105,0},{0,3,149,0},{0,3,153,0},{0,3,3,0},{0,3,7,0},{0,3,159,0},{0,3,93,0},{0,3,129,0},{0,3,131,0},{0,3,99,0},{0,3,45,0},{0,3,49,0},{0,3,109,0},{0,3,91,0},{0,3,19,0},{0,3,27,0},{0,3,133,0},{0,3,33,0},{0,3,101,0},{0,3,35,0},{0,3,113,0},{0,3,37,0},{0,3,39,0},{0,3,41,0},{0,3,127,0},{0,3,87,0},{0,3,71,0},{0,3,73,0},{0,3,11,0},{0,3,135,0},{0,3,137,0},{0,3,139,0},{0,3,155,0},{0,3,115,0},{0,3,43,0},{0,3,141,0},{0,3,151,0},{0,3,125,0},{0,3,55,0},{0,3,75,0},{0,3,9,0},{0,3,121,0},{0,3,117,0},{0,3,29,0},{0,3,31,0},{0,3,79,0},{0,3,83,0},{0,3,123,0},{0,3,143,0},{0,3,145,0},{0,3,147,0},{0,3,103,0},{0,3,47,0},{0,3,51,0},{0,3,53,0},{0,3,111,0},{0,3,57,0},{0,3,59,0},{0,3,63,0},{0,3,67,0},{0,3,60,1},{0,3,76,1},{0,3,118,1},{0,3,84,1},{0,3,68,1},{0,3,80,1},{0,3,64,1},{0,3,61,1},{0,3,77,1},{0,3,119,1},{0,3,85,1},{0,3,69,1},{0,3,81,1},{0,3,65,1},{0,4,0,163},{0,4,0,12},{0,4,0,13},{0,4,0,24},{0,4,0,25},{0,4,0,20},{0,4,0,21},{0,4,0,0},{0,4,0,1},{0,4,0,4},{0,4,0,5},{0,4,0,14},{0,4,0,15},{0,4,0,16},{0,4,0,17},{0,4,0,22},{0,4,0,23},{0,4,0,2},{0,4,0,3},{0,4,0,6},{0,4,0,7},{0,4,0,44},{0,4,0,45},{0,4,0,48},{0,4,0,49},{0,4,0,18},{0,4,0,19},{0,4,0,26},{0,4,0,27},{0,4,0,32},{0,4,0,33},{0,4,0,34},{0,4,0,35},{0,4,0,36},{0,4,0,37},{0,4,0,38},{0,4,0,39},{0,4,0,40},{0,4,0,41},{0,4,0,86},{0,4,0,87},{0,4,0,70},{0,4,0,71},{0,4,0,72},{0,4,0,73},{0,4,0,10},{0,4,0,11},{0,4,0,42},{0,4,0,43},{0,4,0,54},{0,4,0,55},{0,4,0,8},{0,4,0,9},{0,4,0,28},{0,4,0,29},{0,4,0,30},{0,4,0,31},{0,4,0,46},{0,4,0,47},{0,4,0,50},{0,4,0,51},{0,4,0,52},{0,4,0,53},{0,4,0,56},{0,4,0,57},{0,4,1,58},{0,4,1,59},{0,4,1,60},{0,4,1,61},{0,4,2,62},{0,4,2,63},{0,4,2,64},{0,4,2,65},{0,4,3,66},{0,4,3,67},{0,4,3,68},{0,4,3,69},{0,4,4,74},{0,4,4,75},{0,4,4,76},{0,4,4,77},{0,4,5,78},{0,4,5,79},{0,4,5,80},{0,4,5,81},{0,4,6,82},{0,4,6,83},{0,4,6,84},{0,4,6,85},{0,5,0,0},{0,5,0,1},{0,5,0,2},{0,5,0,3},{0,5,0,4},{0,5,0,5},{0,5,0,6},{0,4,7,163},{0,4,7,94},{0,4,7,95},{0,4,7,106},{0,4,7,107},{0,4,7,88},{0,4,7,89},{0,4,7,96},{0,4,7,97},{0,4,7,104},{0,4,7,105},{0,4,7,148},{0,4,7,149},{0,4,7,92},{0,4,7,93},{0,4,7,128},{0,4,7,129},{0,4,7,130},{0,4,7,131},{0,4,7,98},{0,4,7,99},{0,4,7,108},{0,4,7,109},{0,4,7,90},{0,4,7,91},{0,4,7,132},{0,4,7,133},{0,4,7,100},{0,4,7,101},{0,4,7,112},{0,4,7,113},{0,4,7,126},{0,4,7,127},{0,4,7,134},{0,4,7,135},{0,4,7,136},{0,4,7,137},{0,4,7,138},{0,4,7,139},{0,4,7,114},{0,4,7,115},{0,4,7,140},{0,4,7,141},{0,4,7,150},{0,4,7,151},{0,4,7,124},{0,4,7,125},{0,4,7,120},{0,4,7,121},{0,4,7,142},{0,4,7,143},{0,4,7,144},{0,4,7,145},{0,4,7,146},{0,4,7,147},{0,4,7,102},{0,4,7,103},{0,4,7,110},{0,4,7,111},{0,4,8,116},{0,4,8,117},{0,4,8,118},{0,4,8,119},{0,4,9,122},{0,4,9,123},{0,4,9,118},{0,4,9,119},{0,5,1,7},{0,5,1,8},{0,5,1,9},{0,4,10,163},{0,4,10,160},{0,4,10,161},{0,4,10,156},{0,4,10,157},{0,4,10,152},{0,4,10,153},{0,4,10,158},{0,4,10,159},{0,4,10,154},{0,4,10,155},{0,5,2,10},{1,0,0,14},{1,0,0,12},{1,0,0,17},{1,0,1,0},{1,0,1,1},{1,0,1,11},{1,0,1,16},{1,0,2,5},{1,0,2,15},{1,0,2,7},{1,0,3,5},{1,0,3,15},{1,0,3,18},{1,0,4,5},{1,0,4,15},{1,0,4,8},{1,0,5,5},{1,0,5,15},{1,0,5,19},{1,0,6,5},{1,0,6,15},{1,0,6,9},{1,0,7,5},{1,0,7,15},{1,0,7,20},{1,0,8,5},{1,0,8,15},{1,0,8,17},{1,0,8,7},{1,0,8,8},{1,0,8,9},{1,0,9,5},{1,0,9,15},{1,0,9,21},{1,1,0,2},{1,1,0,3},{1,1,1,4},{1,1,1,5},{1,1,2,6},{1,1,2,7},{1,1,3,8},{1,1,3,9},{2,0,1,0},{2,0,2,1},{2,0,3,3},{2,0,4,9},{2,0,5,2},{2,0,5,10},{2,0,6,6},{2,0,7,7},{2,0,8,5},{2,0,9,8},{2,0,10,12},{2,0,10,13}
};
static const int32_t K_BIAS[K_N_BIAS][3] = {
{0,0,0},{0,0,1},{0,0,2},{0,0,3},{0,0,4},{0,0,5},{0,0,6},{0,0,7},{0,0,8},{0,0,9},{0,0,10},{0,0,11},{0,0,12},{0,0,13},{0,0,14},{0,0,15},{0,1,0},{0,1,1},{0,1,2},{0,1,3},{0,1,4},{0,1,5},{0,1,6},{0,1,7},{0,1,8},{0,1,9},{0,1,10},{0,1,11},{0,1,12},{0,1,13},{0,1,14},{0,1,15},{0,1,16},{0,1,17},{0,1,18},{0,1,19},{0,2,0},{0,2,1},{0,3,12},{0,3,24},{0,3,20},{0,3,94},{0,3,160},{0,3,0},{0,3,106},{0,3,4},{0,3,88},{0,3,14},{0,3,16},{0,3,22},{0,3,96},{0,3,156},{0,3,104},{0,3,148},{0,3,152},{0,3,2},{0,3,6},{0,3,158},{0,3,92},{0,3,128},{0,3,130},{0,3,98},{0,3,44},{0,3,48},{0,3,108},{0,3,90},{0,3,18},{0,3,26},{0,3,132},{0,3,32},{0,3,100},{0,3,34},{0,3,112},{0,3,36},{0,3,38},{0,3,40},{0,3,126},{0,3,86},{0,3,70},{0,3,72},{0,3,10},{0,3,134},{0,3,136},{0,3,138},{0,3,154},{0,3,114},{0,3,42},{0,3,140},{0,3,150},{0,3,124},{0,3,54},{0,3,74},{0,3,8},{0,3,120},{0,3,116},{0,3,28},{0,3,30},{0,3,78},{0,3,82},{0,3,122},{0,3,142},{0,3,144},{0,3,146},{0,3,102},{0,3,46},{0,3,50},{0,3,52},{0,3,110},{0,3,56},{0,3,58},{0,3,62},{0,3,66},{0,3,13},{0,3,25},{0,3,21},{0,3,95},{0,3,161},{0,3,1},{0,3,107},{0,3,5},{0,3,89},{0,3,15},{0,3,17},{0,3,23},{0,3,97},{0,3,157},{0,3,105},{0,3,149},{0,3,153},{0,3,3},{0,3,7},{0,3,159},{0,3,93},{0,3,129},{0,3,131},{0,3,99},{0,3,45},{0,3,49},{0,3,109},{0,3,91},{0,3,19},{0,3,27},{0,3,133},{0,3,33},{0,3,101},{0,3,35},{0,3,113},{0,3,37},{0,3,39},{0,3,41},{0,3,127},{0,3,87},{0,3,71},{0,3,73},{0,3,11},{0,3,135},{0,3,137},{0,3,139},{0,3,155},{0,3,115},{0,3,43},{0,3,141},{0,3,151},{0,3,125},{0,3,55},{0,3,75},{0,3,9},{0,3,121},{0,3,117},{0,3,29},{0,3,31},{0,3,79},{0,3,83},{0,3,123},{0,3,143},{0,3,145},{0,3,147},{0,3,103},{0,3,47},{0,3,51},{0,3,53},{0,3,111},{0,3,57},{0,3,59},{0,3,63},{0,3,67},{0,3,60},{0,3,76},{0,3,118},{0,3,84},{0,3,68},{0,3,80},{0,3,64},{0,3,61},{0,3,77},{0,3,119},{0,3,85},{0,3,69},{0,3,81},{0,3,65},{0,4,0},{0,4,1},{0,4,2},{0,4,3},{0,4,4},{0,4,5},{0,4,6},{0,5,0},{0,4,7},{0,4,8},{0,4,9},{0,5,1},{0,4,10},{0,5,2},{1,0,0},{1,0,1},{1,0,2},{1,0,3},{1,0,4},{1,0,5},{1,0,6},{1,0,7},{1,0,8},{1,0,9},{1,1,0},{1,1,1},{1,1,2},{1,1,3},{2,0,0},{2,0,1},{2,0,2},{2,0,3},{2,0,4},{2,0,5},{2,0,6},{2,0,7},{2,0,8},{2,0,9},{2,0,10}
};