diff options
| author | tslil <tslil@posteo.de> | 2026-09-03 20:17:22 +0100 |
|---|---|---|
| committer | tslil <tslil@posteo.de> | 2026-09-04 21:03:59 +0100 |
| commit | 1ca3309dad9d412870b2b793f33af7a7ccabd514 (patch) | |
| tree | 15ce96557f04a7eded89193f12065dcd64c33ec8 | |
| parent | f11793dc0fddfcaad04b89827634cbb40fa98e59 (diff) | |
TD-leaf and another negamax bug
TD-lambda and TD-leaf are separated by the observation that minimax with a parameterised leaf heuristic is differentiable* in the parameters. "All" that had to be done was to extract the "principal variation": which one position survived all of the pruning to become the reported value.
This was a bit fiddly and uncovered a subtle bug (again) in negamax.c: we were not being complete in our overriding of the TT entry and by omitting key it was possible that later searches would find incorrect values.
The more interesting question to me was: how do we introduce enough variety while not corrupting the PV chain? I settled on having selfplay have one of the players be epsilon-random but the other greedy (minimax) and simply report only the greedy portion PV chain. This appears to work well enough in practice and doesn't introduce nonsense training data for the net (we don't force its actions to be nonsensical). I also deciced, perhaps in a departure from tradition, that we had good supervised labels for PVs that happened to be winning states, so the training overrides the targets in that case. Finally rolled back some of the ambition in nn_train.py default arguments.
*almost always
| -rw-r--r-- | .clangd | 1 | ||||
| -rw-r--r-- | Makefile | 11 | ||||
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | include/actions.c | 1 | ||||
| -rw-r--r-- | include/actions.h | 18 | ||||
| -rw-r--r-- | include/negamax.c | 90 | ||||
| -rw-r--r-- | include/negamax.h | 3 | ||||
| -rw-r--r-- | include/nn.c | 122 | ||||
| -rw-r--r-- | include/nn.h | 81 | ||||
| -rw-r--r-- | include/nn_input.c | 54 | ||||
| -rw-r--r-- | include/pv.c | 59 | ||||
| -rw-r--r-- | include/pv.h | 47 | ||||
| -rw-r--r-- | include/tt.c | 22 | ||||
| -rw-r--r-- | include/tt.h | 30 | ||||
| -rw-r--r-- | include/weights_5.c | 553 | ||||
| -rw-r--r-- | include/weights_5.h | 8 | ||||
| -rw-r--r-- | include/weights_6.c | 681 | ||||
| -rw-r--r-- | include/weights_6.h | 2 | ||||
| -rwxr-xr-x | resources/do_buildroot.sh | 8 | ||||
| -rw-r--r-- | src/match.c | 27 | ||||
| -rwxr-xr-x | src/nn_train.py | 116 | ||||
| -rw-r--r-- | src/selfplay.c | 95 |
22 files changed, 1137 insertions, 894 deletions
@@ -8,6 +8,7 @@ CompileFlags: - -I. - -I../include - -D_DEFAULT_SOURCE + - -DRECORD_PV - -Wall - -Wextra - -Wpedantic @@ -31,10 +31,15 @@ clean: rm -f src/*.o include/*.o native: CFLAGS += $(NATIVE_FLAGS) -native: clean ctlm cttei geminict selfplay +native: clean ctlm cttei geminict -selfplay: CFLAGS += $(NATIVE_FLAGS) -selfplay: src/selfplay.o $(OBJS) +.PHONY: selfplay +selfplay: + $(MAKE) clean + $(MAKE) DEFINES=-DRECORD_PV selfplay-bin + +selfplay-bin: CFLAGS += $(NATIVE_FLAGS) +selfplay-bin: src/selfplay.o $(OBJS) $(CC) $(CFLAGS) src/selfplay.o $(OBJS) -o selfplay match: CFLAGS += $(NATIVE_FLAGS) @@ -3,7 +3,7 @@ ## Overview 1. ctak is a C library for the game of Tak -2. ctaklm is a line-mode interface to ctak and a computer opponent (for 5x5) +2. ctaklm is a line-mode interface to ctak and a computer opponent (for 5x5 and 6x6) 3. ct1986 is a similar interface, but designed for a Raspberry Pi Zero running buildroot and displaying output on a character LCD. 4. cttei is a TEI-speaking game engine for use wherever TEI is accepted. 5. geminict is a special adaptation of ctak for use in a gemini CGI web-server. diff --git a/include/actions.c b/include/actions.c index 9b2ae0d..541b388 100644 --- a/include/actions.c +++ b/include/actions.c @@ -337,6 +337,7 @@ void action_undo(tak_state_p state, const action_t action) { if (A_GET_TYPE(action) == A_PLACE) { const uint8_t black = (state->current_colour == C_BLACK); state->celldat[loc] = 0; + state->colours[loc] = 0; if (A_GET_DATA0(action) == STONE_CAPSTONE) { if (black) state->black_count |= 0x80; diff --git a/include/actions.h b/include/actions.h index 913a8cb..d96033c 100644 --- a/include/actions.h +++ b/include/actions.h @@ -54,24 +54,22 @@ extern int8_t move_deltas[4]; // Methods // =================================================================== +#define AL_MAX_LEVELS 8 void actions_init(const uint8_t board_size); -/* - * Generate the legal actions. The move list is drawn from a static - * per-search-level scratch buffer: one buffer per recursion level, - * so nested generate calls at different levels do not clobber each - * other. `level' is the recursion depth within the current search - * (0 at the root). The returned pointer is valid until the next - * generate call at the same level. - */ +// Generate the legal actions. The move list is drawn from a static +// per-search-level scratch buffer: one buffer per recursion level, so nested +// generate calls at different levels do not clobber each other. `level' is the +// recursion depth within the current search (0 at the root). The returned +// pointer is valid until the next generate call at the same level. action_t *actions_generate_at(tak_state_p state, uint32_t *num_actions, const uint32_t level); action_t *actions_generate(tak_state_p state, uint32_t *num_actions); char action_in_list(action_t action, action_t *actions, const uint32_t num_actions); -// Move `action' to the front of the list. Returns EXIT_FAILURE (and -// leaves the list untouched) if the action is not in the list. +// Move `action' to the front of the list. Returns EXIT_FAILURE (and leaves the +// list untouched) if the action is not in the list. int action_move_to_front(action_t action, action_t *actions, const uint32_t num_actions); diff --git a/include/negamax.c b/include/negamax.c index 7b4acc1..6c29481 100644 --- a/include/negamax.c +++ b/include/negamax.c @@ -17,6 +17,9 @@ #include "negamax.h" #include "actions.h" +#ifdef RECORD_PV +#include "pv.h" +#endif // =================================================================== // Variables @@ -54,7 +57,11 @@ static inline enum WIN_TYPE check_win_cached(tak_state_p state, static float negamax(tak_state_p state, const uint8_t cur_depth, const uint8_t init_depth, float alpha, float beta, - const float colour, const uint64_t hash); + const float colour, const uint64_t hash +#ifdef RECORD_PV + , pv_leaf_t *out_leaf +#endif +); // =================================================================== // Exported functions @@ -84,7 +91,7 @@ float negamax_generate(tak_state_p state) { negamax_best_action = -1; - // The transposition table is deliberately NOT cleared here: entries persist + // The transposition table is deliberately not cleared here: entries persist // across plies. This is sound because the table is keyed on (board, side to // move) and an entry is only reusable at a depth no greater than the one it // was stored at. In particular the new root (the previous root's child, @@ -93,11 +100,22 @@ float negamax_generate(tak_state_p state) { // this is constant across iterative deepening const uint64_t root_hash = zobrist_compute(state); +#ifdef RECORD_PV + pv_leaf_t iteration_leaf; +#endif for (int d = 1; d <= negamax_search_depth; d++) { result = negamax(state, d, d, -safe_infty, safe_infty, - (state->ply & 1) ? +1.0 : -1.0, root_hash); + (state->ply & 1) ? +1.0 : -1.0, root_hash +#ifdef RECORD_PV + , &iteration_leaf +#endif + ); } +#ifdef RECORD_PV + pv_publish_leaf(&iteration_leaf); +#endif + action_to_ptn(negamax_best_action, negamax_ptn); return result; @@ -112,26 +130,43 @@ static enum WIN_TYPE w; static float negamax(tak_state_p state, const uint8_t cur_depth, const uint8_t init_depth, float alpha, float beta, - const float colour, const uint64_t hash) { + const float colour, const uint64_t hash +#ifdef RECORD_PV + , pv_leaf_t *out_leaf +#endif +) { + + // the scratch buffer is per-level so that recursion does not clobber + const uint32_t level = init_depth - cur_depth; tt_entry_t *entry = tt_seek(hash); - if (entry != NULL && entry->depth >= cur_depth) { + // The root never early-returns from the table. Within one game the new + // root was only ever stored at depth D-1, so an early return could not + // fire anyway; across games the table persists across reset_state and + // a stale full-depth entry would early-return and leave + // negamax_best_action unset. + if (level > 0 && entry != NULL && entry->depth >= cur_depth) { if (entry->flag == TT_EXACT) { +#ifdef RECORD_PV + *out_leaf = entry->leaf; +#endif return entry->value; } else if (entry->flag == TT_LOWERBOUND && entry->value > alpha) { alpha = entry->value; } else if (entry->flag == TT_UPPERBOUND && entry->value < beta) { beta = entry->value; } - if (alpha >= beta) + if (alpha >= beta) { +#ifdef RECORD_PV + *out_leaf = entry->leaf; +#endif return entry->value; + } } action_t *actions; uint32_t num_actions; - // the scratch buffer is per-level so that recursion does not clobber - const uint32_t level = init_depth - cur_depth; if ((actions = actions_generate_at(state, &num_actions, level)) == NULL) return alpha; // should never happen! @@ -153,6 +188,9 @@ static float negamax(tak_state_p state, const uint8_t cur_depth, action_t best_action = actions[0]; float best_value = -infty; +#ifdef RECORD_PV + pv_leaf_t candidate_leaf, best_leaf; +#endif for (uint32_t idx = 0; idx<num_actions; idx++) { negamax_display_progress(cur_depth, init_depth, num_actions); @@ -161,7 +199,7 @@ static float negamax(tak_state_p state, const uint8_t cur_depth, const uint64_t child_hash = zobrist_compute(state); - // Compute the value of the node + // Compute the value of the node and retain the leaf that produced it. float node_value; if (state->ply >= 2 * state->board_size - 2 && (w = check_win_cached(state, child_hash)) < 0xFF) { @@ -172,18 +210,31 @@ static float negamax(tak_state_p state, const uint8_t cur_depth, } else if (w == WIN_DRAW) { node_value = 0; } +#ifdef RECORD_PV + pv_capture_leaf(&candidate_leaf, state, w); +#endif } else if (cur_depth > 1) { // If nobody won, or too early and not leaf, recurse node_value = -negamax(state, cur_depth - 1, init_depth, -beta, -alpha, - -colour, child_hash); + -colour, child_hash +#ifdef RECORD_PV + , &candidate_leaf +#endif + ); } else { node_value = colour * evaluate(state); +#ifdef RECORD_PV + pv_capture_leaf(&candidate_leaf, state, (enum WIN_TYPE)0xFF); +#endif } action_undo(state, actions[idx]); - if (node_value > best_value) { + if (idx == 0 || node_value > best_value) { best_value = node_value; best_action = actions[idx]; +#ifdef RECORD_PV + best_leaf = candidate_leaf; +#endif } if (best_value > alpha) @@ -195,20 +246,21 @@ static float negamax(tak_state_p state, const uint8_t cur_depth, if (cur_depth == init_depth) negamax_best_action = best_action; +#ifdef RECORD_PV + *out_leaf = best_leaf; +#endif + flag = TT_EXACT; if (best_value >= beta) flag = TT_LOWERBOUND; else if (best_value <= orig_alpha) flag = TT_UPPERBOUND; - if (entry == NULL) { - tt_insert(hash, flag, cur_depth, best_value, best_action); - } else { - entry->flag = flag; - entry->value = best_value; - entry->depth = cur_depth; - entry->action = best_action; - } + entry = tt_store(hash, flag, cur_depth, best_value, best_action); +#ifdef RECORD_PV + if (entry != NULL) + entry->leaf = best_leaf; +#endif return best_value; } diff --git a/include/negamax.h b/include/negamax.h index 78ed448..7b32233 100644 --- a/include/negamax.h +++ b/include/negamax.h @@ -32,6 +32,9 @@ extern const float infty; extern char negamax_ptn[9]; extern uint8_t negamax_search_depth; +// Limited by the per-level action scratch buffers in actions.c. +#define NEGAMAX_MAX_DEPTH 8 + extern void negamax_display_progress(const uint8_t cur_depth, const uint8_t init_depth, const uint32_t length); diff --git a/include/nn.c b/include/nn.c new file mode 100644 index 0000000..705f258 --- /dev/null +++ b/include/nn.c @@ -0,0 +1,122 @@ +/* + This file is part of ctak. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ctak. If not, see <https://www.gnu.org/licenses/>. +*/ + +#include "nn.h" + +#include "weights_5.h" +#include "weights_6.h" + +// =================================================================== +// Helpers +// =================================================================== + +#define RELU(x) ((x) = ((x) < 0) ? 0 : (x)) + +static float fast_tanh(const float x) { + // tanh via a degree-11 odd polynomial, least-squares fit of tanh on [-3, 3] + // (max absolute error ~4e-3), saturating to +-1 outside that interval. + if (x > 3.0f) + return 1.0f; + if (x < -3.0f) + return -1.0f; + const float x2 = x * x; + return x * (0.997136032f + x2 * (-0.305215124f + x2 * + (0.0832466371f + x2 * + (-0.0139947924f + x2 * + (0.00123106314f + x2 * -4.29748644e-05f))))); +} +// =================================================================== +// Input encoding +// =================================================================== + +inline uint8_t cell_idx_at(const tak_state_p state, const uint8_t loc) { + const uint8_t d = state->celldat[loc]; + if ((d & NUM_MASK) == 0) + return 0; // empty + return (uint8_t)(1u + 3u * (state->colours[loc] & 1u) + (d & STONE_MASK)); +} + +inline void nn_cell_idxs(uint8_t *out, tak_state_p state) { + const unsigned int n_cells = state->board_size * state->board_size; + for (unsigned int loc = 0; loc < n_cells; loc++) + out[loc] = cell_idx_at(state, loc); +} + +inline void nn_prepare_head(float out_head[3], tak_state_p state) { + const float inv_max_flats = + (state->board_size == 6) ? (1.0f / 30.0f) : (1.0f / 21.0f); + out_head[0] = (state->ply & 1) ? 1 : -1; + out_head[1] = (float)(state->white_count & 127) * inv_max_flats; + out_head[2] = (float)(state->black_count & 127) * inv_max_flats; +} + +void nn_prepare_input(float *cur_board, tak_state_p state, + const float embedding[NN_N_EMB]) { + const unsigned int n_cells = state->board_size * state->board_size; + nn_prepare_head(cur_board, state); + uint8_t idxs[36]; + nn_cell_idxs(idxs, state); + for (unsigned int loc = 0; loc < n_cells; loc++) + cur_board[3 + loc] = embedding[idxs[loc]]; +} + +// =================================================================== +// Implementation of small neural networks +// =================================================================== + +float eval_net(const float *board, const unsigned int n_inp, + const float *w, const float *biases, + const float *logit_w, const float logit_b, + const unsigned int n_dense) { + float dense1[FIVE_DENSE_NUM]; // FIVE_DENSE_NUM == SIX_DENSE_NUM + float z = logit_b; + + for (unsigned int d1 = 0; d1 < n_dense; d1++) { + float h = biases[d1]; + const float *wd = w + d1 * n_inp; + for (unsigned int fl = 0; fl < n_inp; fl++) + h += board[fl] * wd[fl]; + RELU(h); + dense1[d1] = h; + } + for (unsigned int d1 = 0; d1 < n_dense; d1++) + z += dense1[d1] * logit_w[d1]; + + return fast_tanh(z); +} + +// =================================================================== +// Interfaces to the two built-in evaluators +// =================================================================== + +float five_nn_fn(tak_state_p state) { + static float cur_board[FIVE_INP_NUM] NN_ALIGNED; + + nn_prepare_input(cur_board, state, five_embedding); + return eval_net(cur_board, FIVE_INP_NUM, &five_dense_weights[0][0], + five_dense_biases, five_logit_weights, five_logit_bias, + FIVE_DENSE_NUM); +} + +float six_nn_fn(tak_state_p state) { + static float cur_board[SIX_INP_NUM] NN_ALIGNED; + + nn_prepare_input(cur_board, state, six_embedding); + return eval_net(cur_board, SIX_INP_NUM, &six_dense_weights[0][0], + six_dense_biases, six_logit_weights, six_logit_bias, + SIX_DENSE_NUM); +} diff --git a/include/nn.h b/include/nn.h index 18e222a..9e576c1 100644 --- a/include/nn.h +++ b/include/nn.h @@ -18,79 +18,34 @@ #ifndef NN_H #define NN_H -#include <tak.h> -#include "weights_5.h" -#include "weights_6.h" - -// =================================================================== -// Helpers -// =================================================================== +#include <stdint.h> -void nn_prepare_input(float *cur_board, tak_state_p state); +#include <tak.h> -#define RELU(x) ((x) = ((x) < 0) ? 0 : (x)) - -/* - * tanh via a degree-11 odd polynomial, least-squares fit of tanh on [-3, 3] - * (max absolute error ~4e-3), saturating to +-1 outside that interval. - */ -static inline float fast_tanh(const float x) { - if (x > 3.0f) - return 1.0f; - if (x < -3.0f) - return -1.0f; - const float x2 = x * x; - return x * (0.997136032f + x2 * (-0.305215124f + x2 * - (0.0832466371f + x2 * - (-0.0139947924f + x2 * - (0.00123106314f + x2 * -4.29748644e-05f))))); -} +// Number of cell states: empty, then {black, white} x {flat, standing, road} +#define NN_N_EMB 7 // =================================================================== -// Implementation of small neural networks +// Input encoding // =================================================================== -static inline float eval_net(const float *board, const unsigned int n_inp, - const float *w, const float *biases, - const float *logit_w, const float logit_b, - const unsigned int n_dense) { - float dense1[FIVE_DENSE_NUM]; // FIVE_DENSE_NUM == SIX_DENSE_NUM - float z = logit_b; - - for (unsigned int d1 = 0; d1 < n_dense; d1++) { - float h = biases[d1]; - const float *wd = w + d1 * n_inp; - for (unsigned int fl = 0; fl < n_inp; fl++) - h += board[fl] * wd[fl]; - RELU(h); - dense1[d1] = h; - } - for (unsigned int d1 = 0; d1 < n_dense; d1++) - z += dense1[d1] * logit_w[d1]; - - return fast_tanh(z); -} +// somewhat internal, important for generating training data +void nn_cell_idxs(uint8_t *out, tak_state_p state); +void nn_prepare_head(float out_head[3], tak_state_p state); +void nn_prepare_input(float *cur_board, tak_state_p state, + const float embedding[NN_N_EMB]); // =================================================================== -// Interfaces to the two built-in evaluators +// Network // =================================================================== -static inline float five_nn_fn(tak_state_p state) { - static float cur_board[FIVE_INP_NUM] NN_ALIGNED; - - nn_prepare_input(cur_board, state); - return eval_net(cur_board, FIVE_INP_NUM, &five_dense_weights[0][0], - five_dense_biases, five_logit_weights, five_logit_bias, - FIVE_DENSE_NUM); -} - -static inline float six_nn_fn(tak_state_p state) { - static float cur_board[SIX_INP_NUM] NN_ALIGNED; +float eval_net(const float *board, const unsigned int n_inp, + const float *w, const float *biases, + const float *logit_w, const float logit_b, + const unsigned int n_dense); - nn_prepare_input(cur_board, state); - return eval_net(cur_board, SIX_INP_NUM, &six_dense_weights[0][0], - six_dense_biases, six_logit_weights, six_logit_bias, - SIX_DENSE_NUM); -} +// Evaluators for the two built-in networks. +float five_nn_fn(tak_state_p state); +float six_nn_fn(tak_state_p state); #endif diff --git a/include/nn_input.c b/include/nn_input.c deleted file mode 100644 index 2fbd8da..0000000 --- a/include/nn_input.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - This file is part of ctak. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with ctak. If not, see <https://www.gnu.org/licenses/>. -*/ - -#include "nn.h" -#include "tak.h" - -/* - * Encode a board position into the network's input vector: - * [0] ply parity (-1 / +1) - * [1] white flats remaining, as a fraction of the total - * [2] black flats remaining, as a fraction of the total - * [3 ..] one scalar per cell for the top stone: - * 0 empty, +-0.25 standing, +-0.5 flat, +-1 capstone, - * + white, - black - * - * `cur_board' must have room for 3 + board_size*board_size floats. - */ - -// The per-cell scalar depends only on the top stone's colour, variant -// and occupancy, so it's a table lookup keyed on those three bits. -static const float cell_scalar[16] = { - 0.0f, -0.5f, 0.0f, -0.25f, 0.0f, -1.0f, 0.0f, 0.0f, // black - 0.0f, +0.5f, 0.0f, +0.25f, 0.0f, +1.0f, 0.0f, 0.0f, // white -}; - -void nn_prepare_input(float *cur_board, tak_state_p state) { - const float inv_max_flats = - (state->board_size == 6) ? (1.0f / 30.0f) : (1.0f / 21.0f); - const unsigned int n_cells = state->board_size * state->board_size; - for (unsigned int loc = 0; loc < n_cells; loc++) { - const uint8_t d = state->celldat[loc]; - cur_board[3 + loc] = cell_scalar[((state->colours[loc] & 1) << 3) | - ((d & STONE_MASK) << 1) | - ((d & NUM_MASK) != 0)]; - } - // Add input of flat counts and ply parity - cur_board[0] = (state->ply & 1) ? 1 : -1; - cur_board[1] = (float)(state->white_count & 127) * inv_max_flats; - cur_board[2] = (float)(state->black_count & 127) * inv_max_flats; -} diff --git a/include/pv.c b/include/pv.c new file mode 100644 index 0000000..9c120f5 --- /dev/null +++ b/include/pv.c @@ -0,0 +1,59 @@ +/* + This file is part of ctak. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ctak. If not, see <https://www.gnu.org/licenses/>. +*/ + +#include "pv.h" + +#ifdef RECORD_PV + +#include "nn.h" + +static pv_leaf_t published_leaf; + +static float terminal_value(const enum WIN_TYPE winner) { + switch (winner) { + case WIN_FLAT_BLACK: + case WIN_ROAD_BLACK: + return 1.0f; + case WIN_FLAT_WHITE: + case WIN_ROAD_WHITE: + return -1.0f; + default: + return 0.0f; + } +} + +void pv_capture_leaf(pv_leaf_t *leaf, tak_state_p state, + const enum WIN_TYPE winner) { + nn_prepare_head(leaf->head, state); + nn_cell_idxs(leaf->cells, state); + const uint8_t n_cells = state->board_size * state->board_size; + for (uint8_t loc = n_cells; loc < PV_MAX_CELLS; loc++) + leaf->cells[loc] = 0; + leaf->current_colour = (uint8_t)state->current_colour; + leaf->terminal = (uint8_t)(winner < 0xFF); + leaf->terminal_value = leaf->terminal ? terminal_value(winner) : 0.0f; +} + +void pv_publish_leaf(const pv_leaf_t *leaf) { published_leaf = *leaf; } + +const pv_leaf_t *pv_get_leaf(void) { return &published_leaf; } + +#else + +typedef int pv_disabled_translation_unit; + +#endif diff --git a/include/pv.h b/include/pv.h new file mode 100644 index 0000000..4be7b24 --- /dev/null +++ b/include/pv.h @@ -0,0 +1,47 @@ +/* + This file is part of ctak. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ctak. If not, see <https://www.gnu.org/licenses/>. +*/ + +#ifndef PV_H +#define PV_H + +#ifdef RECORD_PV + +#include <stdint.h> + +#include <tak.h> + +#define PV_MAX_CELLS (6 * 6) + +typedef struct pv_leaf_s { + float head[3]; + uint8_t cells[PV_MAX_CELLS]; + uint8_t current_colour; + uint8_t terminal; + float terminal_value; +} pv_leaf_t; + +// Capture a horizon leaf (winner == 0xFF) or an exact terminal leaf +void pv_capture_leaf(pv_leaf_t *leaf, tak_state_p state, + enum WIN_TYPE winner); + +// Publish and retrieve the leaf selected by the full-depth root search +void pv_publish_leaf(const pv_leaf_t *leaf); +const pv_leaf_t *pv_get_leaf(void); + +#endif + +#endif diff --git a/include/tt.c b/include/tt.c index b1f583e..8ad6c56 100644 --- a/include/tt.c +++ b/include/tt.c @@ -43,18 +43,28 @@ tt_entry_t *tt_seek(const uint64_t key) { return NULL; } -int tt_insert(const uint64_t key, const enum TT_FLAG flag, - const uint8_t depth, const float value, - const action_t action) { +tt_entry_t *tt_store(const uint64_t key, const enum TT_FLAG flag, + const uint8_t depth, const float value, + const action_t action) { tt_entry_t *e = &table[key & TT_SIZE]; - // Replacement scheme: keep a stale-but-deeper entry over a shallower new one. + if (e->gen == tt_gen && e->key == key) { + // The slot holds this very position: update it (gen and key are already + // correct). + e->flag = flag; + e->value = value; + e->depth = depth; + e->action = action; + return e; + } + // Empty slot, stale generation, or a different position: keep a deeper search + // of a foreign position over this shallower one. if (e->gen == tt_gen && e->depth > depth) - return EXIT_SUCCESS; + return NULL; e->key = key; e->value = value; e->action = action; e->gen = tt_gen; e->flag = flag; e->depth = depth; - return EXIT_SUCCESS; + return e; } diff --git a/include/tt.h b/include/tt.h index b8e1a2e..60b9b66 100644 --- a/include/tt.h +++ b/include/tt.h @@ -28,6 +28,10 @@ enum TT_FLAG { TT_EXACT, TT_LOWERBOUND, TT_UPPERBOUND }; +#ifdef RECORD_PV +#include <pv.h> +#endif + typedef struct tt_node_s { uint16_t gen; uint64_t key; @@ -35,6 +39,10 @@ typedef struct tt_node_s { uint8_t depth; float value; action_t action; +#ifdef RECORD_PV + // use for generating training data only + pv_leaf_t leaf; +#endif } tt_entry_t; // =================================================================== @@ -48,15 +56,25 @@ typedef struct tt_node_s { // Methods // =================================================================== -// Bump the generation counter, invalidating all entries (memsets the -// table on wraparound). Called from negamax_init when the board size -// (and hence the zobrist table) changes; entries are otherwise kept -// across plies on purpose (see negamax.c). +// Bump the generation counter, invalidating all entries. Called from +// negamax_init when the board size (and hence the zobrist table) changes; +// entries are otherwise kept across plies on purpose (see negamax.c). int tt_init(void); tt_entry_t *tt_seek(const uint64_t key); -int tt_insert(const uint64_t key, const enum TT_FLAG flag, const uint8_t depth, - const float value, const action_t action); +// Store a search result for `key', returning the entry it was written to, or +// NULL when the replacement policy keeps the current occupant instead. +// +// Replacement policy per slot: +// +// - generation and key match: always update +// +// - otherwise (empty slot, stale generation, or a different key): replace the +// occupant unless it is a deeper search of a different position, which is +// kept. +tt_entry_t *tt_store(const uint64_t key, const enum TT_FLAG flag, + const uint8_t depth, const float value, + const action_t action); #endif diff --git a/include/weights_5.c b/include/weights_5.c index 7e254f8..5648011 100644 --- a/include/weights_5.c +++ b/include/weights_5.c @@ -1,289 +1,294 @@ /* generated by nn_train.py, do not edit by hand */ -/* v098, val_corr=0.9123 */ +/* v010, val_corr=0.9136, rate=0.7714 */ #include "weights_5.h" +const float five_embedding[7] = +{ + -0.352801919, -0.851079345, -0.213445649, -1.34711647, 0.884809256, 0.307861924, 0.994306982 +}; + const float five_dense_weights[FIVE_DENSE_NUM][FIVE_INP_NUM] NN_ALIGNED = { - {-0.017687507, -2.7726233, -3.18424511, -0.694748878, -1.08251417, 0.252432942, -1.59602427, 0.613304615, - -0.0209749062, 0.501225889, 0.428674579, 0.709405005, 0.876026511, -0.0243752133, 0.13531214, -0.0246725027, - -0.201236486, -0.210551634, 0.718519807, -0.160790935, 0.316674501, -0.765163124, -0.618982673, 0.612452507, - -0.169427812, -0.0110228499, -0.751906395, 0.12217132}, - {0.305975586, -1.02205753, -0.405607224, 0.760527909, -0.128717557, 1.30133402, -0.276660174, 0.451471746, - 0.238462925, -0.126678392, 1.1251303, -0.140467376, -0.202640042, 0.32708323, 0.473448724, 0.89310801, - 0.40762493, 0.160802051, -0.0101828268, 0.379917711, 0.201904431, 0.664304197, 0.185341775, 0.560308635, - 0.395599753, 0.780205846, -0.653292239, 0.154138252}, - {-0.0196500644, -2.70877528, -3.66019845, -0.232481405, 0.00873931497, 0.247044995, 0.418322444, -0.051310055, - -0.342084587, -0.203185201, 0.0428542271, -0.434620678, -0.298130661, -0.460759789, -0.123185799, -0.176625043, - 0.0745659843, -0.888225198, -0.699625373, 0.0152557986, -0.402519584, -0.883676648, -0.559899509, -0.0690891743, - -0.24945198, -0.499730766, 0.203070641, -0.438601047}, - {-0.0378410481, 0.831621885, -5.39371777, -0.464221478, 0.331321567, -0.00553717278, 1.75570929, -0.523817182, - 0.584070861, 0.221932322, -0.800884664, -0.179113105, -0.1847056, -0.841097295, 0.201882526, -1.02349102, - -0.177126676, -0.0751212165, 0.672071815, 0.079591684, -0.297446489, -0.393640786, -0.622128308, 0.083089076, - 0.660041988, 0.11959824, -0.302385867, -1.13328278}, - {0.184374928, -2.11827135, 0.207292944, 0.17241393, -0.291959703, 0.163224146, 0.584029436, 0.86053741, - -0.253029168, -0.380560517, -0.487380594, 0.595696032, 0.623381972, 0.649845064, 0.179142594, -0.428994745, - 0.778253853, 0.990351677, 0.215283349, -0.0454968773, 0.656820476, 1.17538595, 0.735170186, -0.131170705, - -0.295662344, 1.20901132, 0.301301599, 0.922978342}, - {-0.0477715209, 0.299437135, 0.096707128, 0.0406936333, -0.175266534, -0.113555215, -0.235045731, -0.163982585, - -0.103490964, 0.118130855, -0.123898365, -0.200351447, -0.062734738, 0.102499172, -0.045119781, -0.267439753, - -0.128720567, -0.166820407, -0.167664438, -0.0568483882, -0.055328548, -0.0406381711, -0.156312823, -0.213186815, - -0.625713587, -0.381198198, -0.178947985, -0.162815019}, - {-0.0408952162, -3.45756292, -1.34200835, 0.0731342584, 0.0544441901, 0.110050783, 0.344100058, -0.725269496, - 0.437899977, -0.537460029, -0.296831816, -1.6424371, 0.172409892, 0.131585047, -0.445751727, 0.217447102, - -0.115501568, -0.855109751, -0.481499732, 0.511147738, 0.264388591, 0.727477372, 0.0770836025, 1.02176356, - 1.38628113, 1.76832759, -0.0538811684, 0.755088449}, - {-0.0282496195, -1.09568977, -3.95432925, 0.470584571, 0.272390813, -0.0829138905, -0.253350347, -0.641710341, - 0.260734975, -1.08649123, -0.397490114, -0.676264048, -0.49863717, 0.109579749, 0.0378338993, 0.486935675, - 1.04397559, -0.0339488238, 0.493080288, -0.246185184, -1.268906, -0.629128814, -0.523642719, -0.320555538, - 0.0850056484, -0.432449639, -0.227868319, -0.684521019}, - {0.126250565, -2.1314621, -9.1196804, -0.0801002756, -0.424118429, -0.138885885, -0.427886397, 0.42626527, - 0.533555806, -0.171532229, 0.00831813738, -0.16042164, -0.346267283, -0.441860348, -0.282887459, 0.063266173, - 0.64383918, 0.699429333, 0.281832844, -0.0484559052, 0.0195856858, 0.29366672, 0.43402198, -0.270008564, - 0.196564257, 1.18874121, 0.194568455, 0.817874253}, - {0.0998077914, 2.48213387, -5.02890444, 0.589919031, 0.274164915, -0.0167664476, 0.313575327, 0.380198032, - 0.580552399, -0.279666334, 0.0576464459, -0.340578943, -0.303388894, 0.0579651445, -0.192700222, 0.259907186, - 0.127785906, -0.0286185667, 0.139277443, -0.222778827, 0.191977218, 0.128683344, -0.013065299, 0.525240898, - -0.892806232, -0.124871373, -0.37049827, 0.667414367}, - {0.048153121, -1.46441472, -1.83816898, -0.23596105, -0.0525623932, 0.361069888, -0.404454976, -0.184483185, - 0.0100732222, 0.694974899, 0.410766572, 0.378488213, -0.586687922, 0.854564071, 0.794285059, -1.23339212, - 0.296620727, 0.896819651, -0.216232404, -1.00979805, -0.610438168, -0.904467702, -0.218700871, -0.0166311953, - -0.401803017, 0.120803088, -1.14684284, 0.0952027217}, - {-0.0324007645, 0.0488809049, 0.157106653, -0.00516019529, 0.0421396233, 0.00136998552, -0.0102051962, 0.0717003495, - -0.0423207618, 0.0142850317, 0.0516465977, 0.0280033927, -0.00678033894, -0.00974127091, 0.0116989752, -0.0127554797, - -0.00596701447, 0.0552557409, 0.0221525282, 0.0615149625, -0.0233675968, 0.0794110745, 0.12168695, -0.34219563, - -0.395809859, -0.362125039, -0.346448332, -0.399106383}, - {-0.0267151631, -2.56482983, -4.88011217, 0.09028209, 0.179611534, -0.318436384, 0.45468685, 0.520879626, - 0.0488886647, 0.09951251, 0.041528035, 0.0312570594, 0.539736152, -0.40504545, 0.340407491, 0.0347913429, - 0.485069156, -0.301279783, -0.0366242714, -0.382876962, 0.444674641, 0.628474474, 0.459671855, -0.327964932, - -0.628498316, 0.402651817, -0.0973869339, 0.813784003}, - {-0.183114827, -1.98381853, 0.415526628, -0.0883045942, 0.0517880172, 0.319699973, 0.136292756, -2.29299068, - -0.0727772936, -0.110973671, 0.108571291, -0.322578281, -1.352795, -0.332373887, -0.49182418, 0.207086965, - -0.253715366, -2.09938145, -0.177402422, -0.0757525638, -0.430394381, -0.404820919, -1.00606346, 0.207171142, - 0.350688815, -0.0484649427, 0.183782265, -1.15140569}, - {-0.0362447836, 1.06354749, -1.23299289, 0.465078086, 1.0613625, -0.75183028, -0.883582592, 1.64945459, - 0.30923453, -0.150417224, -0.567531049, -0.0845861062, 0.763042986, -1.40916693, -0.217184648, -0.339353561, - 0.705073178, 1.47145176, -0.0275013223, 0.215996116, -0.62504226, 0.786813736, 1.11716723, 0.430455655, - 0.426445484, 1.09807837, 0.682189643, 0.793541014}, - {0.0605719425, -1.5270201, -2.02333045, 0.334690273, 0.097131744, 0.0878544375, 0.664643764, -1.27231848, - 0.0590001158, 0.95432061, 1.482342, 0.751511157, 0.282043576, -0.325293154, 0.0423535518, 0.445080817, - 0.516905546, 0.0423260964, -0.00436464325, 0.209859475, 0.405998886, -0.2421491, 0.38215062, -0.624033511, - 0.980600119, 0.395838708, 0.737524211, -0.0301853959}, - {-0.264390856, 0.00447343616, 0.572782934, 0.0531108305, 0.143604264, 0.0561246835, -0.474388719, -0.212672651, - 0.0809418857, 0.0370290391, -0.390509278, -0.989919364, -0.482206255, 0.164907277, -0.360560507, -0.355930209, - -0.627535582, -0.124950886, 0.120545797, -0.0971757472, -1.15071845, -0.749056876, -0.35757491, 0.113903187, - -0.0105860615, -1.038571, 0.469155639, 0.342842788}, - {0.168753788, -2.73271942, -0.158344552, 0.394571871, 0.153508767, -0.486535609, 0.0107338214, 0.183814526, - -0.0703299269, 0.328833371, -0.14791061, 0.0572811551, 0.496548027, 1.83897889, 0.661762834, 0.845462322, - 1.00526989, 0.24658905, 0.126682073, 0.509696007, 0.686646461, 0.792747617, 0.400123119, -0.0646533072, - 0.0701639652, -0.13613975, -0.0214697868, -0.410822034}, - {-0.126906678, -0.0759056807, -0.475337893, -1.24434912, 0.120860711, -0.0816293582, 0.370602846, 0.126830906, - -1.12032413, -0.452190071, 0.378851265, 0.0787992105, 0.452513158, -1.59483504, -0.925934017, 0.0985669047, - -0.0592967831, -0.063750416, -0.806170225, -0.904370308, -0.0288544223, 0.140288487, 0.204684362, -0.737900376, - -1.18681502, 0.311962366, -0.23348704, 0.325737089}, - {0.042846255, -1.01401317, -0.787675023, 0.320858449, 0.600958943, 1.01925588, 1.41290712, -0.625177979, - -0.527758777, -0.245332941, 0.231125176, 1.03572583, 0.0886845738, -1.55435121, -0.119136661, -0.516718507, - 1.08180618, 0.321707219, -0.964534223, -0.77063024, -0.568375289, 0.638082147, 0.399400443, -0.504099786, - -0.93797797, -0.461517245, 0.552734435, 1.21082044}, - {-0.0027246878, -0.822401404, -5.78269768, -0.367361158, 0.0395893529, -0.632945657, -0.79833281, -0.960032165, - 0.661225736, 0.500198066, 0.058203496, 0.127557114, 0.105093434, 0.660576642, 0.888604403, 0.400705993, - -0.280454457, 0.440834939, -0.725442648, -0.461237013, -0.481059194, -0.216810524, -0.146271884, -1.33439291, - -0.323164523, 0.0793281496, -0.707304299, 0.26752919}, - {0.0547249876, 1.82959437, -3.78089833, 0.828881621, 0.294022411, 0.608274877, 0.0549198091, 0.63434273, - -0.005911869, 0.297854215, 0.802860022, 0.964098036, 0.629039109, -0.419598252, 0.104968935, 0.726039469, - 0.228668824, -0.102511063, -0.448736191, -0.677962899, 0.47755897, 0.102762185, 0.0820724443, -0.462765187, - 0.160549238, 0.679351926, 0.450417966, -0.00261037424}, - {0.0740314499, 0.125401676, -6.3721447, 0.130388469, -0.0373040326, -0.25745067, 0.415108651, 2.04560685, - 0.0510546863, 1.47437394, -0.454688609, -1.12459505, 0.154450417, 0.380756974, 0.356446415, -0.0130162379, - -0.143411413, -0.250218809, -0.0217493474, 0.19030562, 0.974928677, 0.225417852, -0.636997759, 0.965796292, - 0.54893893, -0.320783466, 0.22444652, -0.0994358808}, - {0.088921845, 0.501326561, 0.0984886885, -0.0642404482, -0.0899887159, 0.00427165208, 0.0686437488, 0.0139860315, - -0.0470670536, -0.0333355293, 0.06151684, 0.0388135798, 0.0823084116, 0.0565618165, 0.0938319117, 0.113721102, - 0.0392451994, 0.0705398023, 0.00511221588, 0.0808409825, 0.042969346, 0.307290494, 0.399382472, 0.641138136, - 0.585508347, 0.644836426, 0.561508, 0.290235937}, - {-0.0653936565, -7.93236113, 0.182766557, -1.34688294, -0.906135321, -0.678245366, -0.878894389, -0.463245302, - 0.508853018, -0.663949072, 0.52267462, 0.601760328, -1.02037764, 0.266515017, 0.697541535, -0.0412226915, - 0.145522296, -0.621190965, -0.470039606, 0.289924204, 0.502045512, 0.254058033, -1.25108385, -0.0010011862, - 0.235496506, -0.0438185334, 0.0435181446, 0.0483496264}, - {-0.0155108329, -5.65538692, -3.72422981, -0.229338065, -0.142547324, -0.0605753995, 0.774035037, 0.605769455, - 0.649825454, -0.32895577, -0.516424835, -0.467582762, -0.492001206, 0.315332323, 0.305014402, -0.826091528, - 0.470321804, 0.592903495, 0.539531887, 0.114279613, 0.753841937, -0.0721266344, 0.203808784, -0.191284075, - -0.400418758, 0.962654769, 0.540521801, -0.192482814}, - {-0.0841482431, -3.11816883, 2.52213597, 0.221693054, 0.39964658, -0.126087815, 0.396655947, -1.00298798, - -0.0180124193, 0.0227001999, 0.101735108, -0.504606009, -0.795736074, 0.26131025, 0.0629129708, -0.182299256, - -0.58673501, -0.379303366, -0.729669929, -0.605720103, -1.0318737, -1.10907018, -1.38460314, -1.86592114, - -1.74185932, -1.66521406, -2.83507466, -1.5353936}, - {-0.0271777753, -1.65670753, -0.138010547, -1.38469684, 0.871935904, 0.606624186, 0.542895257, 0.734829485, - 1.23499441, 0.341616333, -0.0553627461, -1.2573204, 0.975557566, -0.716557145, -1.01092935, -0.102436081, - -0.756014705, -0.881072462, 0.145312831, 1.41733027, 0.541355014, 0.752016008, -0.619402647, 0.801285207, - 0.771121264, 0.549716473, -0.60874182, -0.553624809}, - {0.243606463, -3.29466152, -8.61932087, 0.288695276, 0.121720523, 0.830552101, -0.176525846, -0.209575742, - -0.368370116, 0.531418085, 0.00779051706, 0.153792143, 0.449948102, 0.128135011, 1.1711061, 0.0699489042, - 0.0200876687, -0.361263305, 0.574860215, 0.273856223, -0.179232404, 0.330728799, -0.162115857, 0.0653959066, - 0.245886594, 1.64160967, -0.575041175, -0.489283413}, - {0.0341560878, -0.321620941, -0.0295257904, 1.00346386, 1.44676077, 0.791196287, 1.43390977, 0.750319719, - 0.439511091, 0.828590572, 0.759809554, 1.12685275, 0.702608287, 0.368128806, 0.165622681, -0.404972076, - -0.400121003, -0.533207476, -0.406070203, 0.291544706, -0.191007957, -0.705734134, -0.793099105, 0.45004946, - -0.364261448, -0.528324485, -0.760637164, -0.856404066}, - {-0.154523775, -7.1212039, -2.95486689, -0.102876522, -0.578914523, -0.776420832, 0.0445834026, -0.941871524, - -0.243689641, 0.0435830429, -0.0094085047, -0.357761919, 0.327104092, 0.278522372, -0.414925843, 0.00678584166, - -0.189761534, -0.30789718, 0.246894091, -0.0841052905, 0.547891974, 0.0347051807, 0.193204001, -0.786870241, - -0.19485724, -0.850490034, -0.185127094, -0.0103808334}, - {0.154930294, -2.91853547, -2.62348175, -0.295651615, 0.619947314, 0.568406582, -0.621971428, -1.31148922, - -0.450834066, 1.25342667, 0.638317049, 0.321380526, -0.0133571848, 0.0633455813, -0.230508134, 0.775423288, - -0.129944548, -0.623022139, 0.157232463, 0.693214595, 0.962514102, 0.968111694, 0.442186743, 0.606270015, - -0.0221443865, 1.13181746, 0.17731142, 1.04531753}, - {-0.246409684, -6.74617147, -1.41480792, -0.708906829, -0.492658496, -0.835357666, -0.793199182, 0.467104375, - -0.669779599, -1.29326534, -1.48258626, -0.305342972, 0.621524036, -0.870909035, -0.791852295, -0.92264545, - -0.115044825, 1.05326974, 0.191751197, -1.09994972, 0.0167585313, -0.168009833, 0.528036594, -0.0911829546, - -0.305217266, -0.371205837, -0.628309309, -0.511189222}, - {-0.0183637235, -5.97602224, -1.54999542, 0.27182433, 0.700630844, 0.587660611, -0.899789035, 1.0387249, - 0.454046667, 1.03051603, 0.699271917, -0.0274554752, 0.131003663, -0.302187681, 0.0699125826, -1.54073298, - -0.831891894, 0.151683837, -0.519377828, -0.708282888, -1.0392046, -1.00961077, -0.302910656, 0.172927633, - 0.320221275, -0.775013685, 0.952375174, 0.952872753}, - {0.0252061635, 0.463108838, -1.40316641, 0.34715414, -1.18511271, -1.52132845, -0.0562454909, 0.533362091, - -0.115779579, -1.35110748, -0.104003109, 0.343484044, 0.512594402, 0.22683759, 0.285169482, -0.0378336683, - 0.800351322, 0.825654924, -0.0724470392, 0.333263576, 0.426456064, 0.316955447, 0.165265813, 0.210159793, - -0.0645591319, 0.241320148, 0.183158502, -0.323120356}, - {0.0471641235, -2.09173703, -5.94888783, 0.0363560803, 0.764787674, 0.434283227, 0.118441857, 0.369244814, - 0.16298613, 0.406094819, 0.15197961, 0.386405736, -1.06589234, 0.909065962, 0.2885952, -0.681465864, - -0.53678304, 0.466727346, -0.853846252, -0.349436104, -0.697404444, -0.223913014, -0.414722085, -1.25803828, - 0.211821601, 0.147400647, 0.665444076, 1.65016246}, - {-0.132126927, -2.40161395, 1.52905095, 0.302902311, 0.0542309545, -0.789496779, -0.349242747, 0.379570693, - 1.09054339, -0.873692811, -0.557734251, 0.136953861, 0.392721862, -0.594784379, -0.300673991, -0.769517303, - 0.534889638, 1.03687501, -0.000797802815, 0.0740987659, -0.972185016, 0.100398093, 0.623595774, -0.0817591697, - 0.459222734, -0.156905219, -0.556149125, -0.195875064}, - {0.168103874, -3.38225269, -7.45486927, 0.0790208653, -0.0613481291, -0.353706211, -0.173535258, -0.133646145, - 0.383227289, -0.187396392, 0.787273526, 0.758880019, 0.0788550526, 0.422653973, -0.95701468, -0.121355377, - -0.180833474, 0.213991895, 0.483774126, -0.603395939, 0.393965006, 0.342686743, -0.334660411, 1.14106202, - 0.873602152, -0.116890632, -0.607477129, 0.686908424}, - {0.0467888638, -2.20089507, -6.09024811, 0.53390193, -0.0421328396, -0.868572891, -0.188594535, 0.317230076, - 0.399568319, -0.428844392, -0.156383097, -0.198275939, 0.0449278951, 0.10434451, -0.0901117474, 0.165104106, - -0.51992178, 0.64246875, -0.121786334, -0.349139869, -0.468592167, -0.249722928, 1.30048633, 0.606188893, - 0.635607362, -0.710971713, 0.583102643, 0.605073988}, - {0.0656126142, -3.28207159, -4.81875515, -1.07968974, -0.145864934, 0.154669747, -0.280969352, 0.320753038, - -0.212449029, -0.167698443, 0.0577522963, 0.0185784008, 0.337892562, -0.397121102, 0.431193471, 0.0942988172, - 0.12814635, 0.339847893, -0.115297936, -0.532593846, 0.440031469, 0.317035586, 0.112250544, -0.488547266, - -0.292454779, -0.132742479, 0.273396432, 0.333468407}, - {-0.186328053, 0.441147774, 0.448496431, -0.146070749, -0.0183207784, -0.522439063, -0.24307026, -0.214465037, - -0.200205803, -0.2869699, -0.589705765, -0.304230481, -0.72798723, 0.158653632, -0.486724168, -0.909697711, - -1.16272378, -1.2644918, -1.39410186, -1.05124629, -1.00886631, -1.58502269, -1.22878945, -0.314202309, - -0.460029751, -0.891982436, -0.128585771, -0.0126661994}, - {0.00504760165, 0.144426256, -0.246634945, 0.35747838, -0.820366442, 0.433128923, -0.046665296, 0.254659474, - -0.371240526, -0.832461119, 0.402360827, -0.797696292, -0.00146429334, 0.438332766, -0.751465261, -0.465652227, - -0.0487003475, -0.0501887538, 0.337998003, 0.453143507, -0.205787376, -0.415506274, -0.392902464, -0.175161168, - -0.69014442, -0.761076927, 0.373483717, -0.439977497}, - {0.135555208, -0.6259197, -0.51970458, -0.194122896, 0.164750054, 0.143113479, -0.045417577, -0.738947809, - 0.227071077, 0.371185422, -0.29501313, 0.0408539958, -0.70412004, 0.486674011, 0.94399339, 0.75646466, - 0.485905141, 0.0377950147, 0.0715787932, 0.327870905, 0.665078521, 0.371901304, 0.542856693, -0.142165869, - 0.908733845, 0.582243383, 0.33418268, 0.139892861}, - {-0.0648913607, -0.230966255, -0.259601831, -0.0745151713, 0.0472630002, -0.321782976, -0.306530833, -0.157662004, - 0.0254050847, 0.324624449, -0.0709752813, -0.141884401, 0.0507391579, -0.0757056847, -0.157681957, -0.119420625, - -0.262200207, -0.0173902176, -0.0164132658, 0.193601683, 0.0987579525, -0.175446317, -0.131138459, -0.0735060126, - -0.277159184, -0.252765417, -0.369196773, -0.257921219}, - {0.0844778866, 0.892540693, -1.32926595, 0.456822187, -0.693393826, -0.585095227, -0.125464708, -0.528994083, - 0.319878489, 1.00453937, 0.309393376, 0.126583681, 0.435089469, 0.289659441, 0.0382879786, -0.516187608, - -0.472498536, -0.391363978, 0.923955619, -0.0638227761, -0.174506798, 0.584563315, 0.0489761271, 0.303213388, - 0.216605738, 0.0317115039, -0.321899742, -0.564079046}, - {0.0189528465, -3.0205822, -1.68587577, -0.251698524, -0.475433588, -0.971832633, -1.07393265, -1.38159871, - -0.768532395, -1.3485446, 0.672052383, 0.750761509, 0.0974989012, -1.22051561, -0.304549128, 0.0599426366, - 0.848886073, 0.148535281, -1.01976526, 0.19406943, 1.04196799, 0.341549993, 0.302664399, -2.00212812, - -0.044665616, 1.33579087, 2.18833113, 0.196794346}, - {0.0786969289, 0.207598895, 0.486236781, 0.0531402193, -0.0630944371, 0.136102006, 0.185946807, 0.0467807129, - 0.157476917, 0.132640272, 0.0891285166, 0.127292573, 0.0694935322, 0.149040863, 0.145731449, 0.0687535703, - 0.101524286, -0.00716298493, 0.592883408, 0.49983862, 0.493310422, 0.510374248, 0.475238651, 0.0772901922, - 0.0741703436, 0.0470497161, 0.110227838, 0.102081731}, - {-0.103361376, -2.65235138, 2.07695842, -0.81054908, -0.313742459, -0.763440788, -0.25050804, -0.59270668, - -0.408340752, -0.354886025, -0.75516212, -0.6777547, -0.946402073, -0.154148415, -0.291553974, -0.731240928, - -0.48112008, -0.576338828, 0.555637181, 0.585384488, 0.096024178, 0.0230386611, -0.179106727, -0.642500818, - -1.17103994, -0.360282987, -0.405690193, -0.128080323}, - {0.120190412, 2.18909144, -8.46683598, 0.690627515, 0.534538269, 0.510531306, 0.210100189, 0.479442775, - 0.41575247, 0.149613187, 0.134456545, 0.483546972, 0.396226913, 0.683880866, -0.0265977494, 0.13370809, - 0.370286822, 0.372812271, 0.44955197, 0.32776165, 0.252264082, 0.323883742, 0.545395017, 0.556549609, - 0.713437796, 0.263677776, 0.729170442, 0.803847492}, - {-0.00990546681, -1.16817534, -3.404778, 0.00472787581, 1.45350289, 0.407304466, 0.117262423, 0.6980654, - -0.755611539, 0.373543829, 0.576888978, -0.259640276, 0.80543679, 0.58156544, 0.613461792, -0.319180429, - 0.0519511364, 0.0127357244, 0.138550594, -0.503188372, -0.34847036, -0.193370789, -0.272770047, -0.144270316, - 0.307402313, 0.333475471, -0.0797477737, -0.451472282}, - {-0.0810644105, -5.36067104, 3.63138127, -0.767825305, -0.730496109, 0.0861925483, -0.584841967, -0.235753119, - -0.637050331, -0.281115383, -0.364885002, -0.565459013, -0.305406958, 0.171418488, -0.0766901374, 0.0344355367, - -0.217474326, -0.263764828, -0.272660613, -0.128348693, 0.198026255, -0.154312968, -0.705682576, -0.0981741697, - 0.0157494843, 0.0139397345, -0.225139171, -0.429867446}, - {0.0494806357, -2.62793899, -3.30275679, -0.676860929, -0.242857337, -0.999933064, 0.453973234, 0.0451071896, - 0.915692508, 0.184754789, 0.301989079, 0.374045968, -0.240403205, 0.609903097, 0.50146383, 1.25471568, - 0.352856666, -0.193567917, 0.592190742, 0.410122901, -0.271732777, -0.207192421, -0.91588062, 0.171692029, - 0.970233381, 0.633579373, 1.08946228, 0.914925992}, - {-0.128533393, -4.59956074, -2.25347877, -0.857251048, -1.41797447, -2.11075878, -1.90714383, -1.73755312, - -0.64231056, -0.21889554, 0.0228042938, -0.325732946, -0.130355373, 0.54209137, -0.396911502, 0.307778239, - -0.332568079, 0.079002291, 0.73528564, 0.116297394, -0.634565234, -1.46313703, 0.204324812, -0.150854513, - 0.996054411, -0.518678546, -0.318085939, 0.120147653}, - {-0.185454667, -9.22687817, -0.771052778, -0.477409929, -0.372024924, -0.277389944, -0.343998075, -0.862956285, - -0.630431712, -0.155055434, -0.634139299, -0.43316412, -0.50519067, -0.437925428, -0.199404866, -0.337778926, - -0.259445459, -0.511975288, -0.529878914, -0.478819311, -0.437376946, -0.463468611, -0.42474857, -0.668455541, - -0.534354448, -0.540537477, -0.499020278, -0.60747695}, - {0.217490569, 2.23294711, -1.73882985, 0.354090869, 0.511141896, 0.599470794, 0.54344368, 0.325394273, - 0.77486825, 0.729058921, 0.719261944, 0.751142442, 0.613670409, 0.818025529, 0.808399796, 0.691641152, - 0.767163217, 0.672254205, 0.791349888, 0.961657524, 0.684984148, 0.744035125, 0.633737922, 0.445100725, - 0.764385223, 0.599274218, 0.569571316, 0.36910665}, - {0.0680011883, -0.141525134, 0.608115494, 0.106840186, -0.061644841, 0.311127216, -0.0361108258, 0.255941838, - -0.254869759, 0.0517963171, 0.112334773, 0.279684216, 0.466534257, 0.45050621, 0.206787363, 0.24129279, - 0.2476044, -0.000249022385, -0.0412789732, -0.120305732, 0.403608739, 0.420840859, -0.0191493798, -0.176183328, - -0.0729398727, 0.517172635, 0.125035092, 0.00305919233}, - {0.136051759, -0.0154735642, -1.08757341, -0.746539235, -0.589996576, 0.321027815, 0.757336795, 0.248112336, - -1.42974126, -0.225172669, 0.400551528, 0.481706113, 0.802500308, -0.993251145, -0.414106816, 0.114978746, - 0.0362451002, 0.223054335, 0.259547591, 0.0493675098, 0.021725541, -0.141420424, 0.141650572, -0.383692712, - -1.13459575, -0.370508611, 0.531831622, -0.394069403}, - {-0.0247515328, -3.75203705, -3.28242469, -1.09618807, -0.0671465099, 0.317322344, -0.53469032, -0.403174758, - 0.290458262, -0.059117496, -0.284698397, 0.418337703, 0.331433296, 0.201873526, 0.0269236341, -0.131931692, - -0.401278794, -0.542468548, 0.0979440659, -0.375371873, 0.106137544, -0.0227250904, -0.0387178957, -0.770952106, - 0.473305196, -0.14553991, 0.0323893614, -0.0983058661}, - {0.121550478, -1.20097578, -2.96541047, -0.981075048, 0.95280093, 0.75922364, 0.0870448053, 0.896997392, - 0.7241624, 0.315399319, 0.311144173, 0.356648207, 0.169853419, 0.461099893, -0.353262663, 0.620792806, - -0.141449422, -0.524455607, -0.170073077, 1.27285218, 0.210375085, 0.0834764838, -0.102093987, 0.0176223777, - -0.141467556, 0.746384025, 0.170173422, -0.69785428}, - {-0.0791102052, -0.347374827, 0.107073911, 0.233195081, -0.206529081, -0.30429247, -0.497484356, 0.151661664, - -0.5368101, -0.0362392329, -0.123587944, -1.00701988, 0.0480095968, -1.06661069, -0.659112275, -0.321277708, - -0.622343838, -0.627477169, -0.541736662, -0.709596395, -0.571051478, -0.710240304, -0.452208102, -0.527482331, - -1.0322777, 0.00206571748, -0.231442511, -0.497865587}, - {0.0845473409, -1.38251448, -3.05260706, -0.0213376638, 0.744133651, -0.601952314, -0.581485391, -0.629590273, - 0.308812827, -0.246839851, 0.53752625, -0.445156962, 0.722199798, 0.375423521, 0.0240628216, 0.416546077, - -0.438310236, -0.272160798, 0.879133999, 0.289178818, 0.154044807, 0.517107129, 1.06396961, 0.161833867, - 0.856201231, 0.824694753, -0.569748759, 1.1690824}, - {0.0797297731, 1.23410141, -0.649697781, -0.785597503, 0.0405770466, 0.189385891, 0.0761621445, -0.21260345, - -1.92817712, 0.354788899, -0.0287855789, -0.436804414, -0.484741211, -0.368482411, 0.0218798611, 0.178884551, - -0.500666261, -0.526111066, -0.113748975, -0.143456414, 1.12657678, 0.0987133533, -0.176197022, -0.0326661766, - -1.00384998, 0.378343344, 0.369729102, 0.0732632577}, - {0.0749957487, 0.647937, -0.139397129, 0.149107605, 0.117675401, 0.0703874156, 0.155242607, 0.391989201, - -0.0147751728, 0.248808801, -0.0176097173, 0.354990423, 0.105021313, 0.310541123, 0.479488283, 0.399166375, - 0.623566747, 0.550043166, 0.490510315, 0.267156988, 0.420536071, 0.411517382, 0.211521819, 0.0443741903, - 0.315481931, -0.122099027, 0.219476625, -0.0325079039}, - {-0.314885944, -9.91029453, -1.01080608, -0.535474598, -0.661661565, -0.0400171913, -0.684226394, 0.0739472285, - -0.637683392, -0.234634548, 0.262685686, 0.352341652, -0.384370744, -0.684700787, -0.639763236, -1.006724, - -1.14319217, -0.602748215, -0.278669477, 0.439627349, -0.624651015, -0.688860774, -0.479809672, -0.274525553, - -0.237743154, -1.14651179, -0.605139911, 0.308806986}, + {-0.0327966809, -0.849028409, 0.320328206, 0.0664111227, 0.155971751, 0.136044472, -0.00183201977, 0.0259891637, + -0.103044406, -0.0878473818, -0.111988924, -0.0281787626, 0.0233191121, 0.0340672508, -0.116517693, 0.0786981806, + -0.033087898, -0.0191416461, -0.0418186784, 0.0299366601, 0.129078865, 0.210277751, -0.0878753513, -0.16809991, + 0.183557138, 0.0773182437, 0.00833065622, -0.129053324}, + {-0.232422128, -0.370269567, 0.0436205007, 0.118296452, 0.276195407, 0.0144479489, 0.0654506907, 0.158887953, + 0.191858098, -0.0517155342, -0.244451404, -0.125561059, -0.0896938592, 0.0359078906, -0.210722655, 0.0546264574, + -0.000386662432, -0.203128114, -0.110388502, 0.0506071635, -0.0311401319, -0.220078811, -0.267996103, -0.0645042881, + -0.0720345527, -0.0144871268, 0.0379357971, 0.19760336}, + {0.143517047, 0.461968422, -0.0368016027, -0.0532734208, 0.0322881229, 0.0898226947, 0.0915338397, 0.0190777127, + 0.133846223, 0.142191216, -0.0915253386, -0.306803763, -0.0380108915, -0.129703835, -0.199441567, 0.000432319532, + -0.274927408, 0.151206657, 0.149368867, -0.0311864335, 0.10706003, -0.250302374, 0.0135332439, -0.0247054715, + -0.144645497, 0.012202654, 0.127603009, -0.261716813}, + {0.37940985, -0.762116253, 0.262937844, 0.196448311, 0.128611773, 0.143141568, 0.0354653858, 0.0714338198, + 0.0526182391, -0.0284320787, -0.0909866616, 0.00160601118, -0.0131304376, -0.0087870378, -0.0790232494, 0.170186028, + 0.0124546411, 0.24668017, -0.123244673, 0.114249617, 0.0507926047, 0.0301113036, 0.0254878979, 0.0012888104, + 0.0481759012, 0.132455707, -0.0525954738, -0.0175022539}, + {0.074402608, 0.260246873, -0.276144296, -0.0815522224, 0.197062433, -0.06345281, -0.100271419, -0.106380343, + -0.0884729922, 0.166795343, 0.0396520607, -0.0688257292, -0.22026509, 0.198000178, 0.190615907, 0.21529144, + -0.111042753, -0.104039237, 0.141359493, -0.0413182974, 0.0707519352, 0.176101342, 0.0630806237, 0.0369620025, + -0.00754281459, 0.26548624, 0.329247683, 0.0936621875}, + {0.196199581, -0.777962685, 0.222963452, 0.144866258, 0.299427301, -0.170608833, -0.0107537732, 0.0334474221, + -0.0545026101, -0.170532703, -0.0955553353, 0.0886289254, -0.144142464, -0.108097322, 0.36247465, 0.0131274331, + 0.00348300766, 0.0561952814, -0.147253215, -0.100337073, -0.0917735919, -0.139391139, 0.109980658, 0.0572417304, + 0.0207896996, -0.23384586, 0.0384591594, -0.230361491}, + {0.125237495, 0.255875736, -0.731187284, -0.00486617349, 0.064308472, 0.0240294375, 0.0664017275, 0.024102632, + -0.0158604141, 0.255495459, 0.219094172, 0.252941221, -0.180225447, 0.306452423, 0.087368533, -0.000120467637, + 0.107433036, 0.0402439535, 0.00487702852, 0.0846315399, -0.0223551802, 0.0620370544, 0.206932738, 0.0978457034, + 0.0170694906, 0.239671543, 0.183153465, 0.222705886}, + {-0.015978042, 0.495313853, -0.0727920309, -0.0695979372, -0.0934259444, -0.188311845, -0.0930854827, -0.0258944891, + -0.10962186, 0.00085817551, 0.113096714, 0.151041895, -0.0145681174, -0.0232806094, 0.116716482, -0.0321872234, + 0.0127832396, -0.127705872, 0.0211655833, -0.0124515155, 0.145493716, -0.00473560253, -0.199193865, 0.0644743815, + 0.266671836, 0.227437541, 0.104297556, -0.0958255976}, + {0.177132919, -0.477607757, 0.144386053, 0.160813257, 0.0411900207, -0.0375679731, -0.0877529383, -0.318532139, + 0.147213399, 0.0386164039, -0.14660874, 0.0772071481, 0.154627398, 0.0516344272, 0.25825727, -0.34341836, + -0.154420316, 0.0126185371, 0.114462152, -0.0210530255, 0.0650884658, -0.158406928, 0.20796679, 0.311294734, + -0.0307657998, 0.220018804, 0.0843197182, 0.0318490267}, + {-0.143348619, 0.57723707, -0.167421147, 0.0432183556, 0.0963400528, -0.0632183403, 0.0160206761, 0.153261781, + 0.17568545, 0.21255073, 0.139270023, -0.0744754225, 0.162524521, -0.356016427, -0.0135601126, 0.00355843524, + -0.0459654592, 0.182051256, 0.0428424925, 0.249047101, -0.0521542728, 0.0470912047, -0.00493410742, -0.0362312645, + 0.0551555827, -0.15180932, 0.0567677952, -0.127837405}, + {-0.177759811, -0.399459153, 0.362479776, -0.231218308, -0.0571496971, -0.215457886, -0.041013632, -0.155303478, + -0.00365723623, -0.0360452794, 0.086675778, 0.0946387649, -0.0596231334, -0.0528809465, -0.0608507916, 0.0974357054, + 0.15666078, 0.144844159, -0.233142078, -0.0683881193, -0.197862208, 0.0079383431, -0.0491543636, -0.237530455, + 0.0869428143, -0.0155181047, 0.14296563, -0.203361988}, + {-0.135610953, -0.515577078, 0.187429383, -0.386475623, -0.263546288, -0.189983353, -0.183594242, 0.0614784621, + 0.101142682, -0.0507217459, 0.0219676979, -0.0499989986, 0.0447606258, 0.00985840801, -0.118195668, -0.125932857, + -0.126534969, 0.162314728, -0.0228499919, 0.10694021, 0.0450071394, 0.0233288463, 0.0638386384, 0.181355521, + 0.161386982, 0.253616393, -0.0185366403, -0.0103700431}, + {0.116066948, 0.230095431, -0.577219665, -0.00176732871, -0.0354329534, -0.184090063, 0.0063507217, 0.0104860207, + 0.187727243, 0.164154455, -0.0068182447, 0.450454444, 0.0753799006, 0.161530346, 0.100438818, -0.242872655, + 0.235181689, 0.0256177448, -0.0181338936, -0.0927853286, -0.26312992, 0.136945054, -0.175206229, -0.0988252237, + -0.0631639063, -0.255761683, -0.163861006, 0.106347635}, + {-0.0344641991, 0.274572223, -0.345863968, -0.122686431, 0.0927828476, -0.192586705, 0.109781772, 0.0370874107, + -0.0434339605, 0.0172786023, 0.146092772, -0.284762889, -0.0538897403, 0.137360573, -0.125977561, -0.0443444066, + 0.336072117, 0.0786332563, -0.0310949516, -0.0446783081, -0.171269313, -0.0507826805, 0.25020206, 0.0226673484, + -0.21485059, 0.253266126, -0.237181798, 0.0952570587}, + {0.229862884, 0.0956004262, -0.272337317, 0.152852312, 0.155451983, 0.179551527, 0.231330171, -0.0967956483, + 0.212853789, 0.121237807, 0.0236221664, -0.0206717327, 0.334097952, -0.172256872, 0.160187855, 0.00531522091, + -0.0434170552, 0.272546887, 0.159098446, -0.0934782103, 0.168242097, 0.118903928, 0.0312071871, 0.336537451, + 0.31537354, -0.300766915, -0.00848419033, -0.115319557}, + {-0.355654269, 0.0498101525, -1.15184617, -0.20529826, 0.124733545, 0.0494314358, -0.155878648, -0.0435665511, + 0.0997435674, 0.165121913, 0.211950243, 0.244017676, -0.00921800453, 0.0786220804, 0.106060654, 0.0370148942, + 0.16638127, -0.0690576211, 0.101131886, 0.197833538, 0.184425309, 0.182694569, 0.273633808, 0.304017037, + 0.264311314, 0.180245876, 0.220357925, 0.169165999}, + {0.0476071648, 0.575009942, 0.0240747761, -0.00991211552, -0.118370712, 0.120641254, -0.182885289, 0.0205270611, + -0.162992015, 0.114992462, -0.0377214141, -0.111040004, 0.164136425, 0.198002562, -0.0279242396, -0.0862916112, + -0.0147629771, 0.176555663, 0.190007567, -0.0220985059, 0.10779497, 0.0305426661, -0.00504364446, -0.061483372, + 0.00220328593, -0.151691139, -0.18975012, -0.0886880532}, + {0.0942182094, -1.02115965, 0.0954312235, -0.0614463389, 0.0582791232, -0.211247653, 0.120826431, -0.0263190717, + -0.0429489613, 0.0438488349, 0.108414263, 0.286097229, 0.0486925356, -0.00557497423, -0.386668414, 0.116027936, + 0.159973353, -0.0378721952, -0.147194281, 0.0364145115, -0.138756022, 0.0840869546, 0.0988396257, 0.199231848, + -0.16837652, -0.218392238, 0.0364278741, 0.184144482}, + {0.0313743576, 0.464891553, -0.343129277, 0.0745515227, 0.133510157, -0.130122691, 0.204167008, 0.183675036, + 0.163727522, -0.0306751318, -0.0975880995, 0.300920784, 0.0403036363, 0.0165737085, -0.0506653748, 0.306970119, + 0.0347042456, 0.122590847, 0.137978703, -0.337507486, 0.072252959, -0.0753405616, -0.13210395, 0.0820999891, + -0.151417568, -0.228030756, 0.278595537, -0.166134581}, + {0.0749740228, 0.383804917, -0.244671553, -0.0318614729, -0.122872017, 0.111543134, -0.059995994, -0.207018256, + -0.15501295, -0.0396881066, 0.0188584458, -0.158006668, -0.136983156, -0.146490023, -0.119557768, 0.0274210349, + 0.189562142, 0.0979207903, 0.187646285, 0.305040985, -0.103709385, -0.1757451, 0.0526049584, 0.135050699, + 0.0981734395, -0.0416866057, 0.0656170994, -0.113399491}, + {0.111926369, 0.631603658, -0.213556454, -0.208104923, -0.00973121449, -0.0353202149, -0.0976402387, 0.0449560247, + -0.0954720303, -0.209680378, 0.18582876, -0.0749629959, 0.136392593, 0.118229896, -0.124932677, 0.0410939157, + 0.140551493, -0.0477282181, -0.0566262752, -0.0277045444, 0.0501787104, 0.103633828, -0.0787583515, -0.170118868, + -0.0399634317, 0.0881562829, 0.13748309, -0.0653122738}, + {0.0422349945, 0.268487811, -0.371606022, -0.240228266, 0.152170882, 0.181562856, -0.0260443613, 0.0313097723, + 0.0791669488, 0.00669098739, 0.0367588401, 0.100363895, -0.103536002, -0.160531029, -0.129726171, 0.115801521, + 0.183067113, -0.0064961426, 0.20049791, 0.0229622722, 0.224132463, 0.132634297, 0.0431498997, 0.292030126, + -0.20329383, -0.321311265, 0.380737811, 0.0533876978}, + {0.0423549935, 0.545092583, -0.0056740921, -0.0579509884, 0.186991572, -0.0511583164, 0.0363087691, -0.013058072, + -0.0792236552, -0.0565847829, 0.228842065, 0.102448463, -0.310782939, 0.0870372429, 0.00986074284, 0.0135655776, + 0.0871979743, -0.0234711487, 0.126438633, -0.049873516, -0.0199311897, -0.112338968, -0.102786727, -0.0444611907, + -0.080532141, 0.0333675183, -0.374372333, -0.0631537363}, + {0.320916384, -0.850471079, 0.36133939, -0.0264140144, 0.0270986855, -0.0817172825, -0.0899385288, 0.105402164, + 0.0404002219, 0.0527301542, -0.0897375271, 0.0683722198, -0.30544129, 0.16623114, 0.102807485, 0.138525441, + 0.0128897438, 0.048605945, 0.127630606, -0.0460698865, -0.0285244118, -0.0167056993, 0.136670813, 0.363035947, + -0.0855078623, 0.200538412, -0.0854634196, 0.0674120039}, + {0.17211771, 0.418086618, -0.987294972, 0.0548037775, 0.030457316, 0.130074278, 0.114169322, 0.291047484, + 0.0958323926, 0.121433266, -0.0400433503, 0.0543242656, 0.0787405372, 0.277183324, 0.00192958582, -0.00355765177, + 0.279254735, 0.0227443743, 0.104033187, 0.193143278, -0.0147462944, 0.0827552304, 0.0353738442, 0.20449385, + 0.271232247, 0.00591993658, 0.0661802739, 0.0266063362}, + {-0.0284264255, 0.307593435, -0.388084114, -0.128581509, 0.0620412342, 0.216876224, -0.102445893, -0.0747132823, + -0.0188075863, -0.0261255819, 0.231668234, -0.294057548, 0.14395383, 0.360745192, 0.00237776805, -0.0177536439, + -0.0658051148, 0.112701818, 0.302921802, -0.00463867886, -0.202124089, 0.0665696114, 0.0152385999, 0.160947472, + 0.0765458494, -0.0139753614, 0.021561861, -0.134680942}, + {-0.0620607771, 0.2569969, -0.602090001, 0.170079336, -0.00421804516, -0.0612058714, 0.134604931, 0.158751324, + -0.0202514976, 0.317886651, 0.294003904, -0.0854902416, -0.189069107, -0.163591623, 0.0499041155, -0.00480309827, + -0.0270436388, 0.0513930246, 0.0968223736, -0.0291808061, 0.225834519, 0.204818681, 0.18821992, 0.0158534329, + 0.192891344, 0.347846657, 0.189079523, 0.240709171}, + {0.237171113, -1.07444179, 0.0595385209, 0.0428114906, -0.401686192, 0.135821328, -0.0996614397, -0.0802449062, + -0.176611021, 0.0751923025, 0.0679159686, 0.0336508043, 0.00897729769, 0.070944421, -0.0390727073, 0.0624247789, + 0.0806902051, 0.0497563519, 0.0425027497, -0.156341523, 0.0358913802, 0.121682912, 0.182410672, 0.087373063, + -0.0486592948, -0.25909099, -0.0857482255, 0.130385041}, + {-0.266789138, -0.714672029, 0.0457348563, -0.247173101, 0.054149121, 0.102863722, 0.261150658, 0.220601916, + -0.155780375, -0.0495292619, -0.243629262, -0.163746133, -0.0705772713, -0.0909804702, -0.0981470868, 0.0144898901, + 0.0119194267, -0.101180434, -0.0384970829, 0.193168938, 0.154063746, -0.0160782486, -0.149629474, 0.275630146, + 0.0725567192, -0.00868660677, -0.0179361291, 0.0192434676}, + {0.25597316, -0.628643692, 0.325987846, -0.0454979911, -0.193986222, 0.0625185519, 0.0740609989, 0.224848032, + 0.0214435272, 0.111464649, 0.0383397378, -0.0101018669, 0.12763834, -0.0285931267, -0.154859692, -0.0583917983, + 0.0629568174, 0.234438449, -0.0632330477, -0.184572533, 0.186874047, 0.21661669, 0.0223642346, -0.0295572262, + 0.0833248794, 0.0430041738, -0.0272386931, 0.0538445935}, + {-0.255340785, -0.431446224, 0.255294144, -0.207291782, -0.275969774, 0.146399915, 0.0671700314, 0.0685254335, + -0.0442528576, 0.0366354473, -0.0322947614, -0.138840735, 0.0564336963, -0.191869691, 0.0379548222, -0.0347893685, + -0.0374535695, 0.0111376438, 0.141148508, -0.0474141277, -0.06148348, -0.10512948, 0.0347383581, -0.155976951, + -0.115071684, 0.0716684088, 0.0650277957, -0.193132892}, + {-0.0198248103, -0.665595949, 0.308424711, -0.117144257, -0.143422335, 0.0635467619, 0.114446886, -0.199472398, + -0.153535321, -0.185896367, 0.0283037946, -0.0296921283, -0.189039126, 0.0107260458, -0.287400633, 0.111975417, + 0.000890996889, 0.00379971997, 0.0389732495, 0.124051832, -0.0673095882, -0.138007298, 0.00296997116, -0.125482947, + -0.0722345486, 0.017665023, -0.0432299785, 0.23013787}, + {-0.0938796028, 0.26599741, 0.179452583, 0.156520754, 0.0592871495, -0.182271212, -0.164303228, 0.0217962675, + -0.0251196697, 0.0123819718, -0.141588062, -0.0507559627, 0.113781102, -0.398992389, 0.0599240512, 0.0568731055, + -0.0264107157, -0.00281195692, -0.0121255908, 0.000793193583, -0.13898012, -0.0929844975, -0.0130555136, -0.190079406, + -0.125057548, -0.237495512, -0.279263943, 0.0154267624}, + {0.184870228, -0.424799025, 0.265541464, -0.0800969601, -0.0424672961, 0.013786165, 0.0454911254, 0.136813939, + 0.0233796611, -0.0624747984, 0.115257308, -0.333082497, 0.0254497938, -0.0702610388, 0.152677387, 0.00233586971, + -0.0344050899, 0.19816874, -0.0392915718, -0.00751153147, -0.276451588, 0.101876259, 0.0540470704, 0.00921946298, + 0.0738890022, -0.168509007, 0.200245559, 0.446258456}, + {0.166242033, -0.709089518, 0.0819624364, 0.207864583, 0.0943783298, 0.0627666339, -0.157678872, 0.0808582976, + 0.142877281, -0.0483946204, -0.188652158, -0.109966911, -0.140290514, -0.0123706162, -0.102081135, -0.0416024178, + 0.0444053672, -0.123667113, -0.000412677939, 0.0146662043, -0.0249320995, 0.0394151248, -0.00345696905, -0.0721295625, + 0.0104259737, -0.0282374844, -0.0612751208, -0.372232586}, + {-0.0908561349, -0.50424099, 0.36460939, 0.116886742, -0.0897323042, -0.0790256634, -0.0735211819, -0.094010517, + 0.134770617, -0.0872213319, -0.0250960123, -0.0342480876, -0.13522248, 0.0875531062, -0.139287576, -0.0788107067, + -0.0309917443, -0.013971773, 0.12630707, 0.138174534, 0.178088367, -0.177061409, 0.111784287, -0.159964547, + 0.196901917, -0.0148708327, 0.00100939558, -0.139011398}, + {0.222428203, 0.548003495, -0.183460534, -0.195474446, 0.132177651, -0.0167880878, 0.0346941911, -0.113624848, + -0.00750357099, -0.157805517, 0.123861238, 0.154056415, 0.0701404139, -0.123184867, -0.0854129344, 0.0486456044, + 0.149620861, -0.182917535, -0.113313332, 0.190823197, 0.0607460961, -0.256058186, -0.167113751, 0.00292423181, + 0.0715441108, -0.265839994, 0.100172222, 0.150921017}, + {-0.209795564, -0.445490181, 0.339325398, -0.0430583954, 0.126943722, -0.0847089216, 0.12482693, 0.188870236, + -0.290583313, -0.0140287215, 0.0248804186, 0.0772296339, 0.024528468, 0.1576951, -0.165122658, -0.197295308, + 0.117836066, 0.095140256, 0.035068851, 0.0308226459, -0.119586363, -0.141628832, 0.0227867719, 0.0615674034, + 0.102317519, 0.109672755, 0.0449697115, 0.0423111357}, + {0.0997125879, -0.643835008, 0.402138919, -0.060909003, 0.087278381, -0.199353904, -0.0677571744, -0.0682044104, + -0.0620288141, -0.099327758, 0.144922167, -0.00760109629, -0.0688901544, 0.0277856309, 0.0140461214, -0.123064242, + -0.0107705519, -0.0948464423, -0.0697977915, -0.0044042035, 0.00973115023, 0.239615172, -0.0963142291, -0.0154614104, + -0.0602534786, -0.277707934, -0.0343637057, 0.0200579017}, + {-0.0846133083, -0.225544512, 0.105834976, -0.148679182, -0.0984990597, 0.105468437, 0.000370013353, 0.0412738584, + -0.0512874909, 0.277934343, 0.132575735, -0.0474175476, -0.17643559, 0.0313785374, -0.112589166, 0.132917166, + 0.0260340273, -0.178984776, 0.0464426205, -0.240953937, 0.051820159, 0.0146862688, -0.0779495239, -0.176791102, + -0.142173737, 0.12076132, 0.109853931, -0.230161861}, + {0.0373572074, -0.482500464, 0.25357458, -0.1697651, 0.101301692, -0.0867829919, -0.0200036783, -0.07722193, + 0.0997101516, 0.031438496, 0.00668233447, 0.143404096, 0.00125936035, -0.182821274, -0.299057662, -0.028371457, + -0.00912011229, 0.0882987902, 0.0312455893, -0.034413591, -0.0744786188, 0.0778338984, 0.214330986, -0.0203507654, + -0.011373749, -0.061854478, -0.108812414, -0.338704824}, + {-0.221378356, -0.175015196, 0.108645648, -0.108072266, -0.325949728, -0.0398803987, -0.138031974, 0.0146193095, + 0.157143041, 0.0129260253, 0.236398906, 0.145656005, -0.0599400029, -0.0319008827, 0.0951944068, -0.363582313, + -0.0115377447, 0.0642020106, -0.157798067, -0.03866864, -0.132424772, -0.00142617896, 0.0778982639, -0.14119862, + 0.0132989939, -0.149921671, 0.0117457649, 0.16571863}, + {-0.0832153857, -0.383045048, 0.407540858, -0.12223646, -0.10257186, -0.0742110759, -0.00281105866, -0.0624314658, + -0.148057193, -0.0964461565, 0.17995964, -0.00212064409, -0.250820965, -0.0235731322, -0.248905912, -0.219279006, + 0.108331457, 0.0106705278, -0.160089657, -0.146454141, 9.04194894e-05, 0.0357510671, -0.132127479, -0.0804476738, + 0.044467289, -0.184648752, -0.0365048535, 0.0620448589}, + {0.168747291, 0.665642202, -0.203400046, -0.121521726, -0.101990141, 0.192371696, -0.0944612026, -0.0188306868, + -0.0123963701, -0.0832444057, -0.0309699643, -0.0261150151, -0.164056629, -0.0265408196, 0.0220349915, 0.0234606192, + 0.0383501388, 0.0455145687, -0.0698725209, -0.0353911333, -0.0287298411, 0.0285827611, 0.130257368, -0.0247240923, + -0.0381080359, 0.215325236, 0.280836046, -0.0143748997}, + {-0.250889868, 0.0943555459, -1.01099718, 0.0900751129, 0.0460359938, -0.107945047, 0.117342383, 0.00324740401, + 0.100444667, 0.121288314, 0.0066984361, 0.0436849184, 0.170291975, -0.240300998, 0.111862086, -0.00218504947, + 0.208654881, 0.370517164, 0.263780475, 0.178560123, 0.0537978671, 0.114361882, 0.491104722, 0.0475808419, + 0.116240658, 0.185079768, 0.222492456, 0.133718982}, + {0.136925384, 0.699429274, -0.20217289, 0.0528842732, -0.161435455, 0.0856114477, 0.0829547122, 0.0895441696, + -0.0720050186, -0.112925366, 0.0129745575, 0.103945486, -0.168313384, 0.148806095, -0.0881702006, 0.0938619673, + -0.0804485604, -0.190723091, -0.234409004, -0.167123437, -0.0816949829, 0.104089186, -0.183527038, -0.162552923, + -0.00859433971, 0.126945108, -0.0824209303, 0.0919883698}, + {0.0312780142, 0.378493398, -0.414773703, -0.0210916866, -0.10688886, 0.146697074, 0.222175926, -0.0394484289, + 0.113353834, -0.236497417, 0.236778721, -0.168184698, -0.0276480131, -0.0544794463, 0.0682628676, -0.107694648, + 0.0673495755, 0.170571491, 0.118018888, -0.201184586, 0.204378858, -0.0107787149, -0.0245366748, -0.0507135801, + 0.145614028, -0.0628045797, -0.148383945, 0.0247292407}, + {0.279424071, -0.621752799, 0.10982015, -0.192083746, -0.0201535542, -0.0474759117, -0.153094143, -0.0903367177, + -0.180372924, -0.0101192947, -0.074468486, -0.244131699, 0.0217691604, -0.0175854266, -0.00111794844, 0.0662658438, + -0.107558064, -0.177438885, 0.0530214645, 0.0979351774, -0.123685583, 0.0640997291, 0.0387244411, -0.0329359248, + -0.0430655703, -0.141068548, -0.0208792631, -0.201202422}, + {0.0953765959, 0.43103236, -0.65257138, 0.00203125738, 0.0929645672, 0.021978559, -0.0176894739, 0.118026279, + 0.113031849, 0.151246324, -0.0658009574, -0.0156626739, 0.0390655808, -0.210548267, 0.113327347, 0.112028003, + 0.285384238, 0.268649876, 0.00342139229, 0.104759984, 0.282413483, 0.047300145, 0.18244499, 0.195087403, + 0.117541209, 0.269700319, -0.0381023288, 0.00331049389}, + {0.0236073714, 0.352717727, -0.905731082, 0.0147891454, 0.156316295, -0.0348283425, 0.129759625, 0.174639463, + -0.0192886647, 0.0676184148, -0.261927456, -0.00101890007, 0.201116145, 0.368986011, 0.232292548, 0.0756529048, + 0.276705176, 0.0214575939, -0.101051025, 0.178804219, 0.0911055952, 0.110617347, -0.154760644, 0.139480129, + -0.0913352147, -0.0941458568, -0.219338164, 0.265909076}, + {-0.299325705, -0.32108897, 0.365365654, -0.0597798079, -0.192143306, -0.056004785, -0.184241816, -0.101236075, + -0.00425410224, -0.0617081895, -0.0325463973, -0.182327792, 0.0626748428, 0.0522314683, 0.199278608, -0.153223723, + -0.164057419, 0.028794691, 0.0870149657, -0.180546567, -0.141555086, -0.0875313133, -0.206852362, -0.247230828, + 0.0741038918, 0.0238275137, -0.149651453, -0.0830186531}, + {-0.089897193, 0.0543399937, -0.97253561, -0.0570828989, 0.243328556, -0.219835833, 0.0773996413, 0.0641483217, + 0.0957359374, 0.0284418184, 0.0844955295, 0.0770431533, -0.109808497, 0.218176842, 0.340076387, 0.173030689, + 0.122401461, 0.206058487, 0.277729839, 0.1645284, 0.0858763531, 0.174288616, 0.3514615, -0.116351783, + -0.167252302, -0.0922610387, -0.241091907, 0.320072532}, + {-0.126178548, -0.3556979, 0.160933569, 0.045801498, -0.126005456, 0.0410111398, -0.040566016, -0.0592377335, + -0.353209168, 0.124203742, -0.00371726719, 0.0437119231, -0.0221093912, -0.0364640728, -0.199836656, 0.0136854202, + -0.0961830989, 0.0247585587, 0.0657496303, -0.15837355, 0.0117658759, -0.0454306006, -0.103992194, -0.0966688618, + -0.0808225051, -0.205592737, -0.0783866048, 0.0400378443}, + {0.0753203779, 0.212423071, -0.335561395, 0.0371152051, -0.00624634512, -0.0767390877, 0.353510112, 0.124409571, + 0.0959814936, 0.149520561, 0.064444989, -0.141503125, 0.20419994, 0.341552198, -0.115343653, -0.0230761208, + -0.0732197538, 0.249887526, 0.0423662812, 0.0697008669, 0.00267239264, 0.161208361, 0.0339463241, -0.096737057, + 0.108872235, -0.0509665832, 0.393317372, -0.0662628636}, + {-0.1081025, 0.337014049, -0.348035723, -0.0557262972, 0.17494446, -0.0267558489, 0.0654556602, 0.173409015, + 0.0542335473, -0.0491583012, -0.0873503089, 0.355716586, 0.0532348566, 0.198868886, 0.099186264, 0.213731855, + -0.0484948158, 0.0461185686, -0.22602956, 0.140198648, 0.154098794, -0.086288847, -0.142145693, 0.380585313, + 0.119579278, 0.119902782, -0.126080945, 0.103236981}, + {-0.00659934711, 0.336247653, -0.143599629, 0.0111724464, 0.0652167872, 0.212150618, -0.203202173, -0.00370292133, + 0.105015032, -0.198592275, -0.245802343, 0.0346724615, 0.020992646, 0.290631115, 0.204020113, 0.0605916381, + 0.130011097, -0.0367579758, 0.0869355053, 0.0425234139, 0.15200606, 0.0576826259, 0.0643639043, 0.172535539, + -0.00845283736, -0.525847316, 0.0868713334, 0.0233393312}, + {0.121186115, 0.566212177, -0.200393736, -0.0783463493, -0.238486201, 0.0341170356, 0.12607339, -0.0198645089, + -0.131215259, -0.0107770506, -0.288712323, -0.043558117, 0.0644698739, -0.0797946602, 0.0177132133, 0.192269072, + 0.0417283215, 0.0526744239, 0.152099684, -0.0560456626, 0.0913355649, 0.0443706959, -0.00987066235, 0.00622226438, + 0.284863949, 0.0113154771, -0.0145026091, -0.0994698703}, + {-0.301966906, -0.289107293, 0.403628707, 0.0257093087, -0.0594269037, 0.224131748, -0.0750426799, 0.0897050574, + -0.0104500335, 0.0471670181, 0.148263156, -0.0591900311, -0.170127288, -0.0669645667, 0.231150597, 0.134171575, + -0.183889866, 0.0655304492, 0.0845314786, -0.108105801, -0.261481732, -0.25766179, -0.0586438663, 0.0497755408, + -0.227853164, 0.220039099, -0.0332313031, -0.149900198}, + {0.141860977, 0.196703374, -0.270576715, 0.25587526, 0.145338163, 0.238889351, -0.223091304, 0.273723692, + 0.325054318, 0.376394391, 0.0483152419, 0.0196432751, 0.14002876, -0.337235451, 0.174385816, 0.0380203947, + -0.194533706, -0.0329747163, 0.0711442977, 0.0682259947, -0.153204292, 0.111863129, -0.076969251, 0.0289159603, + 0.26924172, -0.0123258559, -0.17868872, 0.0955694541}, + {-0.0360611491, 0.567937195, 0.0658047274, -0.192125201, 0.0489754528, -0.0355846174, -0.125010684, -0.0691983476, + 0.164968669, -0.0764214993, -0.121901527, -0.0492722765, 0.0792014748, 0.182673201, -0.0952295214, 0.00364974141, + -0.0818598866, 0.198710933, 0.0925279409, -0.0156603139, -0.163219973, 0.026096046, -0.010049344, 0.100556009, + 0.0802703351, 0.0288523845, -0.154722258, -0.0426359288}, + {0.142226487, -0.569559038, 0.194072172, 0.267225862, 0.0145430062, -0.062622495, -0.267375737, -0.0350063965, + 0.00774446828, 0.000546254392, -0.1847381, 0.239819542, 0.164717555, -0.0906020775, 0.0303991865, -0.103173487, + -0.179536983, -0.217887983, 0.0268395506, -0.105704241, 0.021085538, -0.201607659, 0.195839211, -0.0313468575, + 0.00704617985, -0.214902297, 0.183178484, -0.0427076146}, + {0.130361095, 0.379833281, -0.691268146, 0.00530770095, -0.0302139893, 0.160543218, 0.21775116, -0.0159080569, + 0.0163280293, 0.275390446, 0.0773448646, -0.0684096962, 0.13551569, 0.227919444, 0.156825364, 0.00751302438, + 0.00561760459, 0.157874718, 0.0932718292, 0.250404924, 0.170823276, 0.0483327955, -0.00681147631, -0.0474242605, + -0.0724443793, -0.077291742, -0.122606024, 0.117129609}, + {0.0915502012, -0.659247637, 0.509728789, 0.0441474691, -0.0557199381, -0.0243097264, 0.141431034, -0.112389863, + 0.0734125152, -0.0746883079, -0.0385151245, -0.0927017331, 0.0744563192, 0.0546380691, 0.0646021664, -0.0136864586, + -0.233582005, -0.124937147, 0.0403360426, -0.0426002555, -0.0373593383, -0.111388773, 0.00400528964, -0.0763317123, + -0.0328928083, -0.0258809216, -0.00360900094, 0.103397682}, + {0.10512612, -1.0186826, 0.359897554, -0.0689984784, -0.191965997, -0.0447201654, 0.00754109723, -0.0682348832, + -0.0351571441, 0.0199430697, 0.0299874991, -0.145099133, -0.132816002, -0.0749566406, 0.232166484, -0.243656889, + -0.0961362347, -0.124484323, 0.0901719034, -0.0602608286, -0.0195772983, -0.23120141, -0.0100672627, 0.247495979, + 0.116775587, -0.12676765, 0.181228325, -0.161680922}, }; const float five_dense_biases[FIVE_DENSE_NUM] = { - -2.24697518, -2.79671645, -2.29277706, -1.64123476, -2.97337246, -1.55279529, -1.48783553, -2.33274174, - -1.22874868, 2.39438224, -3.13994718, -1.4903506, -2.2855773, -1.14909065, -0.74406594, -2.89792275, - -3.12807941, -2.84854364, -2.97222972, -1.20280099, -2.2895298, 0.345206112, -0.404011369, -2.12997103, - 0.026584696, -1.72927654, -1.31738377, -2.38992381, -1.09590578, -2.08547592, -2.00498819, -2.67043161, - -1.79812217, -1.43836403, -1.71620834, -1.53693056, -0.234484181, -1.45272624, -1.72868788, -1.82437479, - -2.66851068, -2.93813992, -2.29339194, -1.71646988, -2.62597537, -1.40944898, -2.04996037, 1.15793979, - 1.40398467, -2.33760524, 1.23705673, -2.31002736, -0.673910081, 1.02907646, 1.49880397, -2.22889376, - -2.86746573, -2.31694722, -2.66456366, -2.4524951, -2.56475425, 0.264515311, -2.28604388, -1.6073668 + 0.203197077, 0.171431124, 0.0542362593, 0.010253503, -0.088971585, -0.00711717922, 0.172927991, 0.00227641594, + 0.0942989886, 0.127396777, 0.065542087, -0.0226275269, 0.18209295, -0.0656128004, -0.162779644, 0.121284887, + 0.0472629927, 0.0403044261, 0.0781396776, -0.0697875172, 0.0938313156, -0.0170057435, -0.178557932, -0.101860248, + 0.257950097, 0.0419708751, -0.0579385757, 0.0134018641, -0.0107925115, 0.000416926487, 0.159764543, 0.195415705, + -0.173778772, -0.0549617335, 0.20672287, 0.281121969, 0.166390136, 0.140294284, 0.258097768, -0.163214743, + 0.178887889, 0.0231933035, 0.119052537, 0.0872517899, 0.0790024698, 0.142852455, 0.180583403, 0.0731969625, + 0.212757468, 0.00119585171, 0.16106452, -0.0451591834, 0.246450648, 0.0276041254, -0.276603937, 0.041676037, + -0.0785793141, 0.11476367, -0.116417132, 0.0230412055, -0.00355176162, 0.078909345, 0.321341574, 0.0147520248 }; const float five_logit_weights[FIVE_DENSE_NUM] NN_ALIGNED = { - 0.731341183, 2.23163199, 0.949222744, 0.296105713, 1.15792906, -3.42066145, 0.183252349, 1.14736974, - 1.31554925, 0.112483598, 1.14517629, -6.70101404, 1.21333194, -0.108623341, 0.0844625309, 1.39609873, - -2.15012026, 2.09257817, -1.00639415, 0.0941660404, 0.995582104, 0.0935992077, 0.140742123, 4.60981607, - -0.149704531, 1.17570782, -0.0730246454, -0.163265958, 1.5062983, 0.123115465, -1.43543541, 1.99429679, - -0.96264106, -0.183488742, 0.176509976, 0.478997976, -0.100140609, 1.20759714, 1.40249825, 1.35177362, - -0.17572777, -1.53293693, 1.50571012, -3.87809801, 0.552025557, -0.084801957, 6.23696709, -0.112289943, - 0.204722211, 0.951846004, -0.109762318, 0.919938505, -0.1393639, -0.47155264, 0.669605315, 3.53084946, - -1.02313769, 1.25685394, 0.606329083, -2.37867737, 0.991012573, 0.101894319, 4.19737768, -2.38213611 + -0.458478689, -0.209255874, 0.140492022, -0.564781547, 0.405265599, -0.440311015, 0.541238844, 0.259323061, + -0.471086144, 0.238409057, -0.162853003, -0.347012401, 0.258589387, 0.262367815, 0.589724004, 0.842550933, + 0.217535928, -0.756183088, 0.270296484, 0.198258087, 0.246317148, 0.42984435, 0.235945836, -0.768604398, + 0.629981279, 0.25837177, 0.555774868, -0.631168544, -0.352685004, -0.337388158, -0.182304159, -0.339989305, + 0.130236804, -0.301342487, -0.44408083, -0.239533186, 0.200740948, -0.315785319, -0.468884081, -0.197976172, + -0.215769649, -0.240125388, -0.160375997, 0.255743235, 0.757258832, 0.227804184, 0.191979542, -0.31971094, + 0.489403129, 0.441005349, -0.226921469, 0.637519658, -0.213778213, 0.331646353, 0.287307948, 0.287199259, + 0.214163169, -0.217752844, 0.219678804, 0.208426163, -0.488294423, 0.347436696, -0.393783629, -0.691565752 }; -const float five_logit_bias = -1.19490004; +const float five_logit_bias = -0.0842220336; diff --git a/include/weights_5.h b/include/weights_5.h index db2a69f..16a9465 100644 --- a/include/weights_5.h +++ b/include/weights_5.h @@ -21,16 +21,14 @@ #define FIVE_INP_NUM 3 + 5 * 5 #define FIVE_DENSE_NUM 64 -/* - * 16-byte alignment so the evaluation dot products can be - * auto-vectorised (SSE2 / NEON); the generated weights file defines - * the arrays with the same attribute. - */ +// this does some kind of magic vectorisation #define NN_ALIGNED __attribute__((aligned(16))) +extern const float five_embedding[7]; extern const float five_dense_weights[FIVE_DENSE_NUM][FIVE_INP_NUM] NN_ALIGNED; extern const float five_dense_biases[FIVE_DENSE_NUM]; extern const float five_logit_weights[FIVE_DENSE_NUM] NN_ALIGNED; extern const float five_logit_bias; + #endif diff --git a/include/weights_6.c b/include/weights_6.c index 46a4b2a..b3e2667 100644 --- a/include/weights_6.c +++ b/include/weights_6.c @@ -1,353 +1,358 @@ /* generated by nn_train.py, do not edit by hand */ -/* v000, random init */ +/* v100, val_corr=0.8278, rate=0.4500 */ #include "weights_6.h" +const float six_embedding[7] = +{ + 0.0065742908, 0.341578543, 0.000129325053, 0.46736002, 0.105096504, 0.587581694, -0.964083135 +}; + const float six_dense_weights[SIX_DENSE_NUM][SIX_INP_NUM] NN_ALIGNED = { - {0.0967933908, 0.152235463, -0.0614192784, -0.116048738, 0.0623112582, -0.00744370092, 0.0908687115, 0.0285693686, - 0.0498064198, -0.0174460411, 0.0166222081, -0.0213047192, -0.0292671397, 0.0549081974, -0.00460443879, 0.0673502311, - -0.0824786276, -0.00684418017, -0.00976472255, -0.0489899553, 0.135125622, -0.120328955, 0.112143882, 0.0176841151, - -0.111638449, -0.134414509, -0.0510589853, 0.103339747, 0.156812415, -0.071089603, 0.135174602, 0.147628561, - -0.0137038231, -0.102608897, -0.000696052623, -0.0819362625, 0.124802314, -0.0929139182, -0.0736945719}, - {0.046170868, -0.076052092, 0.016583629, -0.0504761301, 0.063017711, 0.0174844097, 0.0296908896, 0.030179983, - -0.0520321876, -0.0269424133, -0.00141432462, -0.114240572, -0.0771579817, 0.156956181, 0.00811995845, 0.145098194, - -0.122910231, -0.139889076, -0.0355544239, -0.146347016, 0.153959304, 0.0735633224, 0.0796753317, 0.0105854822, - 0.0996450186, -0.0806343853, -0.107449882, -0.136537611, -0.0845743269, 0.00968987588, 0.0723072961, 0.0369593203, - 0.0318404585, 0.0389426798, 0.0982192233, -0.0629131421, -0.00390470191, 0.0744172931, 0.0232409686}, - {0.0801415518, -0.00883672293, 0.118844368, -0.0118416753, 0.0218522996, 0.0874578357, -0.123666972, -0.082655333, - -0.110445045, 0.0933774188, -0.156682685, 0.010895675, -0.109671794, -0.041437503, -0.0170114096, -0.0339959972, - 0.150323465, 0.119653367, -0.123107895, -0.0554985739, -0.107801765, 0.0449913368, -0.00278799003, -0.103379816, - -0.0768386051, -0.038300667, -0.122454815, -0.0511640124, 0.115499534, -0.153769761, -0.102020904, -0.0397571214, - -0.0600364506, 0.13800694, 0.128838971, 0.0166580752, -0.144898668, -0.0822391063, 0.156828806}, - {-0.0476070866, -0.0204417929, 0.149377942, -0.0621875823, -0.0513824448, -0.0137019902, -0.13778761, -0.153707504, - 0.00218154024, 0.0717437565, 0.0483847447, 0.139130369, 0.151201025, -0.0224185493, 0.112728588, 0.0125691863, - -0.0310359802, 0.0955003574, 0.096587576, 0.0768995211, -0.0786039382, -0.000798063003, 0.100020267, 0.111495212, - -0.0618414842, -0.159008846, -0.0485017002, -0.0529828258, 0.0742093772, 0.00731966225, -0.122205131, 0.0529247411, - 0.147448078, 0.0797393546, -0.0860648155, -0.11042574, -0.0785905942, -0.121876672, -0.0942381248}, - {-0.0527796447, 0.00648998842, -0.0355587192, 0.114049271, -0.0959301591, -0.0671327561, 0.132262588, -0.15846093, - -0.0457400717, -0.0681544244, -0.0370102078, 0.0019788174, 0.0212311707, 0.014974772, 0.0379352309, 0.14555496, - 0.0550216585, 0.14012073, -0.0892664418, -0.0451825857, -0.075443998, 0.0741268918, 0.0732855797, -0.0296938308, - 0.00675041648, 0.116876431, 0.0201408975, -0.158639297, -0.0391630009, 0.133559987, 0.0959538668, 0.119371764, - 0.151193321, 0.0595139712, 0.104144454, 0.132892936, 0.160114557, -0.146663278, 0.120496474}, - {0.0703699961, 0.159987211, 0.0631977394, -0.124109901, -0.0944583938, 0.131980598, -0.0682721436, 0.0559668019, - -0.0391267911, -0.0357652791, -0.151306376, 0.0337817259, -0.0224425253, -0.0896386355, -0.148383513, 0.0641178191, - -0.152178064, 0.154784471, -0.116843842, 0.0242486838, 0.104319096, -0.035479404, 0.0915909931, 0.11926651, - 0.00725445524, 0.100697003, 0.077542983, 0.0510057658, -0.0917049125, 0.152768135, 0.141186461, 0.14879939, - -0.0462863371, -0.0660784021, -0.00638771057, 0.135011762, -0.136495173, -0.136348113, 0.0477688648}, - {0.053429503, -0.106138729, 0.0272624362, 0.0275067724, -0.0490070395, -0.0698115006, -0.0236082952, -0.0126310149, - -0.0584793799, -0.123657331, -0.113173492, -0.0405742154, -0.138263494, -0.129029304, -0.0453586206, 0.123852149, - 0.123835333, -0.0313220061, 0.114261344, -0.0148670347, -0.112193018, -0.047807578, 0.0621467121, -0.0639947355, - 0.0912046209, 0.0445803925, -0.0789205804, -0.0298509505, 0.115075596, 0.0537110046, -0.147444278, -0.12499249, - -0.0973721221, 0.0442970023, 0.0344421007, 0.0308895502, -0.0142861633, 0.0246657357, -0.134087816}, - {0.123326905, 0.13744168, 0.126239643, -0.159075558, -0.0618761666, 0.049006179, -0.120241582, -0.0783981383, - 0.101512834, 0.0884451121, -0.0489125662, -0.142992646, 0.0885478482, -0.0297874231, -0.119863763, 0.00794804562, - -0.00335276942, -0.0187417474, -0.0171451829, 0.0590591431, -0.0341166407, 0.0155688329, -0.061427217, -0.113787942, - -0.0447442681, -0.0700059757, -0.0398613065, -0.0515906438, -0.128607899, -0.0621919334, -0.0713751167, 0.0230841935, - -0.0647920519, 0.018136844, 0.0510784946, 0.00129148841, -0.0577827357, -0.157081142, -0.00504328916}, - {-0.0583814345, 0.120087214, -0.10824915, 0.11609906, 0.127872363, -0.139609113, 0.0682630911, 0.0958273634, - 0.0328623354, -0.0478304625, -0.0954759941, -0.0141915027, 0.113085419, 0.054017093, -0.0764210969, -0.113123484, - -0.0304318201, -0.00393572124, -0.045907177, -0.132319063, 0.0447084382, 0.0530905053, 0.0953790247, -0.0982745811, - -0.104757354, 0.0891002715, -0.029784482, -0.107757747, 0.130143195, 0.044267796, 0.0258688051, -0.129454255, - 0.0125964647, 0.0514495596, 0.110222317, 0.0897155628, 0.0732337907, 0.0326809175, -0.0694177523}, - {0.0240647066, -0.0112813441, -0.046625182, -0.130389035, 0.134980127, -0.150486082, 0.0777696967, -0.134057596, - 0.113264337, -0.048125919, 0.0467041321, 0.121052325, -0.146202132, -0.103716232, -0.0780645832, -0.0860331506, - -0.0305587221, 0.141220033, 0.0933937728, 0.125993431, -0.126113161, -0.136907101, -0.022629384, 0.096488215, - -0.021081496, -0.0838287026, -0.00051539659, 0.0105423415, 0.0491101742, 0.067456387, -0.0401428863, 0.00525565166, - -0.0261782147, 0.0414991044, 0.117399134, 0.0796328411, -0.106574737, -0.143081009, 0.0175865721}, - {-0.072219409, -0.134234712, 0.115521714, -0.150310278, -0.0979422852, 0.1554638, -0.0265772659, -0.118267804, - -0.0944011435, 0.0506925397, 0.0359416008, 0.0353389494, 0.0549614355, 0.0112364097, -0.128119066, -0.0835956633, - 0.11887002, -0.0207790527, -0.0759026483, -0.00246252678, 0.0894852728, 0.0137205822, 0.0251560304, -0.14493303, - -0.118128762, 0.0863376334, 0.0446020588, 0.0204058494, 0.0212632213, 0.00191067054, -0.037657585, -0.1222426, - 0.145917684, 0.108349442, -0.154652223, -0.0570449159, 0.0725915134, -0.112194434, 0.0574003495}, - {0.140248865, 0.13888894, -0.137066036, 0.113718383, 0.0645344108, 0.0273436978, 0.0500276573, 0.109785661, - 0.0110132424, -0.0219518282, -0.0919945464, -0.154464275, -0.0414574146, -0.126906887, -0.0701522157, 0.103996478, - 0.0771457031, 0.155940548, -0.149420783, 0.00623635622, -0.135555729, 0.0368992835, -0.159812361, 0.0870888308, - 0.113482289, -0.149329811, -0.0833114311, -0.0244721379, 0.0270808842, -0.138184682, -0.0332157835, 0.145613179, - -0.0994047299, 0.0760200396, -0.0670893043, -0.0228498597, -0.139963135, -0.0879534408, 0.112181716}, - {0.131298602, 0.0309461672, 0.0789499208, -0.135864705, -0.134313956, -0.088938117, -0.0994451195, 0.00862477999, - -0.0604936071, -0.0604707748, 0.00321868993, -0.00727625471, -0.157756001, 0.151689276, -0.148217633, -0.0985553935, - -0.0505282208, 0.0820728242, -0.0390767977, 0.0566593222, 0.0822531506, 0.114947394, 0.0544019416, -0.00532624219, - 0.0507424176, 0.0498395748, 0.0142305577, -0.0559950322, 0.0954572707, 0.0467774533, -0.0416267291, 0.130554497, - -0.0786506832, 0.0809224397, 0.147390351, -0.0233504809, -0.114875101, 0.0548527986, -0.067406565}, - {0.0865421519, 0.0269196033, -0.0468342416, -0.111433722, 0.106872484, -0.149985909, 0.140618578, -0.0336444005, - 0.0138111971, -0.0719263777, 0.153680682, -0.132958964, 0.0191276651, -0.114101186, -0.0229877178, -0.0876695886, - -0.0368377231, 0.130996466, -0.00588663062, -0.0210809615, 0.128125593, -0.149226606, -0.159513697, 0.135717586, - 0.0851459056, -0.109249912, -0.00638009422, 0.144485772, 0.0967227221, -0.15101926, 0.0195341408, 0.0124143576, - -0.0929475725, -0.155912817, 0.109607443, 0.0473677702, 0.158728525, -0.116760351, -0.108016856}, - {-0.00517110759, 0.0607900359, -0.00885016099, 0.000687138177, 0.138185054, 0.0911336839, 0.0318346545, 0.0697369203, - -0.0666795671, -0.138167456, -0.0584312193, -0.0015712342, -0.063814804, -0.032207381, -0.0722483695, 0.138519183, - 0.032056924, -0.0982425883, -0.157630533, 0.00482901791, 0.0526425131, -0.0324147046, 0.000445321755, -0.0164297558, - -0.0195691697, -0.109061792, -0.0311735142, -0.100015149, -0.0348813534, 0.015831437, -0.0675290525, 0.0122821676, - -0.0188400745, -0.0456030928, 0.140895411, -0.124181718, -0.114892609, -0.0411693454, 0.124735042}, - {0.0958035439, -0.130936652, 0.0244326051, 0.052109018, -0.0386694632, -0.127200305, 0.118730977, -0.1442094, - -0.086243771, -0.0461907573, 0.0272799991, -0.0503089316, -0.00721625844, -0.130526751, 0.0260130204, 0.120258249, - -0.151281267, 0.0655669942, -0.0782718882, 0.0822672993, -0.119812563, -0.14523755, -0.0417704321, -0.0935360789, - 0.0208304971, -0.15949972, -0.0152375475, -0.0718022659, 0.116851538, -0.0557902493, -0.0761295184, -0.0614844859, - -0.0252460726, -0.121119633, 0.0271485336, -0.0414168313, 0.098560892, -0.133097664, 0.144050747}, - {-0.0196632966, 0.00584345218, 0.0353918076, 0.0333389826, 0.154786333, -0.0865547284, -0.105787285, -0.0477316417, - 0.0160061568, 0.105426833, 0.0252377111, -0.0761258304, -0.0905868262, 0.0674140677, -0.148253232, 0.0941456035, - -0.0911621675, 0.153581962, 0.0853659734, 0.0138783893, 0.00365305459, -0.121299602, -0.0570472069, -0.100143351, - 0.0314520784, -0.0436465144, 0.119275771, -0.0375414677, 0.0826248676, -0.0722180009, 0.0600088835, 0.0231514052, - -0.11752934, -0.105500557, -0.15452911, 0.104733229, -0.116481096, 0.159584761, 0.075550288}, - {0.0367535241, 0.0257054623, 0.0208994653, -0.0831006393, -0.0919770449, -0.138469696, -0.0775554255, 0.0558321886, - 0.0510588326, 0.123714693, -0.0384763218, 0.0346024483, 0.135389581, 0.0492637046, -0.0516408496, -0.0498436019, - -0.0404971354, -0.063532941, 0.0725634322, 0.0998432934, 0.0688143, -0.0308295731, 0.0218779165, 0.128970206, - -0.0664815381, -0.0228101928, 0.153792426, -0.0332464762, -0.0308457408, 0.128340617, 0.0817957073, -0.0138598736, - 0.141729936, -0.00696653919, -0.112140566, 0.150803879, 0.130852968, -0.0618984066, 0.0263254847}, - {-0.044713039, 0.114585124, 0.0807259157, 0.117588744, 0.0184157118, -0.0867422, 0.0355176777, 0.0166774131, - -0.086305432, -0.00928124227, -0.0886212438, 0.0732235983, -0.0445092283, 0.0321064219, 0.145371869, -0.0868204609, - 0.022688387, 0.00190971617, 0.0781174749, -0.12914525, 0.124460429, 0.0981210098, 0.014635507, 0.123716138, - -0.0699735805, 0.118692987, -0.108618878, 0.118670449, 0.099654831, 0.00232008635, 0.142826989, 0.126973525, - -0.0683627799, 0.025770288, 0.112599783, -0.0207583234, -0.135948747, 0.101644814, -0.0142410183}, - {-0.0177808963, 0.0689923242, -0.154154524, 0.120499209, 0.0436221734, 0.0872521549, -0.159272566, -0.12766473, - 0.0541796722, 0.0391868614, -0.0166257583, -0.0375310667, 0.147344396, -0.0943372399, 0.0632264093, 0.0898067653, - 0.0570167787, -0.117170736, 0.116889067, 0.0809641108, 0.0200283695, 0.00816197321, -0.056620229, -0.0542775393, - 0.0537301898, -0.0735042021, -0.15051502, -0.0861371085, 0.0627825186, 0.131233051, -0.137868837, 0.00940936618, - 0.157844782, -0.0419834033, 0.124431357, 0.121208586, 0.120109968, 0.0394434929, 0.0682575181}, - {0.0697128326, 0.0246844422, -0.0890695602, -0.110172495, -0.0135539183, -0.0974184498, -0.0271810051, -0.0470966734, - -0.13898249, 0.00577538135, 0.139658764, 0.00356419641, -0.114558361, 0.155411765, -0.130553603, -0.0729248747, - -0.0230880678, -0.127035215, 0.0773263425, -0.0853866711, 0.0982360989, -0.0728335157, -0.080861561, -0.116359524, - -0.0405911468, 0.119176544, 0.102637716, -0.0921949595, 0.0878237858, -0.0824311525, 0.034250509, -0.0598196201, - 0.112347558, 0.0643319339, 0.0213099122, -0.143483803, -0.053344503, -0.126612708, -0.104358703}, - {0.0775787532, 0.00409545563, -0.00205397001, -0.0327896066, 0.069652468, -0.0776266083, -0.143947035, -0.0694899485, - 0.067157127, 0.0785414353, -0.0397653282, -0.00486038066, -0.0293421764, -0.0558637604, -0.119117029, 0.127460957, - -0.0365896262, 0.0525164306, 0.133117497, -0.149907425, 0.016108701, 0.0654333755, 0.156136364, -0.00106984877, - 0.0984908938, 0.130341828, -0.0524930842, 0.0162676908, 0.141878411, 0.0572110824, 0.0402491316, -0.113442972, - 0.0697343424, -0.0409216508, -0.113025516, 0.0563906096, -0.0382295437, -0.0112676006, -0.0700219721}, - {-0.0665083602, -0.0733961388, -0.159810573, -0.00481008179, -0.137323275, 0.137926593, -0.140937909, 0.101715863, - 0.092325069, -0.02889424, -0.134072348, 0.0916955471, -0.150101826, -0.0410030074, 0.0204478819, -0.0676795691, - 0.111317381, -0.0716019496, -0.127016574, -0.152310878, -0.105228461, -0.0583668686, -0.0156852361, -0.0399905369, - 0.0313888341, 0.0650816113, -0.114706874, -0.0446863547, -0.157811671, -0.00118949718, -0.0644660518, 0.140826166, - -0.00746693229, 0.0747331381, -0.0409461781, -0.0938129276, 0.141774356, -0.000487164303, 0.120836757}, - {-0.10559123, 0.139235094, 0.0652362481, 0.121637888, -0.086268343, 0.14170903, -0.132305682, 0.0591010787, - -0.104287729, -0.0831991136, 0.102559432, -0.0998227745, 0.139877468, -0.0851509199, 0.0561623648, -0.121988095, - 0.0393951982, 0.0188960619, -0.0931730717, 0.0918561369, 0.0607347526, 0.140978277, -0.0378379747, -0.121191405, - -0.104092203, -0.0514265783, 0.110334247, -0.128934264, 0.0580388866, -0.145407975, -0.152084664, 0.137473315, - -0.0547786392, -0.040652249, 0.0199463442, 0.128169805, -0.0582309589, -0.0933132619, -0.0890814885}, - {0.155949935, -0.0145105897, 0.0767697543, -0.0736777335, -0.0508489907, 0.047244899, -0.158603296, -0.145529196, - 0.115991436, -0.0592503361, -0.151724383, -0.101571456, -0.151892513, -0.0761191323, 0.0211785231, 0.0390771963, - 0.0343535878, 0.079780817, -0.0877778605, 0.0272075944, -0.0757257491, -0.156895295, -0.10469944, 0.00432704063, - -0.0463580526, 0.0329479873, 0.150125742, 0.016698163, 0.138537541, -0.0452093109, 0.0142391482, -0.0303994846, - -0.0384094529, -0.0341982245, -0.14867571, -0.119342029, -0.0492161736, 0.159149885, -0.150064468}, - {-0.0716821626, -0.140553415, -0.0776115507, 0.0201236606, 0.130988896, -0.0315624103, 0.124680318, -0.111440919, - -0.0705786794, -0.12160036, 0.123668611, -0.105706409, 0.112165891, 0.13390319, -0.160071433, -0.0402594022, - -0.102682136, -0.13862589, -0.0329928473, -0.109241918, -0.0820019618, 0.0299827382, 0.102012925, 0.0136117768, - 0.00268340274, -0.0840161145, -0.0451973975, -0.0672649443, -0.0514372662, 0.0184525345, -0.106650561, 0.0105573265, - -0.130497858, 0.115283012, 0.0752222687, -0.109715201, -0.058659099, -0.10426145, 0.118080527}, - {-0.126417309, -0.0153902005, 0.15301396, -0.030366499, 0.0947245657, 0.137490496, 0.00172988093, 0.115366809, - -0.131110266, 0.0515160449, 0.0233153589, -0.112320185, -0.137276381, -0.0623179562, -0.0384411998, 0.0245225318, - 0.0507537946, 0.118932843, -0.147198424, -0.00998578966, 0.0890832245, -0.110097222, -0.0680875331, 0.11397583, - 0.000251589896, 0.00558500923, -0.0815155804, -0.0576123297, -0.136845946, 0.019373605, 0.126342028, 0.0292948931, - 0.158888638, 0.12092647, -0.046014417, 0.0996500775, 0.0689606741, 0.0479243994, 0.0702013299}, - {0.112908065, 0.14351508, -0.0743136629, 0.106024295, 0.107417449, -0.0624105185, 0.0208035056, -0.0978892371, - -0.134663835, -0.063803196, 0.0223776791, 0.0679410473, 0.100790977, 0.128934801, -0.102132939, -0.0627371445, - -0.0730021074, 0.0400428399, 0.114274457, -0.0995174348, -0.094780609, -0.154585987, 0.0999695137, -0.0147638218, - -0.0889723599, 0.0981012583, -0.0572005287, -0.0803901479, 0.00253544585, 0.0651584566, -0.0760441497, -0.0456601083, - -0.125089437, 0.130464196, -0.014163537, -0.0273322444, -0.0459496863, 0.0718412995, -0.0755520239}, - {-0.0418175608, -0.0335841775, -0.0486129299, -0.121587954, 0.0537443347, 0.0236709435, -0.119852521, 0.0731066614, - -0.0735133439, -0.105469115, -0.0828514323, 0.0724856257, 0.0880934373, -0.104022667, 0.0633763522, 0.0249589961, - -0.0812268108, 0.103855871, -0.00646240497, 0.0225208066, 0.0481884927, 0.139660165, 0.158730507, -0.135022819, - -0.00114677649, -0.153464124, -0.13534081, 0.0912234038, -0.147941664, 0.125885442, -0.149579182, -0.139625415, - -0.115968794, 0.148885146, -0.150153682, 0.156008005, 0.0580583364, -0.0438445024, -0.152393132}, - {-0.016789902, -0.0874078423, -0.02441491, 0.0631579012, -0.0669527873, -0.0611300617, 0.0479953513, 0.0629815608, - -0.087249577, 0.0973441973, -0.129677281, 0.131319553, -0.153193727, 0.0273478217, 0.146984845, 0.13275969, - -0.00383981923, 0.0347971357, -0.0258791894, 0.0930513069, 0.133233219, 0.0184774064, 0.0401158184, 0.0957292244, - -0.0637905598, -0.0367962606, -0.15395461, 0.120178096, -0.110208549, -0.0503730699, -0.136504143, 0.139025673, - 0.15711537, -0.092101045, 0.133052662, 0.032815624, -0.138278157, 0.0632831976, -0.113778152}, - {0.0201854315, 0.0248999353, 0.0594310872, -0.0539992638, 0.0846187472, 0.0596814938, -0.140735298, 0.0940341428, - 0.0991497263, -0.157746524, 0.0846076012, -0.0274372902, 0.0670328215, -0.0451572947, -0.0466198176, -0.135705933, - -0.155096889, -0.102244146, -0.00308398041, -0.0823937207, -0.12995261, 0.0556907766, 0.157323703, 0.0269429479, - 0.0536769703, -0.137455285, -0.137057468, -0.124605983, 0.14745082, -0.0360464379, -0.034646295, -0.108051084, - 0.0914900899, -0.12886633, 0.0607017875, 0.14536877, -0.118281528, -0.00148665195, -0.0162434299}, - {-0.0550378449, 0.130923778, 0.0830431059, -0.0414940827, 0.0255563222, -0.0210875086, 0.054693792, -0.0559153184, - 0.02971958, -0.0605289377, -0.0722915903, 0.123071417, 0.0160048008, -0.0295894723, -0.151174843, 0.154010564, - -0.0378083885, 0.147745118, 0.106625415, 0.0391720496, -0.051623974, 0.125934869, 0.0177393015, -0.00886142347, - 0.00509024737, 0.0665114895, 0.0141628124, -0.0273017604, -0.090426296, 0.0027499462, 0.0359637253, -0.0588276908, - -0.0689337179, 0.114809364, -0.0436053947, 0.0653580874, 0.0728206113, -0.145185977, 0.0811531842}, - {-0.104867265, -0.14450793, -0.159647495, -0.0412309431, 0.0442711338, 0.0752263293, 0.0905347392, -0.0156441182, - 0.0018121344, 0.126848966, -0.0767096654, -0.0112375161, -0.000385020336, -0.125034779, -0.0084355725, -0.159916371, - -0.116257474, -0.0958575979, -0.119323418, -0.00417024549, 0.0242020879, -0.12504676, 0.0650173724, 0.0312657878, - -0.0692009851, 0.0996695459, -0.0721073225, 0.075257659, 0.0698385313, 0.0198956262, 0.101688758, -0.124332324, - 0.131463587, 0.115280814, 0.144630998, -0.160125107, -0.114957854, -0.000886997557, 0.0713727847}, - {-0.0549703687, -0.0433620512, -0.0877646878, -0.119162977, 0.112524837, 0.139126703, -0.0341377519, -0.0449487306, - 0.130686015, 0.00345115294, -0.131488353, -0.0792525709, 0.00782312825, -0.0400498472, -0.131493807, 0.141692102, - 0.152393356, 0.00107015425, -0.0898117274, -0.0946044996, 0.0594668984, 0.0579793118, -0.104150601, -0.0151418559, - 0.148081571, 0.0513356961, -0.141101196, -0.053766612, -0.156557009, 0.0823729336, 0.0188856963, -0.150155678, - -0.110151075, 0.0617338419, 0.0797846168, -0.0548617542, 0.0675237328, 0.159863576, -0.00650237687}, - {-0.128873587, -0.0933671072, 0.154030934, 0.0755939633, -0.143089637, 0.0267121848, 0.0357495695, 0.0248231031, - -0.0516575314, -0.0348784924, -0.00861384254, 0.0863924772, 0.160069719, 0.108299315, 0.0888917074, 0.0249136034, - 0.099904567, -0.00174032245, -0.03794365, -0.0371070653, 0.010128173, -0.0942519456, -0.0355476104, 0.12743704, - -0.0635977611, 0.0870915055, 0.0336484313, 0.122676261, -0.0634583756, -0.145944953, 0.0907539725, -0.126188725, - -0.11494787, -0.0277100112, 0.0579763129, 0.0813958794, -0.047633104, 0.0260170475, -0.0550397933}, - {-0.0915976018, 0.13003993, -0.0838397369, 0.11951831, 0.0194157343, -0.123238638, -0.0247885343, -0.119810581, - -0.0695614144, -0.04229182, -0.00646712026, -0.0980333015, 0.0265171919, -0.118918329, -0.052301053, 0.0193821564, - -0.0900358707, 0.0932942629, -0.0502896868, 0.0138303237, 0.00222758227, 0.00599726941, 0.0613628328, 0.109779738, - 0.0380681865, -0.0473496951, -0.0299199931, -0.0255137533, 0.00397951063, 0.115538992, 0.0350842848, 0.0831481144, - 0.0261586104, 0.00893550739, -0.159215644, -0.0429788828, -0.03181215, 0.126899838, -0.136866063}, - {-0.133876532, 0.14184092, -0.0219634548, 0.157925233, 0.0774208158, -0.0360120386, 0.119860075, -0.105293386, - -0.100400917, 0.108133584, 0.0906630531, -0.0224026293, 0.0301082656, -0.11204388, -0.0823697671, -0.151968345, - 0.0647877753, -0.0367129967, -0.100568786, 0.157459989, 0.12105681, 0.103139371, 0.126091033, -0.067621462, - 0.129008725, 0.153700948, -0.15702723, 7.54197026e-05, 0.0334858112, 0.0343314074, 0.0417566672, -0.112968154, - 0.131384522, 0.143023625, -0.148550883, 0.0462077856, 0.0849757642, 0.0364897177, -0.079915598}, - {-0.0827135146, -0.14391619, -0.0164256133, -0.108707756, -0.101542957, 0.1003258, 0.00531956088, -0.110374779, - -0.151255041, 0.130988881, -0.0955013633, -0.136518702, -0.0623609647, 0.0192074366, 0.0708061382, 0.0290712696, - -0.0951986164, 0.0752324611, 0.0699329004, -0.112330705, -0.0960590988, 0.148548335, 0.0457706153, 0.142993227, - 0.107931145, -0.0769833177, 0.0972733349, -0.0638932958, -0.159782812, -0.0759236813, -0.0911080316, 0.11277324, - 0.0844429806, 0.109982252, -0.0494783595, -0.149861366, -0.067463316, -0.109967329, -0.0922606289}, - {0.0903617889, -0.117960401, -0.0793403611, 0.0361569226, -0.132560268, 0.0643765852, 0.121897727, 0.0148753189, - -0.094579801, -0.123791978, -0.129966274, -0.102571502, 0.113401033, 0.150691405, -0.0593341179, -0.00452753017, - 0.0296386443, 0.150840878, 0.00880585611, -0.0939081982, 0.014405678, -0.0951303765, 0.0882003903, 0.00161494745, - 0.0918676853, -0.032511998, -0.0651376173, -0.0115957931, -0.110192209, -0.0856438875, -0.0233577732, 0.0477317572, - 0.0959454849, -0.00823315512, -0.0863729119, -0.102114305, 0.139617518, -0.136686638, 0.0232809987}, - {0.0515834093, 0.0067583574, -0.0222151205, -0.0895339102, 0.0763585046, -0.00735381199, -0.106396161, 0.0296850298, - -0.134560212, 0.0139236301, 0.0781865418, 0.102652721, -0.00223393878, 0.0202996768, -0.013427685, 0.145846009, - -0.0328468159, -0.0257565435, 0.0543970354, 0.0435122438, 0.153779268, -0.0857072249, -0.0999265611, -0.0810974985, - -0.149193168, -0.0552409701, -0.0507812798, -0.0218712166, 0.106643669, -0.105555318, -0.02635324, 0.154921398, - 0.143554866, -0.0304100402, 0.142191589, 0.0198115967, -0.121456929, 0.0412659161, 0.0737678185}, - {0.0754892975, 0.137719885, 0.113413155, 0.0410682335, 0.152943254, 0.0311809201, -0.121315427, -0.0378877781, - -0.025406342, -0.0848549902, 0.0327905826, -0.114954606, 0.0140589122, -0.0771826431, 0.10226766, 0.117255814, - -0.0513133816, 0.0861474723, 0.0347502716, 0.0956842005, -0.0802905634, -0.0724775121, 0.108584173, 0.0386736803, - -0.144252256, 0.135425031, 0.12554045, -0.131078511, 0.145036325, 0.142823547, -0.00596964778, 0.0732668862, - -0.0744379833, 0.0422417149, 0.0488103852, 0.0208154358, -0.125972494, -0.0499065965, 0.0151216593}, - {0.0678752512, 0.141479909, -0.0579361878, -0.10212034, -0.146536276, -0.00384688191, -0.0647281781, 0.0734420493, - 0.109909736, 0.116302431, 0.0850667953, 0.12005461, -0.12765038, 0.0826389939, -0.0631282553, 0.0458230712, - -0.0923582092, -0.108656518, 0.0245845132, 0.0573111288, 0.00713555142, 0.0701984689, 0.0452481359, 0.0295052528, - -0.155328035, -0.117457815, -0.0978364944, 0.0149758402, -0.104488008, 0.140530676, 0.124306902, 0.028429715, - 0.0454303585, 0.0874194503, 0.136134163, -0.14067778, -0.0525717698, -0.101382881, 0.074112542}, - {-0.157280296, 0.124309897, 0.0148374466, -0.00693191215, 0.107233264, 0.0571080595, 0.150594458, 0.150929227, - 0.142951444, -0.142405644, 0.138320133, -0.115849219, 0.0955718383, 0.0476052351, 0.101476625, -0.0881222412, - 0.112478189, 0.147543103, 0.0593991503, -0.0159316342, -0.0348451994, -0.0293387026, -0.0574080981, 0.125476748, - 0.101387084, 0.0443435945, 0.0881850794, -0.124311559, 0.0886368528, -0.124436647, 0.00974313356, 0.0638830066, - 0.123684973, 0.0578040369, -0.0538033769, 0.119889624, 0.0825477913, -0.158593297, 0.0773752853}, - {0.0340256616, 0.115323059, -0.00619861763, -0.0115783848, -0.0833316892, 0.11521899, 0.0220446568, 0.158191502, - 0.111394577, -0.0670775101, -0.0302642789, 0.081452474, 0.0618066266, -0.0850684568, 0.0860743821, 0.107404031, - 0.143676728, -0.103181064, -0.00943402946, 0.00770462537, -0.0582186244, -0.0160429589, -0.115015365, 0.0600330718, - -0.139785513, -0.0110464189, -0.00731863175, -0.148870051, 0.0372841135, 0.0491300263, -0.146719262, 0.0570872724, - 0.0559942685, 0.0762820914, 0.148259863, 0.155335262, -0.0630727485, 0.0147177791, 0.124616943}, - {0.117235161, -0.130238339, 0.00227429252, -0.141247049, 0.0465945229, 0.144285262, 0.00209529721, -0.0165882483, - 0.101704262, 0.0249015391, -0.045640219, 0.124497734, 0.0927760974, -0.0886490569, 0.0686340109, -0.084755078, - -0.0126271211, 0.150040656, 0.159568831, -0.0562661886, -0.149355993, -0.0190586969, 0.0195181444, 0.0291265883, - -0.040851593, 0.0177249461, -0.0968457684, -0.082255289, -0.0367871374, -0.0673075691, -0.0975337252, 0.00672808243, - 0.0360103399, -0.0260913987, 0.0370827653, -0.132725313, 0.0987735242, 0.114781991, -0.0128890574}, - {-0.0973276645, -0.0739934444, 0.053933695, -0.113706112, -0.0913961157, 0.00288793887, -0.00853576884, 0.115016207, - 0.0451276675, 0.0362566225, -0.0488199666, -0.108090103, 0.0763517842, 0.0432774127, -0.126216918, -0.0323137827, - 0.0725389048, -0.112815328, 0.130934075, 0.144305229, 0.133580983, -0.155202955, -0.104472205, 0.134186804, - 0.118462458, -0.0230473336, -0.0411200561, 0.0320737399, 0.153461888, 0.136641204, -0.103034154, 0.131208822, - -0.0811961517, 0.141016573, 0.0441101603, -0.157163605, -0.00134302804, -0.000277416984, 0.00519697275}, - {-0.157234773, 0.0216934998, 0.0229968429, -0.0456779599, 0.0617230572, -0.159433469, 0.115041979, -0.0409196652, - -0.12699388, -0.103104919, -0.0608809553, -0.138878256, 0.0337750278, -0.0957158431, -0.141873315, 0.108097315, - 0.107926987, 0.0990178958, 0.0116720526, -0.158665687, -0.129165709, -0.0232352037, -0.114883408, -0.134382501, - 0.0158243161, -0.0731174052, -0.135450542, 0.0167346224, -0.121782698, -0.0701439083, -0.0866819546, -0.120067455, - 0.092619285, -0.0461705066, 0.0892303661, 0.0779077485, 0.0149603784, -0.146992788, -0.00272293552}, - {-0.0361600332, -0.0228186883, 0.00934007391, -0.0170567073, 0.0384269021, 0.142638072, -0.0744384602, -0.0217330139, - -0.0218091402, 0.0360304601, 0.0797148421, -0.0997342616, -0.0314630903, -0.0379285328, 0.139887363, 0.123339653, - -0.0287113115, 0.115470789, 0.0371872373, -0.0412517339, -0.135022566, 0.103279389, 0.105988599, -0.0172151439, - 0.0150876818, 0.0274245963, -0.0132739441, -0.036677435, 0.112553529, -0.155846283, -0.0206262488, 0.13022539, - 0.0678242669, 0.126872942, -0.0510943756, 0.0201200712, 0.043223124, 0.0387389623, 0.158661246}, - {-0.0076213032, -0.0165892038, -0.0685659796, 0.0714797452, -0.016281493, -0.0765684247, 0.137657881, -0.154361069, - -0.0206807088, -0.0900971815, 0.019978432, 0.0333570577, 0.141404584, 0.0914899185, 0.0473329164, -0.131317779, - -0.0968455225, 0.0220416989, -0.1212359, 0.105686575, -0.142264634, -0.0132441651, -0.131832302, 0.024911236, - -0.140045494, 0.0894184634, -0.0229819156, 0.00864381157, -0.0193220656, -0.109721102, 0.0386561938, -0.0338467434, - -0.0236302074, 0.0742785186, -0.104582898, 0.121219292, 0.111321308, -0.120511308, -0.105403334}, - {-0.0385326706, -0.149855226, 0.0867880508, 0.0908868834, 0.121826887, -0.0176020525, 0.00701380335, 0.157649904, - 0.129334271, -0.022528844, -0.122996956, 0.0200926214, -0.151215792, 0.025034111, -0.0635366961, -0.0559968092, - -0.126804113, -0.145577371, -0.0725016594, -0.111986093, -0.12005423, -0.129444838, 0.0989802182, -0.145718962, - 0.158439308, -0.136623144, 0.0214766711, 0.140014693, -0.078493163, -0.1480892, 0.0923972055, -0.0590759218, - -0.113076009, 0.0365628451, -0.000295245904, 0.0462453514, 0.0592812598, -0.0913652703, 0.0834260806}, - {0.143805295, 0.0155787403, 0.0261022598, -0.0257711839, -0.0182284322, 0.0275831092, -0.0485377423, 0.0492555723, - 0.15253517, 0.0234382525, -0.0826058388, 0.0789847374, 0.146116897, 0.090543896, -0.145559639, -0.0838401392, - 0.020527197, 0.134442538, -0.060153272, -0.0281252302, 0.0846550316, -0.0223555565, 0.079243198, -0.106259376, - -0.0495959446, -0.0445554443, 0.111729063, 0.133360282, 0.0883187056, 0.0215883795, 0.106322229, 0.121772349, - 0.119024768, 0.123255357, -0.0772241428, -0.010108321, -0.144010186, -0.0626373142, 0.00331682526}, - {0.00821007695, -0.0551363453, -0.0676344633, -0.0111245876, 0.1491611, -0.1228237, -0.0549128726, -0.0588845573, - -0.0994822159, 0.159540027, -0.147012025, 0.0386894271, -0.00295335613, 0.15084444, 0.0976848304, -0.00153089967, - -0.0128493337, -0.142887488, -0.111583702, 0.0320946053, -0.122405484, -0.0896965712, 0.11114724, -0.0944887251, - 0.149016038, -0.090780735, -0.0281430203, 0.0362697542, 0.123263702, 0.00452216621, -0.0758949369, -0.0870857015, - 0.0268697999, 0.129318699, 0.149626926, 0.0784597546, 0.00966807641, 0.15372999, 0.0346111134}, - {0.135335431, -0.0524530187, 0.0564956926, 0.134169638, 0.0994171202, -0.0721554831, 0.150539726, 0.103655607, - 0.0302717239, 0.00642100163, -0.133985415, -0.126268983, -0.0759931058, -0.042624902, 0.0353744552, -0.146013692, - -0.0397743396, -0.0821449757, -0.0522839502, 0.134827748, 0.0357014835, -0.125457406, 0.00284048426, 0.0960820243, - -0.0400908887, -0.0969539434, 0.117565207, 0.128489807, -0.0317166485, 0.109517328, 0.0833919123, -0.0554327182, - -0.138008565, -0.11444059, 0.149088979, 0.0512602963, -0.0856498107, -0.111970522, -0.12587148}, - {0.0224373136, 0.0382923447, -0.0747886077, -0.0121580716, -0.0767029598, 0.141055718, -0.123395182, 0.0675715879, - 0.0379213355, -0.0472308286, -0.0575145371, -0.106351458, -0.0309086386, 0.135627106, -0.147148684, 0.090754509, - 0.0279704574, 0.147471264, -0.145420462, 0.0589833222, -0.0136448387, -0.039699167, 0.120141715, -0.143935755, - -0.115310997, 0.115785278, 0.000652988383, -0.133672759, -0.00613919413, -0.0626730248, -0.0189093091, -0.147770464, - 0.147255659, -0.102808639, -0.0871997178, 0.0724047273, 0.1256354, -0.0224007387, 0.142272457}, - {0.137836054, -0.0632258207, -0.0164566897, -0.0403495207, 0.0517789163, 0.00608601281, -0.149766177, 0.142742306, - -0.0314270705, 0.103650607, -0.126158774, 0.111624077, 0.055120863, 0.0388984494, -0.134918407, -0.152487814, - 0.0295004807, -0.113996848, -0.111506641, -0.0440089144, -0.086366035, -0.0807152689, 0.00865797512, -0.0573150218, - 0.0741267204, 0.154979885, 0.0202493407, -0.0254147016, -0.0147838835, -0.107501328, -0.0772380009, -0.105413929, - -0.0683901906, 0.131929144, 0.154526249, 0.11189802, -0.130999997, -0.0124845281, 0.0581236407}, - {0.0459919125, -0.0860065967, 0.0110306898, -0.118987873, -0.0659963042, 0.0930785611, 0.085940741, -0.12604323, - -0.107581571, 0.121533573, -0.0391657315, 0.107208066, 0.137636319, -0.0569114834, -0.0467083305, -0.120382749, - -0.047168009, 0.0838120356, 0.113633588, 0.114312351, 0.0656505898, -0.102815628, -0.0920698196, -0.148176312, - 0.0844320953, 0.0736770704, -0.0619042069, -0.151609793, 0.0634551719, 0.111207634, 0.137860373, 0.0858280212, - -0.0832563415, 0.155327365, -0.00127360225, 0.0822034255, -0.0723850429, 0.131452531, 0.0642569587}, - {0.128805608, 0.0990629867, -0.119305432, -0.0292620808, -0.0708809495, 0.0392772667, 0.015687393, -0.0852657035, - 0.0104729729, 0.122274593, -0.098343797, -0.136710733, -0.0628816858, -0.105143823, 0.0515109301, 0.137111172, - -0.130796328, -0.0743087158, -0.0400102176, -0.00140646007, -0.0264896676, -0.0728007406, 0.0188319609, -0.108995229, - 0.0468106084, 0.0621610284, 0.0719994307, -0.0657696649, -0.0772869289, 0.119326912, 0.159178615, -0.152700007, - -0.11091581, -0.0193140283, 0.123198986, 0.147255823, -0.0607609637, 0.0305595621, 0.0803839639}, - {0.144919828, -0.0497360565, 0.153210148, -0.113501117, -0.117309205, 0.0958018601, 0.127570242, 0.0632243678, - 0.0918181688, -0.141088709, 0.146485403, -0.0462406576, 0.159514248, 0.0430768281, 0.0786268264, -0.00808254443, - -0.0773618519, 0.0306342579, -0.12890771, 0.0187857281, 0.0366844386, -0.0248747766, -0.122418679, 0.0175913069, - 0.0797886029, -0.0122940792, 0.0957477242, -0.0396141075, -0.129192919, 0.0185948983, 0.107355565, 0.142729267, - 0.0553980879, -0.141973346, 0.022911841, -0.116240792, 0.0882501006, -0.131930307, -0.0928079635}, - {0.106438749, 0.101826347, -0.11401926, 0.150217101, 0.098923333, -0.0181241892, 0.0712259561, 0.0242997278, - 0.0275936276, -0.131927788, -0.0849952176, 0.017318815, 0.0068610739, 0.115758359, -0.0853685364, 0.00950135477, - -0.133058578, 0.0410957597, 0.0209150035, -0.124753959, -0.0244098306, 0.00401516864, -0.0374188237, -0.10042619, - -0.101509094, -0.111051895, 0.0484750532, 0.0317879803, -0.0559743047, -0.0285410788, -0.0229661483, -0.0721477345, - -0.00402316684, 0.117756531, -0.0819754303, 0.089403078, 0.0334226303, 0.0275267027, 0.027861882}, - {0.108989581, 0.0460046604, -0.0563987233, 0.0293907002, 0.104052693, -0.0383384638, -0.030068161, 0.150279298, - 0.0409633964, -0.00166833878, -0.0346902199, 0.0669264048, -0.0511397123, 0.0199506395, 0.149070546, -0.0374698266, - 0.00843488518, -0.0328176878, -0.145957738, 0.152954951, -0.144924343, 0.14804782, 0.0786780939, 0.0285716206, - 0.0510875434, 0.0378996506, -0.0798344165, 0.0156888627, -0.11134693, 0.0566322543, 0.0671340302, 0.0756672993, - -0.131263569, 0.121300727, 0.128415108, -0.0732385069, -0.0441863798, 0.145850092, -0.140892282}, - {-0.0433208197, 0.0865452439, 0.0491333306, -0.0707463101, 0.0425013006, -0.152840808, -0.0107151717, -0.0138318893, - -0.0186936446, 0.12703611, 0.0707801804, -0.0564198159, -0.105342612, -0.0870764479, -0.0342938006, -0.0887430236, - -0.0956649557, 0.112175398, 0.0909370333, 0.0317445174, 0.0798360035, -0.0917860791, -0.0962542295, -0.056887053, - 0.148518249, -0.072213918, 0.0639881641, 0.0572802611, -0.132279277, 0.0703128278, -0.0325882584, 0.0573971979, - 0.0131939426, 0.0694291666, 0.014503222, -0.155698791, 0.0548479706, -0.131516039, 0.0377209596}, - {0.0347373113, -0.1174886, -0.00463837851, 0.0322827622, 0.116443321, -0.0683661774, -0.00230853772, 0.0666368082, - 0.153403535, -0.132826671, -0.13612321, -0.0795206949, -0.0288710464, -0.109852068, -0.00206555682, 0.0141264861, - -0.138332427, 0.0350137167, 0.0766007006, 0.0733971521, 0.120388016, -0.122281618, -0.155271351, -0.103171304, - -0.0537912734, 0.0376074575, 0.0374378748, -0.0292252395, 0.121223301, 0.107397161, -0.031116344, 0.0732557401, - 0.0359054469, 0.0417368747, 0.133481681, 0.120928459, 0.0945898965, -0.0629648343, 0.11936377}, - {-0.138524175, 0.153413162, 0.00945223961, 0.135453954, -0.133650959, -0.0830611214, 0.148169518, 0.0940570533, - -0.00380408484, -0.086952731, -0.0809288099, -0.156174347, 0.131625593, 0.0475885347, 0.00847210828, -0.136250719, - 0.106322765, 0.150923416, 0.150585994, -0.064253293, -0.096121788, 0.0809252262, -0.0415405631, -0.136549413, - -0.0137932152, -0.0286584944, 0.0176992528, 0.0582241043, 0.0482284836, -0.0121927755, 0.0387834013, -0.063821733, - 0.0187701322, 0.056976445, 0.118335001, -0.00805816799, 0.144364879, 0.136538237, 0.0551046953}, - {-0.0352555513, -0.146217152, -0.14467366, -0.0438222997, 0.125421345, -0.0440197177, 0.120475978, 0.125130519, - 0.0638999417, 0.104002431, 0.0400096662, -0.0938901231, -0.148611918, 0.0584221296, 0.152547419, -0.0257979091, - 0.113014638, 0.1321401, 0.021303039, -0.133068457, 0.0705090389, 0.152023375, -0.143248737, 0.148735747, - 0.0126785459, 0.0664216429, 0.0673842281, 0.0494141243, 0.0561462939, -0.153661698, 0.0493393354, -0.100295395, - -0.088040024, 0.0135752028, -0.1531367, -0.0556834675, -0.0371512547, 0.0104368571, -0.0160086378}, + {-0.282762736, -0.0563275144, 0.730590343, 0.0789912865, -0.204339027, 0.0396980755, 0.248766661, -0.314963728, + -0.0167422313, 0.213028535, 0.304261833, 0.174660057, 0.0295855738, 0.199028805, -0.0455312952, 0.0800643563, + -0.185925096, 0.0437664576, -0.326360196, 0.312411815, -0.150759593, 0.149624705, -0.0376731977, -0.0203849562, + -0.0958549976, -0.0905557871, 0.255156666, 0.0673121661, 0.02243682, 0.177837253, 0.143540755, 0.0758885369, + -0.089895539, 0.0751883686, -0.0300261341, -0.0979525074, -0.147087187, -0.0700252503, -0.212184563}, + {0.146949902, 0.327808619, -0.686812699, 0.00392748509, -0.148308665, 0.0934642255, 0.0951193348, 0.0334287398, + 0.140522987, -0.0673815832, -0.0970075652, 0.159615487, 0.0586074777, 0.0556014366, -0.0439041592, -0.0225810297, + -0.135422096, 0.104349554, -0.0230375919, 0.0159511641, -0.00493444549, -0.221501619, -0.0998100042, -0.0179851484, + 0.0634097531, 0.209679693, -0.0694529787, -0.0374620892, 0.125516385, 0.0156742875, 0.181466237, -0.133448049, + 0.152771533, 0.0174281131, 0.155447036, 0.124258474, 0.221732691, 0.0947066694, -0.0252091959}, + {0.160156772, -1.52072203, -0.284173459, 0.114289828, 0.153297722, 0.0741123706, -0.106174372, 0.0314644314, + 0.0474751256, 0.0309511777, 0.063651219, 0.0851621851, 0.0305719338, -0.0333008952, -0.0167611074, 0.0564312078, + 0.0226126797, 0.11055322, 0.115543567, 0.108756684, 0.0357308351, 0.123114444, 0.176002428, 0.114915229, + 0.148942143, -0.0625898167, 0.0959035978, 0.0410965942, 0.107714675, 0.133954048, 0.166690871, 0.111254558, + 0.109636866, 0.0770944208, 0.142240435, 0.148641139, 0.010087789, -0.163533822, 0.234832183}, + {-0.0458820201, 0.400703847, -0.704590678, -0.0333656184, 0.0174748078, 0.0390049927, -0.0849423483, 0.0676333159, + -0.14397499, -0.00252764369, -0.154970095, -0.124375932, -0.0140130054, -0.127016455, 0.0390064716, -0.0637766644, + -0.0054131127, -0.0788694769, 0.175252542, -0.136596054, -0.113811642, -0.0195430499, -0.091031082, 0.0931695327, + -0.0331401043, -0.0109625803, 0.10683044, -0.132312804, -0.0338141955, 0.101019196, 0.0801355615, -0.103233024, + 0.0249951538, 0.180828199, -0.127832189, 0.133617416, 0.0346138366, -0.0421042517, 0.0420933515}, + {0.115016676, 0.196765959, -0.548836112, -0.345303953, 0.330692023, -0.23311086, -0.0311110504, 0.180270106, + -0.430506408, -0.280931622, -0.00129361171, -0.352870494, 0.0452543013, -0.389674455, -0.248559058, -0.186098203, + -0.298372537, 0.26643151, 0.18067801, -0.0667777583, 0.0327139124, 0.32352069, 0.101149708, -0.0274008922, + -0.172038749, 0.111406803, -0.278581142, 0.00354246702, -0.0480959006, 0.172040194, -0.0484443121, 0.231135815, + -0.0182251502, -0.00514097093, -0.204974413, 0.20433718, -0.309048712, 0.179382354, -0.0110426862}, + {-0.0371507294, 0.211275414, 0.936891198, -0.101958327, 0.0520465448, 0.0555242151, 0.137456983, 0.0443586744, + 0.0735168755, 0.0433312207, 0.104532577, -0.0697492585, 0.0227281116, 0.0303425528, 0.171300337, 0.00801817235, + 0.25168997, -0.0833262801, -0.0431719907, 0.115270659, 0.214539915, 0.0840846971, 0.158829451, 0.193312049, + 0.0763021559, -0.0139020486, 0.0457286686, 0.137087569, -0.164960429, 0.150889337, 0.233479351, 0.321477473, + -0.200686336, 0.0584372245, -0.148339212, -0.158747911, -0.255335629, -0.176004797, 0.0891200975}, + {-0.0979641154, -0.307282448, 0.707775354, -0.125841483, 0.0953899324, 0.0491354913, 0.123622358, 0.0514821596, + -0.0965669081, 0.198713005, 0.0560167655, -0.0166125335, 0.00335819623, -0.154990688, 0.230104402, -0.221451774, + 0.13053824, -0.0962358266, 0.190315127, 0.0404143855, 0.184649706, 0.289241344, 0.200344756, -0.113058217, + -0.0893387422, 0.30364421, -0.120819233, 0.106566519, -0.0837414265, 0.110699654, 0.000404892286, 0.164168924, + 0.0303014051, -0.118732259, 0.0925685316, 0.354016364, -0.128824607, -0.162554324, 0.0139187388}, + {-0.0303925518, -0.0552541465, -0.737573206, -0.0922581702, -0.193467945, -0.15425168, 0.0805479437, 0.234098002, + -0.0569174923, -0.163258582, -0.185168028, -0.265544713, 0.0328750722, -0.042033162, -0.304853052, -0.188584626, + 0.0739987269, 0.182701021, -0.0187060237, 0.120208979, -0.00517415395, 0.171296567, -0.280372679, 0.0437119268, + -0.274580777, 0.0110638086, -0.120666035, -0.232929245, 0.0151670855, -0.159876525, 0.200507268, 0.116282642, + -0.0537130944, -0.248556495, -0.173139513, 0.105073616, 0.131360143, -0.0365000442, -0.0591957495}, + {-0.0236740112, -0.0839193836, 0.752823055, 0.00624437863, 0.131357536, -0.141286999, -0.0635036975, -0.0262890272, + 0.104967013, 0.0812194124, 0.0384624191, 0.0741042569, -0.186851859, 0.11452008, 0.0308767091, -0.0549096912, + 0.108119145, -0.10244035, 0.201173127, 0.0284086764, -0.163147211, 0.290089607, 0.132981092, -0.143376678, + -0.130450338, -0.162072629, -0.19035922, 0.171957195, 0.0154484706, -0.0115961824, -0.0325915925, 0.149289325, + -0.0611155666, 0.0233119018, 0.00803279411, 0.149692819, -0.171058416, -0.07994809, 0.136210546}, + {0.011481666, -0.591486096, 0.788739443, 0.0580150075, -0.0581582859, -0.0699527711, 0.147268951, 0.133274317, + -0.00336254528, 0.211932883, 0.0974171907, 0.0837606415, -0.107871726, -0.332916588, 0.251717567, 0.0485465564, + -0.289719194, 0.16074729, 0.0981427506, 0.195161104, -0.0477866568, 0.240369797, 0.00142805546, -0.107460454, + 0.144852966, 0.0331885554, 0.0289027728, 0.217022583, 0.189481989, 0.210117131, -0.14386192, 0.257314444, + -0.231293365, -0.0821456164, -0.148711234, -0.281892806, 0.0893862098, -0.0612130687, -0.218651205}, + {0.0344110243, 0.0613648072, -0.663142502, 0.012655111, 0.0786295831, -0.299120605, -0.0893806666, -0.0929536, + 0.142574042, 0.11067266, -0.0954290703, 0.0235238429, 0.0697887838, 0.136721954, -0.0746648237, 0.237816334, + -0.0826871321, 0.0818047523, -0.0957256332, -0.156082168, 0.0961245224, -0.143830895, 0.0368054919, -0.0337967686, + -0.113377571, 0.215221107, -0.0321270004, 0.0626650974, 0.140905693, 0.108913004, -0.0300663132, 0.0329823755, + 0.277467608, 0.196472928, 0.0464956053, -0.263099641, 0.223040819, 0.21136485, 0.0677242205}, + {-0.0187031198, 0.0602727458, 0.54279995, -0.113571294, 0.45412454, -0.0418791883, 0.103712782, -0.206617385, + 0.101731785, -0.00846095197, 0.133265957, -0.178702116, -0.0120510357, 0.126713514, 0.0796562359, 0.0948571637, + 0.259251863, 0.132012546, 0.318895102, 0.126535192, -0.0700928941, -0.121011332, -0.0376667529, 0.301382601, + 0.118638463, -0.0354453102, -0.143568411, -0.286102831, -0.0933998525, 0.0334935039, 0.0664797053, -0.185921609, + 0.148486778, 0.0514167584, -0.142128006, 0.222249284, -0.14645046, 0.104180224, -0.26407963}, + {-0.10360004, -0.425364524, 0.696820438, -0.274310589, 0.150060833, 0.236604154, 0.0198318716, 0.122819766, + 0.142224312, -0.035691753, 0.0669889599, -0.0655179396, -0.0376028381, 0.254243881, -0.0825403109, 0.0458673239, + 0.201879457, -0.0265229829, 0.181569949, 0.189394221, -0.0791682824, 0.156540424, 0.0824942663, -0.056294594, + 0.0160713419, -0.323709697, 0.200327188, -0.037541654, 0.0210741051, 0.189588085, -0.0388948023, -0.232569084, + 0.211987317, -0.168857828, 0.0205459278, 0.0274787135, 0.0358891264, -0.194867864, -0.104155317}, + {0.114551082, -0.481927246, -0.897679567, 0.214685336, 0.16273196, 0.191777065, 0.104237027, -0.0970954001, + 0.0759302452, -0.0822182149, 0.191352963, 0.230475605, -0.004907127, 0.124285072, -0.0938522816, 0.137145326, + -0.00644512149, -0.283143342, -0.124725789, -0.0384006761, 0.311640382, -0.0014223922, -0.0285270903, -0.128429726, + -0.00184295245, 0.147062898, -0.0315981209, -0.128478721, 0.297009617, 0.0816734359, 0.0364777781, 0.0882342681, + 0.0252061654, 0.0568528138, 0.270593673, -0.116349436, -0.0631481856, 0.365322053, 0.233131886}, + {-0.120379701, -0.452914655, 0.69471395, 0.0752304271, 0.103867307, 0.220009118, 0.224773645, 0.0503174551, + 0.040729057, 0.039190758, 0.288746029, 0.0419843756, -0.230729803, 0.136699721, 0.0433468111, -0.0255120527, + 0.226623625, 0.262356937, 0.173353091, 0.0855579823, -0.0572973676, 0.0466848761, 0.195328116, 0.0807970986, + -0.00918623433, -0.0871357769, 0.136771291, -0.0360433161, -0.0148335593, 0.187921673, 0.260697037, -0.0756186694, + -0.070964694, -0.0339851566, 0.0333974697, 0.167534724, 0.0547196642, 0.0168158542, 0.274299502}, + {-0.0968320817, -0.141119346, 0.655391693, -0.0448081978, 0.223973885, -0.125584424, 0.055755388, 0.00407028571, + -0.0581914298, 0.163703486, -0.00779761653, -0.035665147, 0.0180214886, 0.0735300332, -0.0157239195, -0.0393613689, + 0.0463709906, -0.024085423, -0.0093949493, 0.026393339, -0.0963632539, 0.248643115, 0.0398947857, -0.00201059435, + 0.00302046258, -0.214977533, 0.212505713, -0.0443717316, -0.0465886779, -0.112749815, 0.0921108052, -0.115716733, + -0.0816225708, 0.139711544, 0.0410667695, 0.111394785, 0.010201606, -0.155280486, 0.064333342}, + {-0.183065996, -0.289024234, 0.812718332, -0.0278695952, 0.015744146, -0.0264776424, 0.136563137, 0.113182947, + -0.168809697, -0.0394463055, 0.0727432594, -0.0355447121, -0.193742141, -0.0675567165, 0.0481650159, 0.11402031, + -0.0070441477, -0.0201255642, 0.0720044598, 0.0585997142, -0.108411685, 0.169874415, 0.0433898531, 0.131262153, + 0.0393158607, 0.105964288, -0.124830276, 0.042306494, 0.133830532, -0.0541704334, 0.10933052, 0.263894379, + -0.147685423, -0.0113780247, 0.0344123095, -0.0834650397, 0.0047910274, -0.0783810541, -0.0464604013}, + {0.219149083, 0.064866595, 0.0316145159, -0.489191204, -0.233643517, -0.719799638, 0.134775296, 0.0189584307, + 0.035125576, -0.112267718, 0.0723865032, -0.306088179, -0.210345849, -0.00747956103, -0.247774392, 0.0990739614, + -0.200649485, -0.390255332, -0.227142364, 0.0272737816, 0.403140664, 0.0508859903, -0.390879244, 0.243047148, + -0.328482777, 0.152220726, -0.375209123, -0.334010184, 0.49402675, -0.0771550536, -0.344686031, 0.383161992, + -0.17255339, 0.0597194508, 0.142317593, 0.164361387, -0.0286849178, 0.128655389, 0.196754411}, + {-0.0410293899, 0.338615686, -0.409754127, -0.293272555, -0.155978873, -0.0975263864, -0.0089201564, -0.0555540957, + -0.178584918, -0.157408923, 0.204459161, 0.0368474387, 0.0472006723, -0.170741305, -0.0557030365, -0.206178799, + 0.0252101533, -0.247200996, -0.226606339, -0.234228089, -0.0608233511, -0.0991780832, 0.116313636, -0.122075625, + -0.158770829, -0.121133275, 0.208478391, 0.134024605, -0.0704239234, -0.0468835644, 0.402148962, 0.000805645832, + -0.0813769028, 0.0470139347, -0.27857399, 0.118220322, 0.0319808349, -0.250343382, 0.089221172}, + {-0.0190368183, -0.412190378, 0.61768043, -0.0082726609, 0.224451929, -0.015774833, 0.0590072908, 0.172722191, + 0.104496226, 0.21707879, 0.253936976, -0.148807898, 0.0470075831, 0.125255823, -0.0034176351, 0.0478289127, + 0.120968468, -0.0612144135, -0.0384195782, 0.0206164829, 0.0331755131, 0.110551879, 0.0948009938, -0.117754698, + 0.0542902201, -0.0775596574, -0.105057672, 0.179738179, -0.176439241, 0.179091081, -0.159725279, 0.169083863, + 0.0630803481, -0.17488265, 0.204559565, -0.0447657593, 0.0222060662, 0.066461727, 0.122096717}, + {0.110641345, 0.348080218, -0.498669386, -0.0536600724, -0.0103229238, 0.169303417, -0.164146036, -0.222952724, + 0.0707893521, -0.076030843, -0.666038632, -0.0390581638, -0.15762955, -0.181184962, -0.128391668, -0.312163651, + -0.079955861, 0.294274092, 0.0781494156, -0.272982597, 0.0375174023, -0.39822492, 0.528131306, -0.403849959, + -0.11215736, -0.108671583, 0.0411977358, 0.111514509, -0.0854244903, 0.103082761, -0.0495410524, -0.136168674, + -0.0266983379, -0.133975267, -0.154707789, -0.269968748, 0.0078736078, 0.198415637, 0.132146537}, + {0.00630642753, -0.0425905213, -0.976697266, 0.0802949518, -0.0373759009, -0.0717672706, -0.0564704016, 0.126173154, + 0.129176781, 0.228048593, -0.0809217021, -0.136310533, 0.0532604419, -0.0899301842, -0.0565456264, -0.168571025, + -0.228170604, 0.00744312909, -0.0903381109, 0.187564135, 0.296350658, -0.0427739061, -0.238423809, 0.00933343451, + 0.323177516, 0.150757939, -0.0851115212, -0.229631871, 0.167228982, 0.0204633679, -0.196963266, 0.049432639, + 0.139343977, -0.00221942645, -0.0564469695, -0.0565519929, -0.0338747688, 0.217861623, -0.0411081947}, + {0.0818683207, 0.189130619, -0.63857621, 0.0950989798, 0.129748613, -0.217639044, -0.00310036005, -0.0821470991, + 0.0855663344, 0.17278412, -0.145308942, 0.018358713, 0.0422431305, -0.0641563237, -0.0953660086, 0.121081367, + -0.0580013618, -0.264920264, -0.361876458, -0.0272926651, 0.180031329, -0.012022757, -0.0304664895, -0.0854124203, + 0.0202063546, 0.100550748, 0.116194256, -0.0689740926, 0.069390215, -0.118840814, 0.210623041, 0.173766866, + 0.0340186544, -0.0285004694, -0.0622767657, -0.278734744, 0.0249768775, 0.304717511, 0.143741205}, + {-0.209072486, -0.167887136, 0.844739616, 0.145964667, 0.0615237728, 0.10212139, 0.0936139673, 0.11189843, + 0.401274532, 0.0131698465, 0.0470178016, 0.171614781, -0.0858264565, -0.0535048656, 0.264678717, 0.26957202, + -0.0421461314, 0.192509115, 0.199243248, 0.0512528047, -0.073932752, 0.0473555923, -0.0403746292, 0.058922708, + 0.0185133535, -0.10587015, 0.164380312, 0.262878597, -0.0841443986, 0.0268444307, -0.0583029352, 0.0714559481, + -0.0149930399, 0.0424940251, -0.0869167075, 0.0848793313, 0.208484784, 0.135465875, 0.113037877}, + {-0.167437911, -0.449168861, 0.626928627, -0.054026179, -0.053709656, -0.0612324737, -0.0533738993, -0.0371355265, + -0.0669392645, 0.0385244153, 0.0153366327, -0.0856137797, 0.0560351126, 0.193200365, -0.00926990341, -0.127741203, + -0.0292537957, 0.0220830142, 0.278140455, 0.103414632, -0.0759675577, 0.276600808, 0.195803478, 0.15782474, + -0.0873748437, 0.0391741581, 0.0707361251, 0.011684278, -0.173374668, 0.165234312, 0.117244273, 0.117439158, + -0.0776897743, 0.0587770641, 0.0896521658, 0.0743770152, 0.00299247727, -0.148207247, 0.216806695}, + {0.247945741, 0.373665065, -0.784210563, 0.0810172036, -0.254469395, 0.123803861, 0.0185929611, -0.161129281, + 0.133866206, -0.0122072827, 0.0435744189, 0.159817547, -0.119420849, 0.156391621, -0.120359056, -0.0172648709, + 0.12132702, -0.139718816, -0.25699982, -0.0181998741, 0.187360913, -0.114331208, -0.0965898857, -0.247373328, + 0.0674213991, -0.112847745, 0.00243260246, -0.125651479, 0.213533133, -0.148476318, 0.0971871316, -0.0593989678, + -0.124491386, 0.0962298959, 0.0730938986, -0.0696421713, 0.0306892823, 0.114902817, 0.158341929}, + {-0.130461201, -0.341370583, 0.745835483, 0.065755859, 0.0842281431, 0.0771425739, 0.0493860058, 0.134699181, + 0.00582875917, -0.0532861762, 0.152803019, -0.0354437567, 0.175058797, 0.158144817, 0.405953377, 0.0637339652, + 0.179610297, -0.0726688728, -0.0250953715, -0.0062681525, -0.0863090977, 0.0256290268, 0.271087855, 0.173018828, + 0.0440122932, -0.182761341, 0.00611204002, 0.170174256, -0.00752268359, 0.313930094, 0.135707662, 0.251813382, + -0.166863292, 0.0761356056, -0.0727235302, -0.432026505, 0.0397393703, 0.167176783, -0.0823570192}, + {0.0108405417, 0.329619586, -0.444701076, -0.0478907414, -0.0614593662, 0.0435050838, -0.0521009751, 0.0885258391, + 0.0179478861, -0.0881690532, 0.160766065, 0.10792616, -0.228383169, 0.175166219, 0.145234391, 0.0750966445, + -0.1066048, -0.056228783, -0.209721774, -0.0794245824, -0.0347438417, -0.0491339825, -0.0734279603, -0.143552557, + 0.134705752, -0.190350011, 0.14871417, -0.0288430229, 0.00432106759, -0.045178432, -0.0245399568, -0.256775826, + -0.164180204, -0.0401285291, -0.0610012747, -0.11673931, 0.028937079, -0.223496318, -0.10253869}, + {-0.00532094715, 0.414942384, -0.43767339, -0.0267242752, 0.0665540174, 0.0474961139, -0.0640570447, -0.302960247, + -0.0706632435, -0.0838026926, 0.0321815312, -0.0419509523, 0.186175212, 0.141904354, -0.206237495, -0.0672782362, + -0.292603523, -0.170199886, 0.0125456685, -0.284919709, 0.00962671358, -0.0894899666, 0.232623041, 0.042644728, + 0.0726713166, -0.0333710648, -0.0177215803, 0.391929924, 0.0380904414, 0.313689917, 0.0520455018, 0.0112551143, + 0.0219149571, -0.132060036, 0.0332516953, -0.142744556, -0.0138720619, -0.145460993, -0.183476716}, + {-0.193555906, -0.0467746705, 0.803341031, -0.104172468, 0.242219612, 0.17386061, -0.0379906818, 0.100478172, + 0.113529988, 0.0894582793, -0.0374606326, -0.139370829, -0.112638742, 0.0381268226, -0.0315437578, 0.104297206, + 0.227493808, -0.0201654173, 0.216230184, 0.0183001012, -0.0474208333, 0.053701859, -0.0322367102, -0.12053629, + 0.0467930324, 0.0924857631, -0.0245457049, -0.0631018803, -0.142730415, 0.167687416, 0.101428375, 0.046973478, + -0.0245281793, -0.00355248782, 0.0429402143, 0.0982223749, 0.0635970086, 0.0332510583, -0.0584590584}, + {-0.260056585, -0.25032261, 0.79693532, -0.0215409845, 0.153850213, 0.0145822885, 0.2005371, 0.107128233, + 0.0453472957, 0.0613995455, 0.0320030488, -0.133719012, 0.0337307379, -0.105219826, -0.00296660815, -0.0234197248, + 0.111989632, 0.128623813, 0.196543694, 0.194187075, 0.0623491406, 0.151907101, 0.02351542, -0.0161357429, + -0.00796873122, 0.0537771247, -0.17130053, 0.0717502832, 0.0140497452, 0.064686805, -0.0277781002, 0.148276493, + 0.0417260379, 0.0658941418, 0.0553245284, -0.0137356883, 0.0203089174, -0.15243578, 0.119086578}, + {0.0190943331, 0.260754734, -0.832034528, 0.173146978, -0.0786512718, -0.128384277, -0.0275706649, 0.21833159, + 0.0927760527, 0.0785156041, -0.105088301, -0.0521118343, 0.172578648, -0.12481986, -0.226779148, 0.1964854, + 0.121612214, -0.141516119, -0.0514119714, 0.147980899, -0.124127038, -0.115604773, -0.148749739, -0.0942790732, + -0.00738707744, 0.0645625442, 0.0464992523, 0.0932923257, 0.022279406, 0.132157266, 0.104242869, -0.216193408, + 0.212050915, 0.14149709, 0.0725842565, -0.0147363953, 0.121583998, 0.00442878623, 0.0457842052}, + {0.23848787, 0.128318608, -0.0320354328, -0.553411961, -0.249291837, -0.181355283, -0.0949874148, 0.0483659171, + -0.251930743, -0.349954516, -0.177128568, -0.0122124627, 0.369008869, 0.0962708071, -0.0157705769, 0.0879146531, + -0.280469924, -0.436639786, -0.149096102, 0.0479401723, 0.00738456938, -0.15594539, -0.587058723, -0.278792471, + -0.0630885065, 0.014328992, -0.0404720269, -0.0203435682, 0.0441317558, -0.470407903, 0.134132683, 0.0591885038, + 0.0331271105, -0.128428847, 0.0497677289, -0.411763608, -0.110440314, 0.144934818, 0.118522406}, + {-0.107184567, 0.137971461, -0.552492738, -0.393089861, -0.0692710355, -0.140699163, -0.166987583, 0.066882588, + -0.0298946444, -0.136368275, 0.183906093, -0.160736591, -0.0571746901, 0.0595548078, -0.201114237, 0.0869465768, + -0.245469585, 0.0870876983, 0.0900784284, 0.129198015, -0.112433426, 0.137195826, -0.00724515319, -0.233147532, + 0.0217625014, -0.0705954358, -0.132288501, -0.138916746, -0.286449522, 0.0171295702, -0.0935383365, -0.415635675, + 0.150903568, 0.110844441, 0.24903731, -0.111095503, -0.302143037, 0.212805167, -0.105084702}, + {-0.05033971, -0.870794713, 0.684354782, -0.0638439879, -0.13829115, 0.202119902, -0.0102287112, 0.0522965342, + 0.0851309001, 0.166831464, 0.145465985, -0.0324880332, 0.0647958964, 0.0916113332, 0.366854578, 0.00453874003, + 0.102219582, 0.11529924, 0.268190265, 0.273680955, -0.0294867996, 0.0461280569, 0.0347741544, 0.222198293, + 0.0767173469, 0.0884369612, -0.0707502067, 0.00749963149, 0.046364177, 0.0519050099, -0.00420740619, 0.198593989, + 0.0440058857, 0.00494893314, -0.0246491842, -0.0410683118, 0.0765382424, 0.0352954715, 0.0754649788}, + {-0.107376792, 0.245440051, -0.51931113, -0.0277185794, -0.215802744, 0.0993195027, -0.0649938732, -0.206397519, + 0.139884755, 0.0628253445, -0.0290410127, -0.226904541, 0.0201662742, -0.19509995, -0.282410115, 0.0115329186, + 0.139148131, -0.0928259119, -0.173514321, -0.00693756342, 0.0546970554, -0.0463097282, 0.0281404816, -0.00954110548, + 0.202606022, -0.0533665009, -0.1452934, -0.0230736397, -0.0993508846, 0.0338425413, -0.152060911, -0.0437800661, + 0.048617173, 0.0967594758, -0.28926298, 0.0650932714, -0.191411003, 0.0299630035, 0.181884274}, + {-0.0522714332, -0.541984975, 0.417993784, 0.0310709421, 0.253448159, 0.168342412, 0.266234457, 0.241972029, + 0.0422224067, -0.0721908808, 0.131623223, 0.0166996308, -0.0518211089, 0.256014645, 0.197816923, 0.300937951, + 0.030572392, -0.0132445609, 0.0971786603, 0.222085074, -0.0438340493, -0.156478733, 0.177082881, 0.187181115, + 0.0157581791, 0.043070443, 0.175861612, -0.160448015, -0.0251710843, 0.151227951, 0.0329645835, 0.0581324734, + 0.213010997, 0.0573022142, -0.115403593, 0.0668641031, -0.238754466, -0.200613633, -0.00578668807}, + {0.182706043, 0.143427446, -0.765004098, -0.0340749472, -0.19112201, -0.192697212, 0.153809428, 0.136086583, + 0.0750975981, -0.0299037043, 0.036472369, 0.197095618, 0.181681737, -0.10177514, -0.0881030187, -0.0410719253, + -0.0388450585, -0.0787736923, 0.00862494204, -0.208843008, 0.0850218982, 0.110067464, -0.0655542687, -0.105995789, + 0.244761303, -0.0248718858, -0.00512749935, -0.0932898894, 0.113698535, 0.0270682201, -0.098704651, -0.0822669789, + 0.0939181, -0.029729832, 0.216310576, 0.17139028, -0.0201715957, 0.132537037, -0.0084651839}, + {-0.128360808, -0.352734834, 0.88293761, -0.112930961, 0.0667247698, 0.145476907, 0.0909606442, -0.00173785153, + -0.0760768279, 0.0397452936, 0.057000231, 0.0913812742, 0.00447742967, 0.0553501435, 0.137134552, -0.077290006, + 0.0617681816, 0.064985618, 0.122450382, 0.109504871, 0.136662304, 0.17156966, 0.096282877, 0.134258002, + 0.0867081732, 0.254897445, 0.0906943828, -0.0984610468, -0.0330038592, 0.18545334, -0.0980699509, 0.0050691627, + 0.189829797, -0.113470003, 0.0408929884, -0.110245854, -0.0873558447, -0.0139029911, 0.0148753757}, + {0.178910881, 0.482120663, -0.534130871, 0.264997512, -0.121468082, 0.0808797553, -0.263360828, -0.361308336, + 0.0175101329, 0.00866684504, 0.131393597, -0.0409379154, -0.0374576114, 0.241147041, -0.0499686822, -0.0821040943, + 0.134441853, 0.0470172167, 0.0580324382, 0.0497627407, 0.105935283, -0.310817003, 0.0252181478, -0.0945300311, + -0.485286742, -0.139159098, -0.167485103, -0.0263403319, -0.0100384327, -0.133022606, -0.0438377373, 0.243452698, + 0.0868987441, -0.400515348, -0.000186482444, -0.347522676, -0.0893771574, 0.0157621428, -0.622608244}, + {0.142747015, -0.472912014, -0.743358076, -0.0223967265, -0.0210361574, 0.00409339461, 0.0729280114, 0.0714563653, + 0.285424888, -0.297028929, -0.0791186467, 0.140863612, -0.0339579768, 0.113671683, 0.0402099155, -0.0787626281, + 0.00435523642, -0.0173931401, -0.0887548625, -0.000676208292, 0.19189395, 0.0208721124, 0.015914375, 0.0540504903, + 0.323654085, 0.0671219826, -0.0853690431, 0.0137658287, 0.173407242, -0.2807284, -0.0856320038, -0.13311635, + 0.0260826498, 0.0634475499, 0.255391657, 0.0420189798, 0.17504862, -0.173230857, 0.0157751124}, + {-0.03313886, 0.0998393968, 0.524940789, -0.0419604741, 0.0726594701, -0.020122556, 0.403700709, 0.10275811, + -0.0619508252, -0.0590844452, -0.160514742, -0.0717239082, -0.0178255998, -0.0160790011, -0.0654051304, -0.0379301049, + 0.29940936, -0.033161696, 0.270088315, 0.0450663902, 0.0596920438, 0.0756230205, -0.0113936905, -0.186718687, + 0.203255951, -0.112048775, -0.069718644, -0.134339243, 0.228223369, 0.177040875, -0.061372254, -0.0219076108, + -0.412217855, -0.0567054674, -0.168310866, 0.0577280223, -0.0249207392, 0.0586696118, -0.195022315}, + {0.119244799, 0.148358628, -0.645516813, -0.00243832381, -0.0473647453, -0.191837505, -0.0175140295, 0.149058953, + 0.00154689292, -0.114287481, -0.0367974825, -0.0844052881, 0.104061238, 0.0819725767, -0.221388817, 0.119554982, + 0.0660286397, 0.0134530813, -0.082344465, -0.132675797, 0.0333349332, -0.103744842, -0.122655869, 0.0732181966, + -0.106617182, -0.0608400516, -0.0795846879, -0.163159132, 0.228118688, 0.0842776746, 0.101582393, -0.242847189, + 0.210232809, 0.010308085, -0.00813801587, -0.123414055, 0.137146667, 0.177039951, 0.0305287857}, + {0.0413870253, -0.729069769, 0.531264186, 0.146147341, 0.116796665, 0.249779388, -0.0768813565, 0.226039141, + 0.258600861, 0.156947672, 0.158080786, 0.163098082, 0.0453513525, -0.088218838, 0.265675604, 0.118592672, + 0.320947379, 0.131670594, 0.174647927, 0.132898957, -0.17898263, 0.00559512572, 0.00500768842, -0.00429704739, + 0.0945884064, 0.187700346, 0.168263838, 0.150641143, -0.0652876496, 0.17885001, 0.106801204, 0.199558869, + 0.00562841957, 0.00747091649, -0.0597727783, 0.0255931728, 0.0778811499, -0.141193286, -0.122162029}, + {-0.1088567, -0.65803355, 0.5759691, 0.116666496, 0.103644341, 0.235419661, 0.261262804, -0.123253763, + -0.154286876, -0.074984245, -0.0370596573, -0.0602773353, 0.055402033, -0.0197789911, 0.200908169, 0.152206704, + 0.0202643722, 0.127753779, 0.211650237, 0.174159139, 0.21327208, 0.118832551, 0.078022182, 0.0699877888, + 0.178530842, 0.0849295035, -0.0765691027, 0.19159852, 0.0295127053, 0.258718818, 0.0692967027, -0.0410395302, + 0.187678695, -0.06347657, 0.143943265, 0.196454257, -0.0813914239, -0.13299717, -0.141023397}, + {0.162016541, 0.0925507843, -0.898661137, 0.0169786084, 0.111891791, 0.031697493, 0.0294247512, 0.0152893476, + 0.100542068, -0.110991627, -0.0547096655, 0.16978009, -0.208242267, 0.0175220035, -0.129194841, 0.0680126473, + -0.0978340656, -0.00555237383, 0.0238031596, 0.0730953291, 0.0921959877, 0.0165492296, -0.0800394565, -0.0270012785, + 0.177855879, -0.0835512057, -0.0886224583, -0.130613044, -0.140512809, 0.249915838, -0.137912139, -0.110400446, + 0.0309107825, -0.0369470268, -0.0293687489, -0.248170614, -0.0660486445, 0.103796318, 0.0179855581}, + {-0.232596382, 0.502320111, -0.415980816, -0.199266151, 0.326597095, -0.191527784, 0.166239277, 0.119097032, + 0.114210673, 0.103936881, 0.140402362, -0.101625003, 0.164756835, -0.00685595255, 0.125411734, 0.0265929885, + 0.239692807, 0.104033843, -0.119363382, -0.0316394903, 0.0285378862, -0.0727699623, -0.0176791828, -0.189887092, + 0.070288457, -0.16027528, -0.569774866, -0.118840836, -0.102585405, 0.0793700442, 0.106146261, 0.00645793742, + -0.0140585434, 0.111903556, 0.261220425, -0.0973523632, 0.0265318491, -0.00862870831, 0.0501338728}, + {-0.108910911, 0.062820591, -0.535542667, -0.23555094, -0.116679162, -0.0281174518, 0.227678508, -0.0477837659, + 0.0331880003, -0.088188678, -0.176043883, -0.249852985, 0.0806479454, 0.235472545, -0.157474831, 0.00382606639, + -0.146700025, 0.176247716, -0.0163424239, -0.141903669, 0.0898482502, 0.0921318159, -0.0621192046, -0.108997665, + -0.176920593, -0.117981121, 0.0871897414, -0.434226424, -0.0833046883, 0.268362224, -0.237923384, 0.136272967, + -0.103442721, -0.0813897103, -0.0112086842, -0.0882019624, -0.148755714, -0.0613335632, 0.296742648}, + {0.0451140627, -0.0779659078, -0.799054146, -0.057370007, 0.0675848722, -0.082774967, 0.0576372668, -0.0134418076, + -0.153597265, 0.0981145054, 0.104367055, 0.0630268604, -0.134197488, 0.0116075585, 0.0176457316, 0.0745266601, + 0.0912928879, -0.162541702, -0.0848572031, -0.159351319, 0.124793515, 0.224779993, -0.271517187, -0.166514099, + -0.129781827, 0.0215247013, 0.122260116, 0.0696836263, -0.113186635, -0.0262366962, 0.0256366562, 0.0561429597, + 0.0433459021, -0.0825277045, 0.113499574, 0.134015948, 0.0239969213, 0.0674849972, -0.0586059317}, + {0.0520149283, 0.319650501, -0.636340439, -0.241347641, 0.00538081536, -0.167543337, -0.121100433, -0.00732351094, + 0.0119186854, -0.126563624, 0.0778363049, -0.0429749414, -0.143562689, -0.0979017541, -0.107230291, -0.128355011, + 0.0970261842, -0.047295969, 0.146697506, -0.129307479, 0.0518672392, 0.0722521693, 0.141932175, 0.162346795, + -0.0903767273, 0.0875851959, -0.198173657, -0.210410297, 0.11021854, 0.0495040156, -0.0115429685, 0.118883967, + 0.0280674435, -0.0693705603, 0.145272657, 0.0403182767, 0.188722655, 0.154090852, -0.0755847692}, + {-0.2487472, 0.00228096335, -0.960409462, -0.156923458, 0.0463603772, 0.0248868801, 0.000787175493, 0.0550196506, + 0.443627298, 0.0763333887, -0.032459341, -0.117737621, 0.178923011, -0.0377082378, 0.14902091, 0.115580149, + -0.250380993, 0.106101453, 0.0493260026, -0.10024181, -0.118844151, -0.0837713778, -0.0176931061, -0.0386492796, + 0.0362544656, 0.103157662, -0.153193623, 0.00230953819, -0.0056374683, -0.0973639414, -0.0828164145, -0.0360356122, + 0.0208579358, 0.102091983, 0.024079768, 0.0101805553, 0.0270693712, -0.225048125, -0.192850769}, + {-0.03289726, 0.177870214, -0.427677751, 0.108024254, 0.0522361286, -0.204571471, 0.0257105362, -0.117211014, + -0.278591543, 0.00988011528, -0.0408014841, -0.2023191, -0.0124425227, -0.167907625, -0.0429406352, -0.0264416616, + -0.0169176385, 0.147660777, -0.0340998024, -0.256484836, -0.139011711, 0.118554644, -0.1203117, -0.129394874, + -0.0911816657, -0.20112282, -0.254098982, 0.166062847, 0.160309136, 0.128211275, -0.181137174, 0.133415803, + -0.00768132741, 0.331019819, -0.513802588, 0.100675195, 0.0274997205, 0.0318247564, -0.102002211}, + {-0.0624212846, -0.989633977, 0.582228184, 0.0392177738, 0.220540404, 0.220092133, 0.216494828, 0.206345916, + 0.0923131779, 0.024049338, -0.00791351032, -0.0695016161, -0.0775457546, -0.0517051443, 0.042020686, -0.0315407775, + 0.148762271, -0.0212753583, -0.0314742476, 0.307531953, -0.0718781278, 0.0585421883, 0.1436055, -0.0601983033, + 0.13672173, 0.0180950202, 0.14101465, 0.215613797, 0.0272845402, 0.214413926, -0.0208570268, 0.0644971058, + -0.153567508, -0.143465996, 0.0753719136, 0.0966045633, -0.0851323828, -0.0720881447, 0.0400008857}, + {-0.0363125019, 0.145418867, -0.4747051, -0.0952232331, -0.0739930496, 0.0123077184, -0.0163431037, 0.0354281291, + -0.38108772, -0.381356776, -0.0577115342, -0.013802994, -0.0893754438, 0.144158855, -0.0861852393, 0.151126236, + 0.291919738, -0.106129132, 0.266006261, -0.106813483, -0.198061496, 0.410635799, -0.0690176785, -0.0358896479, + 0.201788962, 0.0264057945, -0.00694671459, 0.346231192, 0.00660472549, -0.034632083, 0.00134218822, -0.321757674, + 0.237247795, 0.231073141, -0.471630573, 0.0301942099, 0.0709557757, -0.166421622, -0.00881882384}, + {0.0696669072, -0.719992757, 0.528034091, 0.145231172, 0.268405735, 0.00639493624, 0.0645371154, -0.0086593125, + 0.174200147, -0.221671045, 0.309235305, -0.0128617464, -0.140373856, 0.353904724, 0.231442928, -0.00703292713, + 0.130451486, -0.0714284033, 0.215705469, 0.0537098944, 0.0929901525, 0.00164988986, -0.0585841872, 0.112196051, + 0.0694685951, -0.0192532521, 0.230448529, 0.266123563, -0.0420201495, 0.0242676567, 0.246525571, -0.0548382998, + -0.383607805, 0.024575701, 0.234152272, 0.0461015776, -0.238480404, -0.219269127, 0.0793404505}, + {-0.300114334, -0.100237787, -0.688452661, -0.115204073, 0.0106008118, 0.0129670044, -0.222953305, -0.277550906, + -0.103165731, -0.0344680548, -0.336341351, 0.180666059, 0.0351991691, -0.0478996485, -0.241981253, 0.13093397, + 0.173590019, 0.140087083, -0.260966957, 0.00925489888, 0.286191612, -0.0670887157, -0.0722000599, -0.274044603, + 0.0876877233, -0.172131017, -0.324012339, -0.157435119, 0.248860866, 0.0211637355, -0.198854133, -0.0542903729, + 0.105234995, -0.0327985883, -0.163545638, -0.139644653, 0.0803952292, -0.16866231, 0.184724972}, + {0.0756873637, 0.200195521, -0.519687653, -0.0615778491, 0.0167808123, 0.0518448539, -0.0396123379, -0.191904023, + 0.0296451766, 0.0544404909, -0.00630230317, -0.00909363385, 0.167532533, -0.243618011, -0.105149314, -0.107102737, + 0.278960764, 0.00415468821, -0.0312563516, 0.0589833856, 0.0656392202, 0.0701212883, -0.0489007011, -0.0671977997, + -0.325132549, -0.188493103, -0.254190892, -0.147453234, 0.041183237, -0.0872151256, 0.130776376, 0.0909287035, + -0.15317975, -0.200129867, -0.00445873244, 0.264149666, 0.0917019621, -0.00374048809, -0.205288649}, + {0.193788081, 0.303583026, -0.201680839, -0.483353347, -0.117335364, -0.0705456063, -0.150525495, 0.155855566, + -0.104301251, -0.0899897367, 0.00310595543, 0.102737345, -0.103476346, -0.346430421, -0.240720123, 0.0943622515, + -0.123448357, -0.3539702, -0.250118017, -0.0928550884, -0.102663741, -0.0929587558, 0.0906545222, 0.196432576, + 0.214587584, 0.0833179206, -0.149880037, 0.119759679, 0.0411626808, -0.492740631, -0.105393209, 0.241155654, + -0.0618355013, -0.220170096, 0.206247658, -0.0117166247, -0.432131588, 0.405917466, -0.140086144}, + {0.0584630631, -0.267934769, 0.540570021, -0.032216087, -0.114824928, 0.133836895, 0.265204906, 0.0240877587, + 0.0321829468, 0.259291738, -0.0998718813, -0.265773058, 0.0940765813, 0.0799822882, -0.040411476, -0.000588462688, + 0.0536118634, -0.152716696, 0.248526454, -0.0942738801, -0.0119718723, 0.174689412, 0.037665315, 0.0624456033, + -0.10652525, 0.0484109484, 0.0773220286, 0.0461122654, -0.0714647025, 0.0515299514, -0.156356111, -0.0460160971, + -0.0620007999, -0.0620751828, 0.0203596987, 0.256730735, 0.0132819414, -0.219160318, 0.228445679}, + {0.127357915, 0.192045361, -0.579410315, -0.127873614, -0.191322997, -0.0933184251, -0.174084544, 0.159596816, + 0.0545510761, -0.00952024572, 0.0235787462, 0.105215624, 0.0201963726, 0.286611825, -0.156879604, -0.0435729325, + 0.0587269627, 0.149321064, 0.128488064, 0.201110587, -0.0175572373, -0.0338986441, 0.0437766649, 0.0822651237, + -0.0563717037, 0.0302920118, -0.0321599133, -0.241854101, 0.0823644176, -0.114064656, -0.0913481563, -0.0561605096, + 0.00404791255, -0.106938832, -0.0542913824, -0.269585371, -0.0205787886, -0.436945945, 0.072630465}, + {-0.0248607639, -0.0126015926, 0.685500503, -0.13970457, 0.0755622536, 0.142778993, 0.0540239699, 0.019267492, + -0.0814138055, -0.0187993664, 0.0714498386, -0.154841051, 0.111843787, 0.1565236, -0.0845943466, 0.0763534158, + 0.243300676, -0.0383384451, -0.0508198813, -0.0969228595, -0.0576302931, 0.278416663, -0.066178903, -0.0602819026, + -0.0164174475, -0.13569726, -0.14349021, 0.191934347, -0.126222998, 0.148024723, -0.101755328, 0.271617293, + 0.0205672923, -0.184753031, 0.21793671, 0.173438862, 0.0226502102, -0.0186628159, -0.0375668667}, + {-0.0219210107, -0.128856897, -0.207741931, -0.0860694423, 0.0216722693, -0.293519825, -0.134653702, -0.0803605542, + -0.279992312, -0.117281601, -0.225327328, 0.137726501, -0.0128108887, 0.121971115, 0.0120624145, 0.157565743, + -0.052343078, 0.104054987, -0.222191781, -0.176582545, 0.068053782, -0.243456498, 0.206803069, 0.160156205, + 0.0420886278, -0.176420465, -0.0740244314, -0.0594712086, -0.181899533, -0.110147595, -0.25870347, 0.113253579, + 0.0987374783, -0.424778759, -0.00960531365, -0.117930494, 0.0817373544, -0.072258465, -0.0938088521}, + {-0.0142267291, -0.264209867, 0.805707991, 0.0231617317, 0.160881266, 0.0342829563, 0.0290782917, 0.102651201, + 0.0261039902, 0.0836430416, 0.111244068, -0.0541428849, 0.278689116, 0.0938472301, 0.169007659, 0.0139186196, + 0.162517756, 0.248461038, 0.11955478, 0.0383770093, -0.0445002504, 0.012569828, 0.212754682, 0.23371309, + 0.0112959789, -0.272043765, -0.15336515, 0.0604166947, 0.0928523093, -0.0803618282, 0.0274842009, 0.25391677, + 0.0233797375, -0.0724340305, 0.00707607763, 0.0678603947, 0.12597774, -0.021455396, 0.282708526}, + {0.0530294366, 0.175433755, -0.812801361, 0.0399266891, -0.0937239602, 0.158731684, 0.0739682913, 0.0620659217, + 0.248339817, -0.0376703814, 0.0145291565, -0.0160099361, -0.0126854349, -0.0672243983, -0.221448869, 0.142669588, + 0.134081095, 0.0575765334, -0.0597605295, 0.110128671, -0.210933506, -0.0110336756, -0.0464208499, 0.0818552375, + -0.196937948, 0.0396884084, -0.00343017397, -0.031074049, 0.0641027018, -0.0153171401, 0.0618477352, 0.0331603996, + 0.33835873, 0.00597961759, 0.152293965, -0.0369251817, -0.0372885689, 0.124470301, 0.186949179}, }; const float six_dense_biases[SIX_DENSE_NUM] = { - -0.106425747, 0.142752945, 0.145629004, 0.00546986563, -0.0097992355, 0.0908411667, 0.00711907772, -0.114593297, - -0.092972368, -0.0360035077, -0.00956747867, -0.0729396343, -0.117534339, -0.0428674631, -0.126915231, 0.080137834, - 0.0734208748, -0.133160949, 0.0272146966, 0.0934232846, -0.159518629, -0.101017371, -0.141830996, 0.0214058515, - 0.101856165, -0.0170916207, -0.00711661531, -0.0615158267, -0.0289785173, 0.0253515765, 0.043456465, 0.146055236, - -0.000608377974, 0.146163985, 0.0434216857, 0.074026987, -0.0930295065, -0.0972476453, 0.0507774651, 0.0938288271, - -0.00998653471, -0.0581613779, -0.0754808784, -0.1074294, 0.104443379, 0.0734389573, 0.159931183, 0.0165527258, - -0.0859139413, 0.0425923169, -0.0468143895, 0.096265316, 0.113443732, 0.0967639759, 0.145086646, -0.0425086133, - 0.110646464, -0.0239180867, 0.0744835287, -0.107726648, -0.152292877, 0.105378613, -0.0339635648, -0.126999453 + 0.0518913344, 0.0167221036, -0.0378771275, -0.199898466, -0.0538039804, 0.108015999, -0.119998835, 0.0804165825, + 0.0554692224, -0.0645367131, -0.0237321015, 0.178871185, 0.0172098372, 0.176579624, -0.167090327, -0.00345131545, + 0.109402806, 0.0315130427, -0.0746222436, 0.0546944141, -0.12706992, 0.173666835, 0.116913021, -0.127412245, + -0.0672582611, 0.184880778, 0.0890215933, -0.0441896208, -0.309641331, 0.08389128, 0.131596148, 0.144563377, + 0.196799755, -0.112892613, -0.112884499, -0.0451603755, -0.168520987, 0.175658196, 0.0640755445, 0.140594989, + 0.203608438, 0.0531219617, 0.168874472, -0.124918915, -0.154922098, -0.139817134, 0.0800537914, 0.0399043597, + 0.0573609397, 0.129984304, -0.10384991, -0.169068992, -0.104140788, -0.0470843799, -0.00375794806, -0.167530179, + -0.244247869, -0.0644299388, -0.030715555, -0.249677241, 0.0417533629, -0.275687188, -0.101081789, 0.218871728 }; const float six_logit_weights[SIX_DENSE_NUM] NN_ALIGNED = { - -0.0705124587, 0.0868723392, 0.0520056635, 0.0647664964, -0.0928007513, -0.0886785686, -0.113316193, -0.0289525986, - -0.08650738, 0.0771128982, 0.0233608782, 0.107995376, 0.0838339776, -0.120495304, 0.0639513433, 0.0945038646, - -0.074260354, -0.0589973927, 0.0363359153, 0.10274297, -0.0414749533, -0.0211133063, 0.0633404851, -0.0377910733, - -0.0363686532, 0.0756987631, 0.0449215174, -0.0807459652, 0.105491117, 0.0272067338, -0.0523718894, -0.0948979259, - -0.0711999387, 0.0229022354, 0.0608644933, 0.0173428953, 0.0460195094, -0.100155696, -0.0285425484, 0.0336628258, - -0.0983794481, -0.1200317, 0.0569871217, 0.0507859439, 0.123536095, -0.122615263, -0.0976838917, -0.0485803038, - -0.0482099652, -0.0274398476, 0.0169587582, 0.0929383337, -0.122677058, -0.110818297, 0.0514815152, -0.061397016, - -0.0709132254, 0.11439988, 0.0762117952, -0.096738115, 0.0813071877, 0.108724922, -0.0449660271, 0.0470137894 + -0.548384547, 0.206728697, -1.49714518, 0.226278767, 0.56896174, -0.575925887, -0.430921525, 0.529933453, + -0.0730793551, -0.460997105, 0.363704413, -0.36077413, -0.608377337, 0.415781796, -0.301446617, -0.134732857, + -0.127074242, 0.272080243, 0.176494434, -0.107967772, 0.390860647, 0.523743033, 0.271249533, -0.421942949, + -0.308931798, 0.32740137, -0.445393056, 0.0912020281, 0.374524713, -0.136318102, -0.195394054, 0.17766346, + 0.339828551, 0.261625558, -0.981469214, 0.279721618, -0.450761527, 0.249684572, -0.420574635, 0.414145678, + 0.463071615, -0.114338741, 0.144301102, -0.367231369, -0.302023709, 0.211034298, -0.455296099, 0.505889177, + 0.361589432, 0.323655665, 0.526145756, 0.159891024, -0.705625653, 0.368265748, -0.551005423, 0.494499385, + 0.312590718, 0.389481485, -0.152014822, 0.383812606, -0.131353125, 0.109772533, -0.288320571, 0.225765198 }; -const float six_logit_bias = 0.0557706803; +const float six_logit_bias = 0.107445575; diff --git a/include/weights_6.h b/include/weights_6.h index b572ffa..d1a7c99 100644 --- a/include/weights_6.h +++ b/include/weights_6.h @@ -21,9 +21,9 @@ #define SIX_INP_NUM (3 + 6 * 6) #define SIX_DENSE_NUM 64 -/* See weights_5.h for the alignment rationale. */ #define NN_ALIGNED __attribute__((aligned(16))) +extern const float six_embedding[7]; extern const float six_dense_weights[SIX_DENSE_NUM][SIX_INP_NUM] NN_ALIGNED; extern const float six_dense_biases[SIX_DENSE_NUM]; extern const float six_logit_weights[SIX_DENSE_NUM] NN_ALIGNED; diff --git a/resources/do_buildroot.sh b/resources/do_buildroot.sh index 9933469..83b57d3 100755 --- a/resources/do_buildroot.sh +++ b/resources/do_buildroot.sh @@ -13,7 +13,7 @@ # General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with Takwrap. If not, see <https://www.gnu.org/licenses/>. +# along with ctak. If not, see <https://www.gnu.org/licenses/>. BR="$1" @@ -28,9 +28,9 @@ cp resources/post-build.sh resources/ct1986.sh resources/genimage-raspberrypi0.c # Overlay filesystem dirs="/usr/bin" for dir in $dirs; do - if [ ! -d "$overlay/$dir" ]; then - mkdir -p "$overlay/$dir" - fi + if [ ! -d "$overlay/$dir" ]; then + mkdir -p "$overlay/$dir" + fi done cd "$BR" && make diff --git a/src/match.c b/src/match.c index 1c706cd..49ff9c9 100644 --- a/src/match.c +++ b/src/match.c @@ -14,7 +14,7 @@ General Public License for more details. You should have received a copy of the GNU General Public License - along with ct. If not, see <https://www.gnu.org/licenses/>. + along with ctak. If not, see <https://www.gnu.org/licenses/>. */ #include <stdio.h> #include <stdlib.h> @@ -37,7 +37,7 @@ static inline float five_cand(tak_state_p state) { static float cur_board[FIVE_INP_NUM] NN_ALIGNED; - nn_prepare_input(cur_board, state); + nn_prepare_input(cur_board, state, cand_five_embedding); return eval_net(cur_board, FIVE_INP_NUM, &cand_five_dense_weights[0][0], cand_five_dense_biases, cand_five_logit_weights, cand_five_logit_bias, FIVE_DENSE_NUM); @@ -46,7 +46,7 @@ static inline float five_cand(tak_state_p state) { static inline float six_cand(tak_state_p state) { static float cur_board[SIX_INP_NUM] NN_ALIGNED; - nn_prepare_input(cur_board, state); + nn_prepare_input(cur_board, state, cand_six_embedding); return eval_net(cur_board, SIX_INP_NUM, &cand_six_dense_weights[0][0], cand_six_dense_biases, cand_six_logit_weights, cand_six_logit_bias, SIX_DENSE_NUM); @@ -107,16 +107,16 @@ static int play_game(const nn_function current_fn, const nn_function cand_fn, switch (state->won) { case WIN_DRAW: - return -1; - case WIN_FLAT_BLACK: + return -1; + case WIN_FLAT_BLACK: case WIN_ROAD_BLACK: return C_BLACK; case WIN_FLAT_WHITE: case WIN_ROAD_WHITE: return C_WHITE; default: - fprintf(stderr, "match: game did not end cleanly (won=%d)\n", state->won); - return -2; + // ply cap reached with no winner: a draw + return -1; } } @@ -124,7 +124,7 @@ static int play_game(const nn_function current_fn, const nn_function cand_fn, // Main // =================================================================== -const char *license = +const char *usage = "match, one Tak game of the current weights against the candidate.\n\ \n \ usage: match <size> <eps> <depth>\n\ @@ -137,14 +137,11 @@ nn_train.py runs many of these in parallel to score the candidate against the cu \n\ Copyright (C) 2026, tslil clingman\n\ \n\ -This program is free software: you can redistribute it and/or modify\n\ -it under the terms of the GNU General Public License as published by\n\ -the Free Software Foundation, either version 3 of the License, or\n\ -(at your option) any later version."; +This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version."; int main(int argc, char **argv) { if (argc != 4) { - puts(license); + puts(usage); return EXIT_FAILURE; } @@ -179,9 +176,7 @@ int main(int argc, char **argv) { const int winner = play_game(current_fn, cand_fn, current_fn_colour, eps10000); const char *name; - if (winner == -2) - name = "abort"; - else if (winner == -1) + if (winner == -1) name = "draw"; else if (winner == (int)current_fn_colour) name = "current"; diff --git a/src/nn_train.py b/src/nn_train.py index 8025b68..73a5eaf 100755 --- a/src/nn_train.py +++ b/src/nn_train.py @@ -48,7 +48,7 @@ import pandas as pd import torch from tqdm import tqdm -from torch.nn import MSELoss, Linear, Module +from torch.nn import Embedding, MSELoss, Linear, Module from torch import Tensor @@ -97,38 +97,35 @@ def _fmt_matrix(mat: np.ndarray, per_line: int = 8) -> str: def td_lambda_targets( - values: Tensor, + leaf_values: Tensor, result: float, td_lambda: float, ) -> Tensor: - # values: V(s_t) for t = 0..T-1, shape [T] - # result: final result R of the game - - # This is ema, computed backwards - # target[T-1] = R - # target[t] = (1 - lambda) * V(s_{t+1}) + lambda * target[t+1] - length = len(values) - targets = torch.empty_like(values) + targets = torch.empty_like(leaf_values) targets[-1] = result - for ply in range(length - 2, -1, -1): - targets[ply] = (1.0 - td_lambda) * values[ply + 1] + td_lambda * targets[ + + # G[t] = (1-lambda)V[t+1] + lambda G[t+1] + for ply in range(len(leaf_values) - 2, -1, -1): + targets[ply] = (1.0 - td_lambda) * leaf_values[ply + 1] + td_lambda * targets[ ply + 1 ] + return targets @dataclass(frozen=True) class SelfPlayRecords: - positions: Tensor # [n, inp_dim] feature vector of each position + positions: Tensor # [n, inp_dim] game_ids: Tensor # [n] id of the game the position belongs to - plies: Tensor # [n] ply number (position is before this move) - results: Tensor # [n] final result from black's perspective (+1 black won, -1 white won, 0 draw) + results: Tensor # [n] final played result from black's perspective + terminals: Tensor # [n] true when the recorded position is a terminal leaf + terminal_values: Tensor # [n] exact value of a terminal leaf, otherwise 0 @classmethod def load_selfplay( cls, fn: Path, size: int, device: torch.device ) -> SelfPlayRecords: - # [ net input: 0-inp_dim ] [game_id] [ply] [game result] + # [net input] [game_id] [played result] [terminal flag] [leaf result] df = pd.read_csv(fn, header=None) inp_dim = NET_DIMS[size][0] return cls( @@ -141,12 +138,18 @@ class SelfPlayRecords: df.iloc[:, inp_dim].to_numpy(dtype=np.int64), device=device, ), - plies=torch.tensor( - df.iloc[:, inp_dim + 1].to_numpy(dtype=np.int64), + results=torch.tensor( + df.iloc[:, inp_dim + 1].to_numpy(dtype=np.float32), + dtype=torch.float32, + device=device, + ), + terminals=torch.tensor( + df.iloc[:, inp_dim + 2].to_numpy(dtype=np.bool_), + dtype=torch.bool, device=device, ), - results=torch.tensor( - df.iloc[:, inp_dim + 2].to_numpy(dtype=np.float32), + terminal_values=torch.tensor( + df.iloc[:, inp_dim + 3].to_numpy(dtype=np.float32), dtype=torch.float32, device=device, ), @@ -160,8 +163,9 @@ class SelfPlayRecords: return cls( positions=torch.concat([spr.positions for spr in sprs]), game_ids=torch.concat([spr.game_ids for spr in sprs]), - plies=torch.concat([spr.plies for spr in sprs]), results=torch.concat([spr.results for spr in sprs]), + terminals=torch.concat([spr.terminals for spr in sprs]), + terminal_values=torch.concat([spr.terminal_values for spr in sprs]), ) def make_training_data( @@ -175,9 +179,16 @@ class SelfPlayRecords: for game_id in torch.unique(self.game_ids): in_game = self.game_ids == game_id - game_values = values[in_game] + game_terminals = self.terminals[in_game] + game_terminal_values = self.terminal_values[in_game] + game_values = values[in_game].clone() + game_values[game_terminals] = game_terminal_values[game_terminals] game_result = self.results[in_game][0].item() - targets[in_game] = td_lambda_targets(game_values, game_result, td_lambda) + game_targets = td_lambda_targets(game_values, game_result, td_lambda) + # Terminal positions are also direct supervised examples. Do this + # after constructing the TD sequence so it does not reset the EMA. + game_targets[game_terminals] = game_terminal_values[game_terminals] + targets[in_game] = game_targets return self.positions, targets @@ -190,11 +201,18 @@ class SelfPlayRecords: class Net(Module): def __init__(self, inp_dim: int, hidden: int) -> None: super().__init__() + # learned 7-way cell-state embedding (empty, {black, white} x + # {flat, standing, road}); the slot layout must match nn.c + self.embedding = Embedding(7, 1) self.hidden = Linear(inp_dim, hidden, bias=True) self.output = Linear(hidden, 1, bias=True) def forward(self, x: Tensor) -> Tensor: - hidden = torch.relu(self.hidden(x)) + # x: [n, 3 + n_cells]; the first 3 columns are the fixed head + # inputs, the rest are raw cell states (0..6) + n = x.shape[0] + inp = torch.cat([x[:, :3], self.embedding(x[:, 3:].long()).view(n, -1)], dim=1) + hidden = torch.relu(self.hidden(inp)) return torch.tanh(self.output(hidden)).squeeze(-1) def fit( @@ -272,6 +290,7 @@ class Net(Module): prefix = ("cand_" if cand else "") + ("five" if size == 5 else "six") upper = "FIVE" if size == 5 else "SIX" + E = self.embedding.weight.detach().cpu().numpy() W = self.hidden.weight.detach().cpu().numpy() B = self.hidden.bias.detach().cpu().numpy() LW = self.output.weight.detach().cpu().numpy().ravel() @@ -283,6 +302,10 @@ class Net(Module): _ = f.write(f"/* {p} */\n") _ = f.write(f'#include "weights_{size}.h"\n\n') _ = f.write( + f"const float {prefix}_embedding[7] =\n" + f"{{\n{_fmt_flat(E, per_line=7)}\n}};\n\n" + ) + _ = f.write( f"const float {prefix}_dense_weights[{upper}_DENSE_NUM]" f"[{upper}_INP_NUM] NN_ALIGNED =\n{{\n{_fmt_matrix(W)}\n}};\n\n" ) @@ -340,7 +363,6 @@ class TournamentResult: champ: int cand: int draws: int - cand_rate: float def run_matches( @@ -365,14 +387,7 @@ def run_matches( champ = winners.count("current") cand = winners.count("candidate") draws = winners.count("draw") - aborts = len(winners) - champ - cand - draws - played = len(winners) - aborts - return TournamentResult( - champ=champ, - cand=cand, - draws=draws, - cand_rate=(cand + 0.5 * draws) / played if played else 0.0, - ) + return TournamentResult(champ=champ, cand=cand, draws=draws) # =================================================================== @@ -420,10 +435,10 @@ def run_step( print(f"\n== iteration {iter} ==") - # 1. self-play with the installed champion (include/weights_<size>.c) + # 1. rebuild selfplay _ = subprocess.run(["make", "selfplay"], cwd=root, check=True, capture_output=True) - # 2. generate self-play data (one game per process, in parallel) + # 2. generate self-play data eps = max(eps_min, eps_start * (eps_decay ** (iter - 1))) csv = make_csv(iter) print(f"selfplay, eps={eps:.4f}, depth {depth}, {games} games on {procs} procs") @@ -446,7 +461,7 @@ def run_step( # 3. fine-tune the champion on TD(lambda) targets -> candidate device = next(champ.parameters()).device csvs = [make_csv(i) for i in range(max(iter - replay_iters, 1), iter + 1)] - print("Loading data from", csvs) + print("Loading data from", [str(c) for c in csvs]) records = SelfPlayRecords.load_merge(csvs, size, device) cand = copy.deepcopy(champ) @@ -465,7 +480,7 @@ def run_step( cand=True, ) - # 4. build the match driver (champion + candidate linked) + # 4. build the match driver (champion + candidate) _ = subprocess.run(["make", "match"], cwd=root, check=True, capture_output=True) # 5. tournament + decision @@ -480,8 +495,7 @@ def run_step( decided = tournament_result.champ + tournament_result.cand rate = tournament_result.cand / decided if decided else 0.0 print( - f"champ {tournament_result.champ} - {tournament_result.cand} cand, {tournament_result.draws} draws, " - + f"winrate={rate:.3f}, cand_rate={tournament_result.cand_rate:.3f}" + f"champ {tournament_result.champ} - {tournament_result.cand} cand, {tournament_result.draws} draws, winrate={rate:.3f}" ) promote = decided >= int(0.25 * tournament_games) and rate >= promote_rate @@ -489,7 +503,7 @@ def run_step( cand.to_c( size, root / "include" / f"weights_{size}.c", - (f"v{iter:03d}, val_corr={corr:.4f}",), + (f"v{iter:03d}, val_corr={corr:.4f}, rate={rate:.4f}",), ) print(f"== candidate v{iter:03d} PROMOTED (include/weights_{size}.c) ==") return cand @@ -513,23 +527,23 @@ def main() -> None: ) _ = p.add_argument("--iters", type=int, default=10, help="max loop iterations") _ = p.add_argument( - "--games", type=int, default=2000, help="selfplay games per iteration" + "--games", type=int, default=100, help="selfplay games per iteration" ) _ = p.add_argument( "--replay-iters", type=int, - default=4, + default=0, help="number of previous self-play instances to mix in with current dataset during training", ) _ = p.add_argument( "--eps-start", type=float, default=0.15, - help="initial self-play epsilon (random-move probability); kept close " - "to --tour-eps so the value net trains on the policy it is deployed " - "under", + help="initial self-play epsilon: in asymmetric self-play one side (chosen at random per game) plays a uniform random move with this probability while the greedy side has its plies recorded", + ) + _ = p.add_argument( + "--eps-min", type=float, default=0.05, help="self-play epsilon floor" ) - _ = p.add_argument("--eps-min", type=float, default=0.05, help="epsilon floor") _ = p.add_argument( "--eps-decay", type=float, default=0.9, help="per-iteration epsilon decay" ) @@ -548,20 +562,20 @@ def main() -> None: _ = p.add_argument( "--tournament-eps", type=float, - default=0.05, + default=0.01, help="tournament epsilon (random-move probability)", ) _ = p.add_argument( "--tournament-games", type=int, default=None, - help="tournament games (10/tour_eps if unset)", + help="tournament games (1/tournament-eps if unset)", ) _ = p.add_argument( "--promote", type=float, - default=0.57, - help="candidate win rate among non-drawn tournament games needed to promote (~p<0.03 one-sided binomial at the default 200 games)", + default=0.0, + help="candidate win rate among non-drawn tournament games needed to promote", ) _ = p.add_argument( "--procs", @@ -582,7 +596,7 @@ def main() -> None: args = p.parse_args() if args.tournament_games is None: - args.tournament_games = max(20, int(round(10 / args.tournament_eps))) + args.tournament_games = max(100, int(round(1 / args.tournament_eps))) if args.procs is None: args.procs = max(1, (os.cpu_count() or 1) // 2) diff --git a/src/selfplay.c b/src/selfplay.c index 6da4f6e..8cd11b9 100644 --- a/src/selfplay.c +++ b/src/selfplay.c @@ -14,7 +14,7 @@ General Public License for more details. You should have received a copy of the GNU General Public License - along with ct. If not, see <https://www.gnu.org/licenses/>. + along with ctak. If not, see <https://www.gnu.org/licenses/>. */ #include <stdio.h> @@ -26,18 +26,24 @@ #include "actions.h" #include "negamax.h" #include "nn.h" +#include "pv.h" #include "tak.h" #include "xorshift64.h" +#ifndef RECORD_PV +#error "selfplay must be built with -DRECORD_PV (see the selfplay Makefile target)" +#endif + #define MAX_PLY 256 -#define MAX_INP (3 + 6 * 6) +#define MAX_CELLS (6 * 6) static tak_state_p state; static uint32_t min_ply; -// Positions buffered for the game (the net input only) -static float rows[MAX_PLY][MAX_INP]; -static uint32_t row_ply[MAX_PLY]; +static float row_head[MAX_PLY][3]; +static uint8_t row_cells[MAX_PLY][MAX_CELLS]; +static uint8_t row_term[MAX_PLY]; +static float row_terminal_value[MAX_PLY]; static uint32_t n_rows; static uint32_t game_id; // PID, tags every row so games can be grouped @@ -48,29 +54,44 @@ void negamax_display_progress(const uint8_t cur_depth, (void)(init_depth); (void)(length); } +static float win_value(const enum WIN_TYPE w) { + switch (w) { + case WIN_FLAT_BLACK: + case WIN_ROAD_BLACK: + return 1.0f; + case WIN_FLAT_WHITE: + case WIN_ROAD_WHITE: + return -1.0f; + default: + return 0.0f; + } +} + static int play_game(const uint32_t eps10000) { reset_state(state, state->board_size); n_rows = 0; + const enum COLOUR eps_side = (rand32() & 1) ? C_BLACK : C_WHITE; + char ptn[16]; for (uint32_t ply = 0; ply < MAX_PLY; ply++) { - // The engine's best move for this position (sets negamax_ptn) negamax_generate(state); - if (rand32() % 10000 < eps10000) { - // Epsilon: uniform random legal move + if (state->current_colour == eps_side && rand32() % 10000 < eps10000) { uint32_t n_actions; action_t *actions = actions_generate(state, &n_actions); action_to_ptn(actions[rand32() % n_actions], ptn); } else { - // Greedy: the engine's best move strcpy(ptn, negamax_ptn); } - // Buffer this position, before the move changes the board - if (ply >= min_ply && n_rows < MAX_PLY) { - nn_prepare_input(rows[n_rows], state); - row_ply[n_rows] = ply; + const pv_leaf_t *leaf = pv_get_leaf(); + if (leaf->current_colour != eps_side && ply >= min_ply && + n_rows < MAX_PLY) { + memcpy(row_head[n_rows], leaf->head, sizeof(row_head[n_rows])); + memcpy(row_cells[n_rows], leaf->cells, sizeof(row_cells[n_rows])); + row_term[n_rows] = leaf->terminal; + row_terminal_value[n_rows] = leaf->terminal_value; n_rows++; } @@ -89,52 +110,36 @@ static int play_game(const uint32_t eps10000) { const uint8_t n_cells = state->board_size * state->board_size; - // final outcome from black's perspective - float R; - switch (state->won) { - case WIN_FLAT_BLACK: - case WIN_ROAD_BLACK: - R = 1.0f; - break; - case WIN_FLAT_WHITE: - case WIN_ROAD_WHITE: - R = -1.0f; - break; - default: - R = 0.0f; - break; - } + // final outcome of the played game, from black's perspective + const float R = win_value(state->won); for (uint32_t k = 0; k < n_rows; k++) { - fprintf(stdout, "%d,%.8f,%.8f,", (int)rows[k][0], rows[k][1], - rows[k][2]); + fprintf(stdout, "%.8f,%.8f,%.8f,", row_head[k][0], row_head[k][1], + row_head[k][2]); for (uint8_t c = 0; c < n_cells; c++) - fprintf(stdout, "%.2f,", rows[k][3 + c]); - fprintf(stdout, "%u,%u,%.0f\n", game_id, row_ply[k], R); + fprintf(stdout, "%u,", (unsigned)row_cells[k][c]); + fprintf(stdout, "%u,%.0f,%u,%.0f\n", game_id, R, + (unsigned)row_term[k], row_terminal_value[k]); } return (int)n_rows; } -const char *license = - "selfplay, one game of self-play training data for the ct net\n\ +const char *usage = + "selfplay, one game of asymmetric self-play training data.\n\ Usage: selfplay <size> <eps> <depth> <min_ply>\n\ -Plays a single game of <size>x<size>. On each ply the engine's best move is played with probability 1-eps, and a uniform random legal move with probability eps. Every position from ply <min_ply> onwards is written to stdout as one CSV row:\n\ -\n\ - parity,white_flats,black_flats,<board values...>,game_id,ply,R\n\ +Plays a single asymmetric game of <size>x<size> self-play: one side plays the engine's best move at every ply (pure minimax) and the other side plays the engine's best move except that with probability eps it plays a uniform random legal move; the colour assignment of these two players is random. Only the deterministic side's plies are written to stdout, one CSV row per recorded search, from ply <min_ply> onwards:\n\ \n\ -The first 3 + size*size columns are the training input, game_id identifies the game, ply is the move number the position precedes, and R is the game's final outcome from black's perspective (+1 black won, -1 white won, 0 draw). nn_train.py runs many of these in parallel, pools the rows, and derives TD(lambda) targets from them.\n\ +parity,white_flats,black_flats,<cell ids...>,game_id,R,terminal,leaf_R\n\ +nn_train.py runs many of these in parallel to generate training data.\n\ \n\ Copyright (C) 2026, tslil clingman\n\ \n\ -This program is free software: you can redistribute it and/or modify\n \ -it under the terms of the GNU General Public License as published by\n \ -the Free Software Foundation, either version 3 of the License, or\n\ -(at your option) any later version."; +This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version."; int main(int argc, char **argv) { if (argc != 5) { - puts(license); + puts(usage); return EXIT_FAILURE; } @@ -147,6 +152,10 @@ int main(int argc, char **argv) { fprintf(stderr, "selfplay: size must be 5 or 6\n"); return EXIT_FAILURE; } + if (negamax_search_depth > NEGAMAX_MAX_DEPTH) { + fprintf(stderr, "selfplay: depth must be <= %d\n", NEGAMAX_MAX_DEPTH); + return EXIT_FAILURE; + } if (eps10000 >= 10000) { fprintf(stderr, "selfplay: eps must be < 1\n"); return EXIT_FAILURE; |
