aboutsummaryrefslogtreecommitdiff
path: root/include/nn.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/nn.h')
-rw-r--r--include/nn.h81
1 files changed, 18 insertions, 63 deletions
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