From a392bbd0c957a00e3782c96e7ced84a29ff9dd88 Mon Sep 17 00:00:00 2001
From: Joseph Redmon <pjreddie@gmail.com>
Date: Tue, 15 Mar 2016 05:33:02 +0000
Subject: [PATCH] Play along w/ alphago
---
src/go.c | 82 ++++++++++++++++++++++++++++++-----------
1 files changed, 60 insertions(+), 22 deletions(-)
diff --git a/src/go.c b/src/go.c
index 5f8a418..8ee9318 100644
--- a/src/go.c
+++ b/src/go.c
@@ -8,6 +8,8 @@
#include "opencv2/highgui/highgui_c.h"
#endif
+int inverted = 0;
+
void train_go(char *cfgfile, char *weightfile)
{
data_seed = time(0);
@@ -23,7 +25,11 @@
char *backup_directory = "/home/pjreddie/backup/";
- data train = load_go("/home/pjreddie/backup/go.train");
+
+ char buff[256];
+ sprintf(buff, "/home/pjreddie/go.train.%02d", rand()%10);
+ data train = load_go(buff);
+
int N = train.X.rows;
int epoch = (*net.seen)/N;
while(get_current_batch(net) < net.max_batches || net.max_batches == 0){
@@ -58,6 +64,10 @@
char buff[256];
sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch);
save_weights(net, buff);
+
+ free_data(train);
+ sprintf(buff, "/home/pjreddie/go.train.%02d", epoch%10);
+ train = load_go(buff);
}
if(get_current_batch(net)%100 == 0){
char buff[256];
@@ -65,7 +75,6 @@
save_weights(net, buff);
}
}
- char buff[256];
sprintf(buff, "%s/%s.weights", backup_directory, base);
save_weights(net, buff);
@@ -117,14 +126,14 @@
int i;
int *l = calculate_liberties(board);
for(i = 0; i < 19*19; ++i){
- if (board[i] && !l[i]) board[i] = 0;
+ if (board[i] < 0 && !l[i]) board[i] = 0;
}
free(l);
}
-void print_board(float *board)
+void print_board(float *board, int swap, int *indexes)
{
- int i,j;
+ int i,j,n;
printf("\n\n");
printf(" ");
for(i = 0; i < 19; ++i){
@@ -132,11 +141,23 @@
}
printf("\n");
for(j = 0; j < 19; ++j){
- printf("%2d ", 19-j);
+ printf("%2d ", (inverted) ? 19-j : j+1);
for(i = 0; i < 19; ++i){
int index = j*19 + i;
- if(board[index] > 0) printf("\u25C9 ");
- else if(board[index] < 0) printf("\u25EF ");
+ if(indexes){
+ int found = 0;
+ for(n = 0; n < 3; ++n){
+ if(index == indexes[n]){
+ found = 1;
+ if(n == 0) printf("\uff11");
+ else if(n == 1) printf("\uff12");
+ else if(n == 2) printf("\uff13");
+ }
+ }
+ if(found) continue;
+ }
+ if(board[index]*-swap > 0) printf("\u25C9 ");
+ else if(board[index]*-swap < 0) printf("\u25EF ");
else printf(" ");
}
printf("\n");
@@ -161,11 +182,13 @@
set_batch_network(&net, 1);
float *board = calloc(19*19, sizeof(float));
float *move = calloc(19*19, sizeof(float));
- image bim = float_to_image(19, 19, 1, board);
+ int color = 1;
while(1){
float *output = network_predict(net, board);
copy_cpu(19*19, output, 1, move, 1);
int i;
+#ifdef GPU
+ image bim = float_to_image(19, 19, 1, board);
for(i = 1; i < 8; ++i){
rotate_image_cw(bim, i);
if(i >= 4) flip_image(bim);
@@ -182,6 +205,7 @@
rotate_image_cw(bim, -i);
}
scal_cpu(19*19, 1./8., move, 1);
+#endif
for(i = 0; i < 19*19; ++i){
if(board[i]) move[i] = 0;
}
@@ -189,40 +213,54 @@
int indexes[3];
int row, col;
top_k(move, 19*19, 3, indexes);
- print_board(board);
+ print_board(board, color, indexes);
for(i = 0; i < 3; ++i){
int index = indexes[i];
row = index / 19;
col = index % 19;
- printf("Suggested: %c %d, %.2f%%\n", col + 'A' + 1*(col > 7), 19 - row, move[index]*100);
+ printf("Suggested: %c %d, %.2f%%\n", col + 'A' + 1*(col > 7), (inverted)?19 - row : row+1, move[index]*100);
}
- int index = indexes[0];
- row = index / 19;
- col = index % 19;
+ int index = indexes[0];
+ int rec_row = index / 19;
+ int rec_col = index % 19;
- printf("\u25C9 Enter move: ");
+ if(color == 1) printf("\u25EF Enter move: ");
+ else printf("\u25C9 Enter move: ");
+
char c;
char *line = fgetl(stdin);
int num = sscanf(line, "%c %d", &c, &row);
- if (c < 'A' || c > 'T'){
+ if (strlen(line) == 0){
+ row = rec_row;
+ col = rec_col;
+ board[row*19 + col] = 1;
+ }else if (c < 'A' || c > 'T'){
if (c == 'p'){
- board[row*19 + col] = 1;
+ flip_board(board);
+ color = -color;
+ free(line);
+ continue;
}else{
char g;
num = sscanf(line, "%c %c %d", &g, &c, &row);
- row = 19 - row;
+ row = (inverted)?19 - row : row+1;
col = c - 'A';
if (col > 7) col -= 1;
- board[row*19 + col] = 0;
+ if (num == 3) board[row*19 + col] = 0;
}
- } else {
- row = 19 - row;
+ } else if(num == 2){
+ row = (inverted)?19 - row : row+1;
col = c - 'A';
if (col > 7) col -= 1;
- if(num == 2) board[row*19 + col] = 1;
+ board[row*19 + col] = 1;
+ }else{
+ free(line);
+ continue;
}
+ free(line);
update_board(board);
flip_board(board);
+ color = -color;
}
}
--
Gitblit v1.10.0