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}
};
|