pylexnet / pylexnet_kernel.h
Pranavz's picture
pylexnet: 827-number Python highlighter network
beaedc8 verified
Raw History Blame Contribute Delete
22.9 kB
/* Generated by compile.py: the network's ARCHITECTURE as C. No weight values live here: pylexnet.c
* loads them, checks the structure hash and the guard inequalities, and gathers kc[]/kb[] by K_COEF/K_BIAS. */
#include <stdint.h>
#include <string.h>
#define K_STRUCT_HASH 0x5AB2AC2E97E0387CULL
#define K_N_FEATS 29
#define K_N_CLASSES 9
#define K_N_BITS 10
#ifndef CLIP
#define CLIP(x, hi) clipn((x), (hi))
static inline double clipn(double x, double hi) { x = x < 0.0 ? 0.0 : x; return x > hi ? hi : x; }
#endif
/* A tied, sorted threshold family is a step vector: unit k is 1 iff kb[k] + w*h >= 1, true for k < rank.
* The loader verifies integrality, tying and monotonicity, so a binary search gives the same values. */
static inline int k_rank(const double *kb, int n, double w, double h) {
int lo = 0, hi = n;
while (lo < hi) { int mid = (lo + hi) >> 1; if (kb[mid] + w * h >= 1.0) lo = mid + 1; else hi = mid; }
return lo;
}
typedef struct { double S, sq1, T, F, E, c, fo, FS, FD, oq1, oT, C, N, ee, W, d, pf, fp, cD, cC, cAt, atp, cDot, pos0, pos1, pos2, pos3, pos4, pos5, pos6, tail, A, e1, e2, e2d, e3, e3d, e3dd; } FState;
typedef struct { double u_reg_KW, u_reg_BI, u_reg_FN, u_reg_CL, u_reg_DEC, u_reg_STR, b_ev_KW, b_ev_BI, b_ev_FN, b_ev_CL, b_ev_DEC, b_ev_STR; } BState;
static inline void k_init_state(FState *s, const double *h0) { memcpy(s, h0, sizeof *s); }
static inline __attribute__((always_inline)) uint16_t k_fwd_step(const double *restrict kc, const double *restrict kb, const double *restrict kp, const double *restrict x,
const FState *restrict p, FState *restrict s) {
double u_wordch = 0.0, u_qmd = 0.0, u_qms = 0.0, u_c2 = 0.0, u_wend = 0.0, u_fieldopen = 0.0, u_pf_new = 0.0, u_S_eff = 0.0, u_fp_new = 0.0, u_sclose = 0.0, u_tclose = 0.0, u_tripleopen = 0.0, u_nlclose = 0.0, u_E_new = 0.0, u_fo_new = 0.0, u_C_new = 0.0, u_open = 0.0, u_open_f = 0.0, u_open_qs = 0.0, u_fieldclose = 0.0, u_inc = 0.0, u_dec = 0.0, u_S_new = 0.0, u_c_new = 0.0, u_T_new = 0.0, u_F_new = 0.0, u_sq1_new = 0.0, u_FS_new = 0.0, u_FD_new = 0.0, u_oq1_new = 0.0, u_oT_new = 0.0, u_lab_STR = 0.0, u_N_new = 0.0, u_ee_new = 0.0, u_W_new = 0.0, u_d_new = 0.0, u_pos0 = 0.0, u_pos1 = 0.0, u_pos2 = 0.0, u_pos3 = 0.0, u_pos4 = 0.0, u_pos5 = 0.0, u_pos6 = 0.0, u_tail = 0.0, u_a0 = 0.0, u_a1 = 0.0, u_a2 = 0.0, u_a3 = 0.0, u_a4 = 0.0, u_a5 = 0.0, u_a6 = 0.0, u_at_ = 0.0, u_A_new = 0.0, u_e1_new = 0.0, u_e2_new = 0.0, u_e3_new = 0.0, u_e2d_new = 0.0, u_e3d_new = 0.0, u_e3dd_new = 0.0, u_m3 = 0.0, u_SE = 0.0, u_ge1 = 0.0, u_le1 = 0.0, u_ge2 = 0.0, u_le2 = 0.0, u_ge3 = 0.0, u_le3 = 0.0, u_ge4 = 0.0, u_le4 = 0.0, u_ge5 = 0.0, u_le5 = 0.0, u_is_def = 0.0, u_is_class = 0.0, u_cD_new = 0.0, u_cC_new = 0.0, u_atp_new = 0.0, u_cAt_new = 0.0, u_cDot_new = 0.0, u_ev_DEC = 0.0, u_ev_CL = 0.0, u_ev_KW = 0.0, u_ev_FN = 0.0, u_ev_BI = 0.0, u_ev_STR = 0.0, u_lab_W = 0.0;
if ((p->W + x[13] + x[6] + x[7] + p->atp + p->cD + p->cC + p->cAt + p->cDot + x[15] + x[14] + p->fp + p->d + p->pos0 + p->pos1 + p->pos2 + p->pos3 + p->pos4 + p->pos5 + p->pos6 + p->tail + p->e2 + p->e3 + p->e3d) != 0.0) { /* all activations are >= 0 */
u_wordch = CLIP((kb[0] + kc[0] * x[13]), 1.0);
u_wend = CLIP(((kb[1] + kc[1] * p->W) + kc[2] * x[13]), 1.0);
u_pf_new = CLIP((((kb[2] + kc[3] * x[15]) + (kc[4] * x[14] + kc[5] * p->pf)) + (kc[6] * p->W + kc[7] * p->d)), 1.0);
u_e2d_new = CLIP((kb[3] + kc[8] * p->e2), 117026723984.0);
u_e3d_new = CLIP((kb[4] + kc[9] * p->e3), 117026723984.0);
u_e3dd_new = CLIP((kb[5] + kc[10] * p->e3d), 117026723984.0);
u_m3 = CLIP((kb[6] + kc[11] * p->d), 3.0);
u_fp_new = CLIP(((kb[7] + kc[12] * x[14]) + (kc[13] * p->fp + kc[14] * u_wordch)), 1.0);
u_cAt_new = CLIP((((kb[8] + kc[15] * p->cAt) + (kc[16] * p->atp + kc[17] * u_wordch)) + kc[18] * u_wend), 1.0);
}
if ((p->S + p->fo + p->FS + p->FD + p->c + p->T + p->F + p->sq1 + p->oq1 + p->oT + x[2] + x[3]) != 0.0) { /* all activations are >= 0 */
u_qmd = CLIP(((kb[9] + kc[19] * x[2]) + (kc[20] * p->sq1 + kc[21] * p->E)), 1.0);
u_qms = CLIP(((kb[10] + kc[22] * x[3]) + (kc[23] * p->sq1 + kc[24] * p->E)), 1.0);
u_c2 = CLIP((kb[11] + kc[25] * p->c), 1.0);
u_fieldopen = CLIP(((kb[12] + kc[26] * p->fo) + kc[27] * x[8]), 1.0);
u_S_eff = CLIP((((kb[13] + kc[28] * p->S) + (kc[29] * u_fieldopen + kc[30] * p->T)) + ((kc[31] * u_qmd + kc[32] * u_qms) + kc[33] * u_c2)), 1.0);
u_sclose = CLIP((((kb[14] + kc[34] * u_S_eff) + (kc[35] * p->T + kc[36] * u_qmd)) + (kc[37] * u_qms + kc[38] * p->c)), 1.0);
u_tclose = CLIP((((kb[15] + kc[39] * u_S_eff) + (kc[40] * p->T + kc[41] * u_qmd)) + (kc[42] * u_qms + kc[43] * p->c)), 1.0);
u_tripleopen = CLIP((((kb[16] + kc[44] * u_S_eff) + (kc[45] * p->T + kc[46] * u_qmd)) + (kc[47] * u_qms + kc[48] * p->c)), 1.0);
u_nlclose = CLIP((((kb[17] + kc[49] * u_S_eff) + (kc[50] * p->T + kc[51] * x[1])) + kc[52] * p->E), 1.0);
u_E_new = CLIP(((kb[18] + kc[53] * u_S_eff) + (kc[54] * x[4] + kc[55] * p->E)), 1.0);
u_fo_new = CLIP((((kb[19] + kc[56] * u_S_eff) + (kc[57] * p->F + kc[58] * x[8])) + (kc[59] * p->E + kc[60] * p->fo)), 1.0);
u_open = CLIP((((kb[20] + kc[61] * x[2]) + (kc[62] * x[3] + kc[63] * u_S_eff)) + (kc[64] * p->C + kc[65] * p->N)), 1.0);
u_open_f = CLIP((((kb[21] + kc[66] * x[2]) + (kc[67] * x[3] + kc[68] * u_S_eff)) + ((kc[69] * p->C + kc[70] * p->N) + (kc[71] * p->pf + kc[72] * p->fp))), 1.0);
u_open_qs = CLIP((((kb[22] + kc[73] * x[2]) + (kc[74] * x[3] + kc[75] * u_S_eff)) + (kc[76] * p->C + kc[77] * p->N)), 1.0);
u_fieldclose = CLIP((((kb[23] + kc[78] * p->FS) + (kc[79] * u_S_eff + kc[80] * p->C)) + (kc[81] * p->FD + kc[82] * x[12])), 1.0);
u_inc = CLIP((((kb[24] + kc[83] * p->FS) + (kc[84] * u_S_eff + kc[85] * p->C)) + kc[86] * x[10]), 1.0);
u_dec = CLIP((((kb[25] + kc[87] * p->FS) + (kc[88] * u_S_eff + kc[89] * p->C)) + (kc[90] * x[11] + kc[91] * p->FD)), 1.0);
u_S_new = CLIP((((kb[26] + kc[92] * u_S_eff) + (kc[93] * u_sclose + kc[94] * u_tclose)) + ((kc[95] * u_nlclose + kc[96] * u_open) + kc[97] * u_fieldclose)), 1.0);
u_c_new = CLIP(((((kb[27] + kc[98] * p->c) + (kc[99] * u_S_eff + kc[100] * u_qmd)) + ((kc[101] * u_qms + kc[102] * u_tripleopen) + (kc[103] * u_tclose + kc[104] * u_sclose))) + (kc[105] * u_open + kc[106] * u_open_qs)), 3.0);
u_T_new = CLIP((((kb[28] + kc[107] * p->T) + (kc[108] * u_tripleopen + kc[109] * u_tclose)) + ((kc[110] * u_open + kc[111] * u_fieldclose) + kc[112] * p->oT)), 1.0);
u_F_new = CLIP((((kb[29] + kc[113] * p->F) + (kc[114] * u_open_f + kc[115] * u_open)) + ((kc[116] * u_sclose + kc[117] * u_tclose) + (kc[118] * u_nlclose + kc[119] * u_fieldclose))), 1.0);
u_sq1_new = CLIP(((((kb[30] + kc[120] * p->sq1) + (kc[121] * u_open_qs + kc[122] * u_sclose)) + ((kc[123] * u_tclose + kc[124] * u_nlclose) + (kc[125] * p->S + kc[126] * u_S_eff))) + (kc[127] * u_fieldclose + kc[128] * p->oq1)), 1.0);
u_FS_new = CLIP(((kb[31] + kc[129] * p->FS) + (kc[130] * u_fieldopen + kc[131] * u_fieldclose)), 1.0);
u_FD_new = CLIP(((kb[32] + kc[132] * p->FD) + (kc[133] * u_inc + kc[134] * u_dec)), 3.0);
u_oq1_new = CLIP((((kb[33] + kc[135] * p->oq1) + (kc[136] * u_fieldopen + kc[137] * p->sq1)) + kc[138] * u_fieldclose), 1.0);
u_oT_new = CLIP((((kb[34] + kc[139] * p->oT) + (kc[140] * u_fieldopen + kc[141] * p->T)) + kc[142] * u_fieldclose), 1.0);
u_lab_STR = CLIP((((kb[35] + kc[143] * u_S_eff) + (kc[144] * u_nlclose + kc[145] * u_open)) + kc[146] * u_fieldclose), 1.0);
}
if ((u_wend) != 0.0) { /* all activations are >= 0 */
u_SE = CLIP((((kb[36] + kc[147] * p->A) + (kc[148] * p->e1 + kc[149] * p->e2d)) + ((kc[150] * p->e3dd + kc[151] * p->d) + kc[152] * u_m3)), 35184372088832.0);
u_ev_DEC = CLIP(((kb[37] + kc[153] * u_wend) + kc[154] * p->cAt), 1.0);
u_ev_CL = CLIP(((kb[38] + kc[155] * u_wend) + (kc[156] * p->cC + kc[157] * p->cAt)), 1.0);
u_ev_STR = CLIP(((kb[39] + kc[158] * u_wend) + (kc[159] * u_open + kc[160] * p->pf)), 1.0);
u_ge1 = CLIP((kb[40] + kc[161] * u_SE), 1.0);
u_le1 = CLIP((kb[41] + kc[162] * u_SE), 1.0);
u_ge2 = CLIP((kb[42] + kc[163] * u_SE), 1.0);
u_le2 = CLIP((kb[43] + kc[164] * u_SE), 1.0);
u_ge3 = CLIP((kb[44] + kc[165] * u_SE), 1.0);
u_le3 = CLIP((kb[45] + kc[166] * u_SE), 1.0);
u_ge4 = CLIP((kb[46] + kc[167] * u_SE), 1.0);
u_le4 = CLIP((kb[47] + kc[168] * u_SE), 1.0);
u_ge5 = CLIP((kb[48] + kc[169] * u_SE), 1.0);
u_le5 = CLIP((kb[49] + kc[170] * u_SE), 1.0);
u_is_def = CLIP(((kb[50] + kc[171] * u_wend) + (kc[172] * u_ge2 + kc[173] * u_le2)), 1.0);
u_is_class = CLIP(((kb[51] + kc[174] * u_wend) + (kc[175] * u_ge3 + kc[176] * u_le3)), 1.0);
u_ev_KW = CLIP(((((kb[52] + kc[177] * u_wend) + (kc[178] * u_ge1 + kc[179] * u_le1)) + ((kc[180] * u_ge2 + kc[181] * u_le2) + (kc[182] * u_ge3 + kc[183] * u_le3))) + ((kc[184] * p->cAt + kc[185] * p->cC) + kc[186] * p->cD)), 1.0);
u_ev_FN = CLIP((((kb[53] + kc[187] * u_wend) + (kc[188] * u_ge5 + kc[189] * u_le5)) + ((kc[190] * p->cD + kc[191] * p->cAt) + kc[192] * p->cC)), 1.0);
u_ev_BI = CLIP((((kb[54] + kc[193] * u_wend) + (kc[194] * u_ge4 + kc[195] * u_le4)) + ((kc[196] * p->cAt + kc[197] * p->cC) + (kc[198] * p->cD + kc[199] * p->cDot))), 1.0);
}
if ((p->W + x[13] + x[6] + x[7] + p->atp + p->cD + p->cC + p->cAt + p->cDot + x[15] + x[14] + p->fp + p->d + p->pos0 + p->pos1 + p->pos2 + p->pos3 + p->pos4 + p->pos5 + p->pos6 + p->tail + p->e2 + p->e3 + p->e3d) != 0.0) { /* all activations are >= 0 */
u_W_new = CLIP((((kb[55] + kc[200] * u_wordch) + (kc[201] * x[0] + kc[202] * p->W)) + ((kc[203] * p->N + kc[204] * u_S_eff) + kc[205] * p->C)), 1.0);
u_atp_new = CLIP(((kb[56] + kc[206] * x[7]) + (kc[207] * u_S_eff + kc[208] * p->C)), 1.0);
u_cDot_new = CLIP((((kb[57] + kc[209] * x[6]) + (kc[210] * u_S_eff + kc[211] * p->C)) + ((kc[212] * p->N + kc[213] * p->cDot) + (kc[214] * u_wordch + kc[215] * u_wend))), 1.0);
u_cD_new = CLIP((((kb[58] + kc[216] * p->cD) + (kc[217] * u_is_def + kc[218] * u_wend)) + kc[219] * x[1]), 1.0);
u_cC_new = CLIP((((kb[59] + kc[220] * p->cC) + (kc[221] * u_is_class + kc[222] * u_wend)) + kc[223] * x[1]), 1.0);
u_d_new = CLIP(((kb[60] + kc[224] * p->d) + kc[225] * u_W_new), 30.0);
u_pos0 = CLIP(((kb[61] + kc[226] * u_W_new) + kc[227] * p->W), 1.0);
u_pos1 = CLIP(((kb[62] + kc[228] * p->pos0) + kc[229] * u_W_new), 1.0);
u_pos2 = CLIP(((kb[63] + kc[230] * p->pos1) + kc[231] * u_W_new), 1.0);
u_pos3 = CLIP(((kb[64] + kc[232] * p->pos2) + kc[233] * u_W_new), 1.0);
u_pos4 = CLIP(((kb[65] + kc[234] * p->pos3) + kc[235] * u_W_new), 1.0);
u_pos5 = CLIP(((kb[66] + kc[236] * p->pos4) + kc[237] * u_W_new), 1.0);
u_pos6 = CLIP(((kb[67] + kc[238] * p->pos5) + kc[239] * u_W_new), 1.0);
u_tail = CLIP(((kb[68] + kc[240] * p->pos6) + (kc[241] * p->tail + kc[242] * u_W_new)), 1.0);
u_e1_new = CLIP(((kb[69] + kc[243] * x[26]) + kc[244] * u_W_new), 117026723984.0);
u_e2_new = CLIP(((kb[70] + kc[245] * x[27]) + kc[246] * u_W_new), 117026723984.0);
u_e3_new = CLIP(((kb[71] + kc[247] * x[28]) + kc[248] * u_W_new), 117026723984.0);
u_lab_W = CLIP(((kb[72] + kc[249] * u_W_new) + kc[250] * u_atp_new), 1.0);
u_a0 = CLIP(((kb[73] + kc[251] * x[18]) + kc[252] * u_pos0), 117026723984.0);
u_a1 = CLIP(((kb[74] + kc[253] * x[19]) + kc[254] * u_pos1), 117026723984.0);
u_a2 = CLIP(((kb[75] + kc[255] * x[20]) + kc[256] * u_pos2), 117026723984.0);
u_a3 = CLIP(((kb[76] + kc[257] * x[21]) + kc[258] * u_pos3), 117026723984.0);
u_a4 = CLIP(((kb[77] + kc[259] * x[22]) + kc[260] * u_pos4), 117026723984.0);
u_a5 = CLIP(((kb[78] + kc[261] * x[23]) + kc[262] * u_pos5), 117026723984.0);
u_a6 = CLIP(((kb[79] + kc[263] * x[24]) + kc[264] * u_pos6), 117026723984.0);
u_at_ = CLIP(((kb[80] + kc[265] * x[25]) + kc[266] * u_tail), 117026723984.0);
u_A_new = CLIP(((((kb[81] + kc[267] * p->A) + (kc[268] * u_W_new + kc[269] * u_a0)) + ((kc[270] * u_a1 + kc[271] * u_a2) + (kc[272] * u_a3 + kc[273] * u_a4))) + ((kc[274] * u_a5 + kc[275] * u_a6) + kc[276] * u_at_)), 35184372088832.0);
}
if ((x[5] + p->C) != 0.0) { /* all activations are >= 0 */
u_C_new = CLIP((((kb[82] + kc[277] * x[5]) + (kc[278] * u_S_eff + kc[279] * p->C)) + kc[280] * x[1]), 1.0);
}
if ((x[0] + p->N + p->ee) != 0.0) { /* all activations are >= 0 */
u_N_new = CLIP(((((kb[83] + kc[281] * x[0]) + (kc[282] * p->W + kc[283] * p->N)) + ((kc[284] * u_wordch + kc[285] * x[6]) + (kc[286] * x[17] + kc[287] * p->ee))) + (kc[288] * u_S_eff + kc[289] * p->C)), 1.0);
u_ee_new = CLIP(((kb[84] + kc[290] * x[16]) + kc[291] * u_N_new), 1.0);
}
s->S = u_S_new;
s->sq1 = u_sq1_new;
s->T = u_T_new;
s->F = u_F_new;
s->E = u_E_new;
s->c = u_c_new;
s->fo = u_fo_new;
s->FS = u_FS_new;
s->FD = u_FD_new;
s->oq1 = u_oq1_new;
s->oT = u_oT_new;
s->C = u_C_new;
s->N = u_N_new;
s->ee = u_ee_new;
s->W = u_W_new;
s->d = u_d_new;
s->pf = u_pf_new;
s->fp = u_fp_new;
s->cD = u_cD_new;
s->cC = u_cC_new;
s->cAt = u_cAt_new;
s->atp = u_atp_new;
s->cDot = u_cDot_new;
s->pos0 = u_pos0;
s->pos1 = u_pos1;
s->pos2 = u_pos2;
s->pos3 = u_pos3;
s->pos4 = u_pos4;
s->pos5 = u_pos5;
s->pos6 = u_pos6;
s->tail = u_tail;
s->A = u_A_new;
s->e1 = u_e1_new;
s->e2 = u_e2_new;
s->e2d = u_e2d_new;
s->e3 = u_e3_new;
s->e3d = u_e3d_new;
s->e3dd = u_e3dd_new;
return (uint16_t)(((uint16_t)(u_lab_STR != 0.0) << 0) | ((uint16_t)(u_C_new != 0.0) << 1) | ((uint16_t)(u_N_new != 0.0) << 2) | ((uint16_t)(u_lab_W != 0.0) << 3) | ((uint16_t)(u_ev_KW != 0.0) << 4) | ((uint16_t)(u_ev_BI != 0.0) << 5) | ((uint16_t)(u_ev_FN != 0.0) << 6) | ((uint16_t)(u_ev_CL != 0.0) << 7) | ((uint16_t)(u_ev_DEC != 0.0) << 8) | ((uint16_t)(u_ev_STR != 0.0) << 9));
}
static inline __attribute__((always_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_lab_STR = (double)((bits >> 0) & 1);
const double f_C_new = (double)((bits >> 1) & 1);
const double f_N_new = (double)((bits >> 2) & 1);
const double f_lab_W = (double)((bits >> 3) & 1);
const double f_ev_KW = (double)((bits >> 4) & 1);
const double f_ev_BI = (double)((bits >> 5) & 1);
const double f_ev_FN = (double)((bits >> 6) & 1);
const double f_ev_CL = (double)((bits >> 7) & 1);
const double f_ev_DEC = (double)((bits >> 8) & 1);
const double f_ev_STR = (double)((bits >> 9) & 1);
const double u_reg_KW = CLIP(((kb[85] + kc[292] * r->b_ev_KW) + (kc[293] * r->u_reg_KW + kc[294] * f_lab_W)), 1.0);
const double u_reg_BI = CLIP(((kb[86] + kc[295] * r->b_ev_BI) + (kc[296] * r->u_reg_BI + kc[297] * f_lab_W)), 1.0);
const double u_reg_FN = CLIP(((kb[87] + kc[298] * r->b_ev_FN) + (kc[299] * r->u_reg_FN + kc[300] * f_lab_W)), 1.0);
const double u_reg_CL = CLIP(((kb[88] + kc[301] * r->b_ev_CL) + (kc[302] * r->u_reg_CL + kc[303] * f_lab_W)), 1.0);
const double u_reg_DEC = CLIP(((kb[89] + kc[304] * r->b_ev_DEC) + (kc[305] * r->u_reg_DEC + kc[306] * f_lab_W)), 1.0);
const double u_reg_STR = CLIP(((kb[90] + kc[307] * r->b_ev_STR) + (kc[308] * r->u_reg_STR + kc[309] * f_lab_W)), 1.0);
s->u_reg_KW = u_reg_KW;
s->u_reg_BI = u_reg_BI;
s->u_reg_FN = u_reg_FN;
s->u_reg_CL = u_reg_CL;
s->u_reg_DEC = u_reg_DEC;
s->u_reg_STR = u_reg_STR;
s->b_ev_KW = f_ev_KW;
s->b_ev_BI = f_ev_BI;
s->b_ev_FN = f_ev_FN;
s->b_ev_CL = f_ev_CL;
s->b_ev_DEC = f_ev_DEC;
s->b_ev_STR = f_ev_STR;
return (int)CLIP(((((kb[91] + kc[310] * u_reg_KW) + (kc[311] * u_reg_BI + kc[312] * u_reg_FN)) + ((kc[313] * u_reg_CL + kc[314] * u_reg_DEC) + (kc[315] * u_reg_STR + kc[316] * f_lab_STR))) + (kc[317] * f_C_new + kc[318] * f_N_new)), 8.0);
}
#define K_N_COEF 319
#define K_N_BIAS 92
#define K_N_GUARD 74
#define K_N_FAMILY 0
#define K_N_PREFIX 0
#define K_PREFIX_LEN 0
/* sorted threshold families: {cell, layer, first bias index, rows, coef index of the tied weight} */
static const int32_t K_FAMILY[K_N_FAMILY + 1][5] = {{0,0,0,0,0}};
/* prefix sums of a unit's weights over a family's columns: {cell, layer, row, first column, rows} */
static const int32_t K_PREFIX[K_N_PREFIX + 1][5] = {{0,0,0,0,0}};
#define K_MAX_GUARD 4
static const int32_t K_COEF[K_N_COEF][4] = {{0,0,0,13},{0,0,4,43},{0,0,4,13},{0,0,6,15},{0,0,6,14},{0,0,6,45},{0,0,6,43},{0,0,6,44},{0,0,7,62},{0,0,8,64},{0,0,9,65},{0,0,10,44},{0,1,1,23},{0,1,1,54},{0,1,1,0},{0,1,3,57},{0,1,3,58},{0,1,3,0},{0,1,3,4},{0,0,1,2},{0,0,1,30},{0,0,1,33},{0,0,2,3},{0,0,2,30},{0,0,2,33},{0,0,3,34},{0,0,5,35},{0,0,5,8},{0,1,0,37},{0,1,0,5},{0,1,0,39},{0,1,0,1},{0,1,0,2},{0,1,0,3},{0,2,0,0},{0,2,0,42},{0,2,0,7},{0,2,0,8},{0,2,0,45},{0,2,1,0},{0,2,1,42},{0,2,1,7},{0,2,1,8},{0,2,1,45},{0,2,2,0},{0,2,2,42},{0,2,2,7},{0,2,2,8},{0,2,2,45},{0,2,3,0},{0,2,3,42},{0,2,3,16},{0,2,3,44},{0,2,4,0},{0,2,4,19},{0,2,4,44},{0,2,5,0},{0,2,5,43},{0,2,5,23},{0,2,5,44},{0,2,5,46},{0,2,7,17},{0,2,7,18},{0,2,7,0},{0,2,7,51},{0,2,7,52},{0,2,8,17},{0,2,8,18},{0,2,8,0},{0,2,8,51},{0,2,8,52},{0,2,8,56},{0,2,8,57},{0,2,9,17},{0,2,9,18},{0,2,9,0},{0,2,9,51},{0,2,9,52},{0,2,10,47},{0,2,10,0},{0,2,10,51},{0,2,10,48},{0,2,10,26},{0,2,11,47},{0,2,11,0},{0,2,11,51},{0,2,11,24},{0,2,12,47},{0,2,12,0},{0,2,12,51},{0,2,12,25},{0,2,12,48},{0,3,0,27},{0,3,0,0},{0,3,0,1},{0,3,0,3},{0,3,0,7},{0,3,0,10},{0,3,1,57},{0,3,1,27},{0,3,1,32},{0,3,1,33},{0,3,1,2},{0,3,1,1},{0,3,1,0},{0,3,1,7},{0,3,1,9},{0,3,2,55},{0,3,2,2},{0,3,2,1},{0,3,2,7},{0,3,2,10},{0,3,2,61},{0,3,3,56},{0,3,3,8},{0,3,3,7},{0,3,3,0},{0,3,3,1},{0,3,3,3},{0,3,3,10},{0,3,4,54},{0,3,4,9},{0,3,4,0},{0,3,4,1},{0,3,4,3},{0,3,4,53},{0,3,4,27},{0,3,4,10},{0,3,4,60},{0,3,5,58},{0,3,5,35},{0,3,5,10},{0,3,6,59},{0,3,6,11},{0,3,6,12},{0,3,7,60},{0,3,7,35},{0,3,7,54},{0,3,7,10},{0,3,8,61},{0,3,8,35},{0,3,8,55},{0,3,8,10},{0,3,9,27},{0,3,9,3},{0,3,9,7},{0,3,9,10},{0,1,2,68},{0,1,2,69},{0,1,2,70},{0,1,2,71},{0,1,2,52},{0,1,2,10},{0,1,4,4},{0,1,4,57},{0,1,5,4},{0,1,5,56},{0,1,5,57},{0,3,28,34},{0,3,28,7},{0,3,28,64},{0,2,15,2},{0,2,16,2},{0,2,17,2},{0,2,18,2},{0,2,19,2},{0,2,20,2},{0,2,21,2},{0,2,22,2},{0,2,23,2},{0,2,24,2},{0,3,23,34},{0,3,23,17},{0,3,23,18},{0,3,24,34},{0,3,24,19},{0,3,24,20},{0,3,25,34},{0,3,25,15},{0,3,25,16},{0,3,25,17},{0,3,25,18},{0,3,25,19},{0,3,25,20},{0,3,25,67},{0,3,25,66},{0,3,25,65},{0,3,26,34},{0,3,26,23},{0,3,26,24},{0,3,26,65},{0,3,26,67},{0,3,26,66},{0,3,27,34},{0,3,27,21},{0,3,27,22},{0,3,27,67},{0,3,27,66},{0,3,27,65},{0,3,27,68},{0,2,14,6},{0,2,14,15},{0,2,14,54},{0,2,14,52},{0,2,14,0},{0,2,14,51},{0,2,25,22},{0,2,25,0},{0,2,25,51},{0,2,26,21},{0,2,26,0},{0,2,26,51},{0,2,26,52},{0,2,26,61},{0,2,26,6},{0,2,26,9},{0,4,8,55},{0,4,8,23},{0,4,8,41},{0,4,8,46},{0,4,9,56},{0,4,9,24},{0,4,9,41},{0,4,9,46},{0,3,11,63},{0,3,11,14},{0,3,12,14},{0,3,12,62},{0,3,13,69},{0,3,13,14},{0,3,14,70},{0,3,14,14},{0,3,15,71},{0,3,15,14},{0,3,16,72},{0,3,16,14},{0,3,17,73},{0,3,17,14},{0,3,18,74},{0,3,18,14},{0,3,19,75},{0,3,19,76},{0,3,19,14},{0,3,20,50},{0,3,20,14},{0,3,21,51},{0,3,21,14},{0,3,22,52},{0,3,22,14},{0,3,29,14},{0,3,29,25},{0,4,0,47},{0,4,0,12},{0,4,1,48},{0,4,1,13},{0,4,2,49},{0,4,2,14},{0,4,3,50},{0,4,3,15},{0,4,4,51},{0,4,4,16},{0,4,5,52},{0,4,5,17},{0,4,6,53},{0,4,6,18},{0,4,7,54},{0,4,7,19},{0,5,0,53},{0,5,0,42},{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,5,0,7},{0,2,6,20},{0,2,6,0},{0,2,6,51},{0,2,6,16},{0,2,13,15},{0,2,13,54},{0,2,13,52},{0,2,13,6},{0,2,13,21},{0,2,13,28},{0,2,13,53},{0,2,13,0},{0,2,13,51},{0,3,10,41},{0,3,10,13},{1,0,0,16},{1,0,0,10},{1,0,0,3},{1,0,1,17},{1,0,1,11},{1,0,1,3},{1,0,2,18},{1,0,2,12},{1,0,2,3},{1,0,3,19},{1,0,3,13},{1,0,3,3},{1,0,4,20},{1,0,4,14},{1,0,4,3},{1,0,5,21},{1,0,5,15},{1,0,5,3},{2,0,0,0},{2,0,0,1},{2,0,0,2},{2,0,0,3},{2,0,0,4},{2,0,0,5},{2,0,0,6},{2,0,0,7},{2,0,0,8}};
static const int32_t K_BIAS[K_N_BIAS][3] = {{0,0,0},{0,0,4},{0,0,6},{0,0,7},{0,0,8},{0,0,9},{0,0,10},{0,1,1},{0,1,3},{0,0,1},{0,0,2},{0,0,3},{0,0,5},{0,1,0},{0,2,0},{0,2,1},{0,2,2},{0,2,3},{0,2,4},{0,2,5},{0,2,7},{0,2,8},{0,2,9},{0,2,10},{0,2,11},{0,2,12},{0,3,0},{0,3,1},{0,3,2},{0,3,3},{0,3,4},{0,3,5},{0,3,6},{0,3,7},{0,3,8},{0,3,9},{0,1,2},{0,1,4},{0,1,5},{0,3,28},{0,2,15},{0,2,16},{0,2,17},{0,2,18},{0,2,19},{0,2,20},{0,2,21},{0,2,22},{0,2,23},{0,2,24},{0,3,23},{0,3,24},{0,3,25},{0,3,26},{0,3,27},{0,2,14},{0,2,25},{0,2,26},{0,4,8},{0,4,9},{0,3,11},{0,3,12},{0,3,13},{0,3,14},{0,3,15},{0,3,16},{0,3,17},{0,3,18},{0,3,19},{0,3,20},{0,3,21},{0,3,22},{0,3,29},{0,4,0},{0,4,1},{0,4,2},{0,4,3},{0,4,4},{0,4,5},{0,4,6},{0,4,7},{0,5,0},{0,2,6},{0,2,13},{0,3,10},{1,0,0},{1,0,1},{1,0,2},{1,0,3},{1,0,4},{1,0,5},{2,0,0}};
/* units whose block is skipped when the listed input columns are all zero; the loader proves each one */
static const int32_t K_GUARD[K_N_GUARD][3 + K_MAX_GUARD] = {{0,0,0,13,-1,-1,-1},{0,0,4,43,-1,-1,-1},{0,0,6,15,14,-1,-1},{0,0,7,62,-1,-1,-1},{0,0,8,64,-1,-1,-1},{0,0,9,65,-1,-1,-1},{0,0,10,44,-1,-1,-1},{0,1,1,23,54,-1,-1},{0,1,3,57,58,-1,-1},{0,0,1,2,-1,-1,-1},{0,0,2,3,-1,-1,-1},{0,0,3,34,-1,-1,-1},{0,0,5,35,-1,-1,-1},{0,1,0,37,-1,-1,-1},{0,2,0,0,-1,-1,-1},{0,2,1,0,-1,-1,-1},{0,2,2,0,-1,-1,-1},{0,2,3,0,-1,-1,-1},{0,2,4,0,-1,-1,-1},{0,2,5,0,-1,-1,-1},{0,2,7,17,18,-1,-1},{0,2,8,17,18,-1,-1},{0,2,9,18,-1,-1,-1},{0,2,10,47,-1,-1,-1},{0,2,11,47,-1,-1,-1},{0,2,12,47,-1,-1,-1},{0,3,0,27,7,10,-1},{0,3,1,27,7,9,-1},{0,3,2,55,2,10,-1},{0,3,3,56,8,10,-1},{0,3,4,54,9,27,10},{0,3,5,58,35,-1,-1},{0,3,6,59,11,-1,-1},{0,3,7,60,35,-1,-1},{0,3,8,61,35,-1,-1},{0,3,9,27,7,10,-1},{0,1,4,4,-1,-1,-1},{0,1,5,4,-1,-1,-1},{0,3,28,34,-1,-1,-1},{0,3,23,34,-1,-1,-1},{0,3,24,34,-1,-1,-1},{0,3,25,34,-1,-1,-1},{0,3,26,34,-1,-1,-1},{0,3,27,34,-1,-1,-1},{0,2,14,6,54,-1,-1},{0,2,25,22,-1,-1,-1},{0,2,26,21,61,-1,-1},{0,4,8,55,23,-1,-1},{0,4,9,56,24,-1,-1},{0,3,11,14,-1,-1,-1},{0,3,12,14,-1,-1,-1},{0,3,13,69,-1,-1,-1},{0,3,14,70,-1,-1,-1},{0,3,15,71,-1,-1,-1},{0,3,16,72,-1,-1,-1},{0,3,17,73,-1,-1,-1},{0,3,18,74,-1,-1,-1},{0,3,19,75,76,-1,-1},{0,3,20,14,-1,-1,-1},{0,3,21,14,-1,-1,-1},{0,3,22,14,-1,-1,-1},{0,3,29,14,25,-1,-1},{0,4,0,12,-1,-1,-1},{0,4,1,13,-1,-1,-1},{0,4,2,14,-1,-1,-1},{0,4,3,15,-1,-1,-1},{0,4,4,16,-1,-1,-1},{0,4,5,17,-1,-1,-1},{0,4,6,18,-1,-1,-1},{0,4,7,19,-1,-1,-1},{0,5,0,42,-1,-1,-1},{0,2,6,20,51,-1,-1},{0,2,13,15,52,-1,-1},{0,3,10,13,-1,-1,-1}};