9 static const int nind = 10;
10 int legal_go(
float *b,
float *ko,
int p,
int r,
int c);
20 if(feof(fp))
return 0;
22 char *line = malloc(size*
sizeof(
char));
23 if(size != fread(line,
sizeof(
char), size, fp)){
35 m.
data = calloc(128,
sizeof(
char*));
36 FILE *fp = fopen(filename,
"rb");
39 while ((line =
fgetgo(fp))) {
42 m.
data = realloc(m.
data, m.
n*
sizeof(
char*));
47 printf(
"%d\n", count);
49 m.
data = realloc(m.
data, count*
sizeof(
char*));
56 memset(board, 0, 2*19*19*
sizeof(
float));
58 for(i = 0; i < 91; ++i){
60 for(j = 0; j < 4; ++j){
61 int me = (c >> (2*j)) & 1;
62 int you = (c >> (2*j + 1)) & 1;
63 if (me) board[count] = 1;
64 else if (you) board[count + 19*19] = 1;
66 if(count >= 19*19)
break;
74 memset(s, 0, (19*19/4+1)*
sizeof(
char));
76 for(i = 0; i < 91; ++i){
77 for(j = 0; j < 4; ++j){
78 int me = (board[count] == 1);
79 int you = (board[count + 19*19] == 1);
80 if (me) s[i] = s[i] | (1<<(2*j));
81 if (you) s[i] = s[i] | (1<<(2*j + 1));
83 if(count >= 19*19)
break;
88 static int occupied(
float *b,
int i)
91 if (b[i+19*19])
return -1;
101 for(i = 0; i < n; ++i){
102 float *board = d.
X.
vals[i];
103 float *label = d.
y.
vals[i];
104 char *b = m.
data[rand()%m.
n];
105 int player = b[0] -
'0';
106 int result = b[1] -
'0';
110 if(player > 0)
for(j = 0; j < 19*19; ++j) board[19*19*2 + j] = 1;
111 label[19*19+1] = (player==result);
112 if(row >= 19 || col >= 19){
115 label[col + 19*row] = 1;
116 if(occupied(board, col + 19*row)) printf(
"hey\n");
120 int rotate = rand()%4;
134 void train_go(
char *cfgfile,
char *weightfile,
char *filename,
int *gpus,
int ngpus,
int clear)
139 printf(
"%s\n", base);
140 printf(
"%d\n", ngpus);
145 for(i = 0; i < ngpus; ++i){
156 char *backup_directory =
"/home/pjreddie/backup/";
163 printf(
"Moves: %d\n", N);
164 int epoch = (*net->
seen)/N;
177 loss = train_networks(nets, ngpus, train, 10);
184 if(avg_loss == -1) avg_loss = loss;
185 avg_loss = avg_loss*.95 + loss*.05;
186 printf(
"%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n",
get_current_batch(net), (
float)(*net->
seen)/N, loss, avg_loss,
get_current_rate(net),
what_time_is_it_now()-time, *net->
seen);
187 if(*net->
seen/N > epoch){
188 epoch = *net->
seen/N;
190 sprintf(buff,
"%s/%s_%d.weights", backup_directory,base, epoch);
196 sprintf(buff,
"%s/%s.backup",backup_directory,base);
205 sprintf(buff,
"%s/%s.weights", backup_directory, base);
212 static void propagate_liberty(
float *board,
int *
lib,
int *visited,
int row,
int col,
int side)
214 if (row < 0 || row > 18 || col < 0 || col > 18)
return;
215 int index = row*19 + col;
216 if (occupied(board,index) != side)
return;
217 if (visited[index])
return;
220 propagate_liberty(board,
lib, visited, row+1, col, side);
221 propagate_liberty(board,
lib, visited, row-1, col, side);
222 propagate_liberty(board,
lib, visited, row, col+1, side);
223 propagate_liberty(board,
lib, visited, row, col-1, side);
227 static int *calculate_liberties(
float *board)
229 int *
lib = calloc(19*19,
sizeof(
int));
232 for(j = 0; j < 19; ++j){
233 for(i = 0; i < 19; ++i){
234 memset(visited, 0, 19*19*
sizeof(
int));
235 int index = j*19 + i;
236 if(!occupied(board,index)){
237 if ((i > 0) && occupied(board,index - 1)) propagate_liberty(board, lib, visited, j, i-1, occupied(board,index-1));
238 if ((i < 18) && occupied(board,index + 1)) propagate_liberty(board, lib, visited, j, i+1, occupied(board,index+1));
239 if ((j > 0) && occupied(board,index - 19)) propagate_liberty(board, lib, visited, j-1, i, occupied(board,index-19));
240 if ((j < 18) && occupied(board,index + 19)) propagate_liberty(board, lib, visited, j+1, i, occupied(board,index+19));
247 void print_board(FILE *stream,
float *board,
int player,
int *indexes)
250 fprintf(stream,
" ");
251 for(i = 0; i < 19; ++i){
252 fprintf(stream,
"%c ",
'A' + i + 1*(i > 7 &&
noi));
254 fprintf(stream,
"\n");
255 for(j = 0; j < 19; ++j){
256 fprintf(stream,
"%2d", (
inverted) ? 19-j : j+1);
257 for(i = 0; i < 19; ++i){
258 int index = j*19 + i;
261 for(n = 0; n < nind; ++n){
262 if(index == indexes[n]){
271 fprintf(stream,
" %d", n+1);
278 if (occupied(board, index) == player) fprintf(stream,
" X");
279 else if (occupied(board, index) ==-player) fprintf(stream,
" O");
280 else fprintf(stream,
" .");
282 fprintf(stream,
"\n");
289 for(i = 0; i < 19*19; ++i){
290 float swap = board[i];
291 board[i] = board[i+19*19];
292 board[i+19*19] = swap;
293 board[i+19*19*2] = 1-board[i+19*19*2];
300 copy_cpu(19*19+1, output, 1, move, 1);
301 float result = output[19*19 + 1];
305 for(i = 1; i < 8; ++i){
311 result += output[19*19 + 1];
316 axpy_cpu(19*19+1, 1, output, 1, move, 1);
324 for(i = 0; i < 19*19; ++i){
325 if(board[i] || board[i+19*19]) move[i] = 0;
330 static void remove_connected(
float *b,
int *
lib,
int p,
int r,
int c)
332 if (r < 0 || r >= 19 || c < 0 || c >= 19)
return;
333 if (occupied(b,
r*19 + c) != p)
return;
334 if (
lib[
r*19 + c] != 1)
return;
336 b[19*19 +
r*19 + c] = 0;
337 remove_connected(b,
lib, p,
r+1, c);
338 remove_connected(b,
lib, p,
r-1, c);
339 remove_connected(b,
lib, p,
r, c+1);
340 remove_connected(b,
lib, p,
r, c-1);
346 int *l = calculate_liberties(b);
347 if(p > 0) b[r*19 + c] = 1;
348 else b[19*19 + r*19 + c] = 1;
349 remove_connected(b, l, -p, r+1, c);
350 remove_connected(b, l, -p, r-1, c);
351 remove_connected(b, l, -p, r, c+1);
352 remove_connected(b, l, -p, r, c-1);
358 if(memcmp(a, b, 19*19*3*
sizeof(
float)) == 0)
return 1;
381 for(i = 0; i < 19*19+1; ++i){
396 float *in = calloc(19*19*3*n,
sizeof(
float));
400 for(j = 0; j < n; ++j){
404 memcpy(in + 19*19*3*j, im.
data, 19*19*3*
sizeof(
float));
409 for(j = 0; j < n; ++j){
429 root->
prior = calloc(19*19 + 1,
sizeof(
float));
430 root->
prob = calloc(19*19 + 1,
sizeof(
float));
431 root->
mean = calloc(19*19 + 1,
sizeof(
float));
432 root->
value = calloc(19*19 + 1,
sizeof(
float));
433 root->
visit_count = calloc(19*19 + 1,
sizeof(
int));
438 float val = 2*pred[19*19 + 1] - 1;
440 for(i = 0; i < 19*19+1; ++i) {
444 if(i < 19*19 && occupied(next, i)){
456 float *next = calloc(19*19*3,
sizeof(
float));
457 copy_cpu(19*19*3, board, 1, next, 1);
467 for(i = 0; i < 19*19+1; ++i){
469 if(root->
prob[i] > max){
481 if(max_i < 19*19 && !
legal_go(root->
board, prev, 1, max_i/19, max_i%19)) {
492 move_go(next, 1, max_i / 19, max_i % 19);
505 root->
value[i] += val;
517 for(i = 0; i < n; ++i){
530 if(index < 0 || index > 19*19 || !tree || !tree->
children[index]) {
552 float probs[19*19+1] = {0};
561 for(i = 0; i < 19*19+1; ++i){
564 for(i = 0; i < 19*19+1; ++i){
565 probs[i] = pow(tree->
visit_count[i], 1./temp) / sum;
575 top_k(probs, 19*19+1, nind, indexes);
578 fprintf(stderr,
"%d %d, Result: %f, Prior: %f, Prob: %f, Mean Value: %f, Child Result: %f, Visited: %d\n", index/19, index%19, tree->
result, tree->
prior[index], probs[index], tree->
mean[index], (tree->
children[index])?tree->
children[index]->
result:0, tree->
visit_count[index]);
580 fprintf(stderr,
"%d %d, Result: %f, Prior: %f, Prob: %f, Mean Value: %f, Child Result: %f, Visited: %d\n", ind/19, ind%19, tree->
result, tree->
prior[ind], probs[ind], tree->
mean[ind], (tree->
children[ind])?tree->
children[ind]->
result:0, tree->
visit_count[ind]);
582 fprintf(stderr,
"%d %d, Result: %f, Prior: %f, Prob: %f, Mean Value: %f, Child Result: %f, Visited: %d\n", ind/19, ind%19, tree->
result, tree->
prior[ind], probs[ind], tree->
mean[ind], (tree->
children[ind])?tree->
children[ind]->
result:0, tree->
visit_count[ind]);
614 static int makes_safe_go(
float *b,
int *
lib,
int p,
int r,
int c){
615 if (r < 0 || r >= 19 || c < 0 || c >= 19)
return 0;
616 if (occupied(b,
r*19 + c) == -p){
617 if (
lib[
r*19 + c] > 1)
return 0;
620 if (!occupied(b,
r*19 + c))
return 1;
621 if (
lib[
r*19 + c] > 1)
return 1;
627 int *l = calculate_liberties(b);
629 safe = safe || makes_safe_go(b, l, p, r+1, c);
630 safe = safe || makes_safe_go(b, l, p, r-1, c);
631 safe = safe || makes_safe_go(b, l, p, r, c+1);
632 safe = safe || makes_safe_go(b, l, p, r, c-1);
642 if(curr[19*19*2] != ko[19*19*2])
flip_board(curr);
649 if (occupied(b, r*19+c))
return 0;
733 void valid_go(
char *cfgfile,
char *weightfile,
int multi,
char *filename)
737 printf(
"%s\n", base);
742 float *board = calloc(19*19*3,
sizeof(
float));
743 float *
move = calloc(19*19+2,
sizeof(
float));
750 for (i = 0; i <N; ++i) {
752 int player = b[0] -
'0';
756 int truth = col + 19*row;
758 if(player > 0)
for(j = 0; j < 19*19; ++j) board[19*19*2 + j] = 1;
761 if(index == truth) ++correct;
762 printf(
"%d Accuracy %f\n", i, (
float) correct/(i+1));
770 fprintf(fp,
"komi 6.5\n");
771 fprintf(fp,
"boardsize 19\n");
772 fprintf(fp,
"clear_board\n");
773 for(j = 0; j < 19; ++j){
774 for(i = 0; i < 19; ++i){
775 if(occupied(board,j*19 + i) == 1) fprintf(fp,
"play black %c%d\n",
'A'+i+(i>=8), 19-j);
776 if(occupied(board,j*19 + i) == -1) fprintf(fp,
"play white %c%d\n",
'A'+i+(i>=8), 19-j);
777 if(occupied(board,j*19 + i)) ++count;
789 struct timeval timeout;
792 FD_SET(STDIN_FILENO, &readfds);
794 if (select(1, &readfds, NULL, NULL, &timeout)){
807 tree =
run_mcts(tree, net, b, ko, player, 100000, cpuct, .1);
809 fprintf(stderr,
"Pondered %d moves...\n", tree->
total_count - count);
813 void engine_go(
char *filename,
char *weightfile,
int mcts_iters,
float secs,
float temp,
float cpuct,
int anon,
int resign)
819 float *board = calloc(19*19*3,
sizeof(
float));
821 float *one = calloc(19*19*3,
sizeof(
float));
822 float *two = calloc(19*19*3,
sizeof(
float));
823 int ponder_player = 0;
827 int byo_yomi_time = 0;
828 int byo_yomi_stones = 0;
829 int black_time_left = 0;
830 int black_stones_left = 0;
831 int white_time_left = 0;
832 int white_stones_left = 0;
833 float orig_time = secs;
837 root =
ponder(root, net, board, two, ponder_player, cpuct);
839 old_ponder = ponder_player;
843 int has_id = (scanf(
"%d", &
id) == 1);
845 if (feof(stdin))
break;
846 fprintf(stderr,
"%s\n", buff);
848 sprintf(ids,
"%d",
id);
850 if (!has_id) ids[0] = 0;
851 if (!strcmp(buff,
"protocol_version")){
852 printf(
"=%s 2\n\n", ids);
853 }
else if (!strcmp(buff,
"name")){
855 printf(
"=%s The Fool!\n\n", ids);
857 printf(
"=%s DarkGo\n\n", ids);
859 }
else if (!strcmp(buff,
"time_settings")){
860 ponder_player = old_ponder;
861 scanf(
"%d %d %d", &main_time, &byo_yomi_time, &byo_yomi_stones);
862 printf(
"=%s \n\n", ids);
863 }
else if (!strcmp(buff,
"time_left")){
864 ponder_player = old_ponder;
866 int time = 0, stones = 0;
867 scanf(
"%s %d %d", color, &time, &stones);
868 if (color[0] ==
'b' || color[0] ==
'B'){
869 black_time_left = time;
870 black_stones_left = stones;
872 white_time_left = time;
873 white_stones_left = stones;
875 printf(
"=%s \n\n", ids);
876 }
else if (!strcmp(buff,
"version")){
878 printf(
"=%s :-DDDD\n\n", ids);
880 printf(
"=%s 1.0. Want more DarkGo? You can find me on OGS, unlimited games, no waiting! https://online-go.com/user/view/434218\n\n", ids);
882 }
else if (!strcmp(buff,
"known_command")){
885 int known = (!strcmp(comm,
"protocol_version") ||
886 !strcmp(comm,
"name") ||
887 !strcmp(comm,
"version") ||
888 !strcmp(comm,
"known_command") ||
889 !strcmp(comm,
"list_commands") ||
890 !strcmp(comm,
"quit") ||
891 !strcmp(comm,
"boardsize") ||
892 !strcmp(comm,
"clear_board") ||
893 !strcmp(comm,
"komi") ||
894 !strcmp(comm,
"final_status_list") ||
895 !strcmp(comm,
"play") ||
896 !strcmp(comm,
"genmove_white") ||
897 !strcmp(comm,
"genmove_black") ||
898 !strcmp(comm,
"fixed_handicap") ||
899 !strcmp(comm,
"genmove"));
900 if(known) printf(
"=%s true\n\n", ids);
901 else printf(
"=%s false\n\n", ids);
902 }
else if (!strcmp(buff,
"list_commands")){
903 printf(
"=%s protocol_version\nshowboard\nname\nversion\nknown_command\nlist_commands\nquit\nboardsize\nclear_board\nkomi\nplay\ngenmove_black\ngenmove_white\ngenmove\nfinal_status_list\nfixed_handicap\n\n", ids);
904 }
else if (!strcmp(buff,
"quit")){
906 }
else if (!strcmp(buff,
"boardsize")){
908 scanf(
"%d", &boardsize);
911 printf(
"?%s unacceptable size\n\n", ids);
914 memset(board, 0, 3*19*19*
sizeof(
float));
917 printf(
"=%s \n\n", ids);
919 }
else if (!strcmp(buff,
"fixed_handicap")){
921 scanf(
"%d", &handicap);
922 int indexes[] = {72, 288, 300, 60, 180, 174, 186, 66, 294};
924 for(i = 0; i < handicap; ++i){
925 board[indexes[i]] = 1;
929 }
else if (!strcmp(buff,
"clear_board")){
931 memset(board, 0, 3*19*19*
sizeof(
float));
935 printf(
"=%s \n\n", ids);
936 }
else if (!strcmp(buff,
"komi")){
939 printf(
"=%s \n\n", ids);
940 }
else if (!strcmp(buff,
"showboard")){
941 printf(
"=%s \n", ids);
944 }
else if (!strcmp(buff,
"play") || !strcmp(buff,
"black") || !strcmp(buff,
"white")){
947 if(!strcmp(buff,
"play"))
956 int count = scanf(
"%c%d", &c, &r);
957 int player = (color[0] ==
'b' || color[0] ==
'B') ? 1 : -1;
958 if((c ==
'p' || c ==
'P') && count < 2) {
960 printf(
"=%s \n\n", ids);
961 char *line =
fgetl(stdin);
970 if(c >=
'A' && c <=
'Z') c = c -
'A';
971 if(c >=
'a' && c <=
'z') c = c -
'a';
974 fprintf(stderr,
"move: %d %d\n", r, c);
980 copy_cpu(19*19*3, board, 1, one, 1);
981 if(root) fprintf(stderr,
"Prior: %f\n", root->
prior[r*19 + c]);
982 if(root) fprintf(stderr,
"Mean: %f\n", root->
mean[r*19 + c]);
983 if(root) fprintf(stderr,
"Result: %f\n", root->
result);
985 if(root) fprintf(stderr,
"Visited: %d\n", root->
total_count);
986 else fprintf(stderr,
"NOT VISITED\n");
988 printf(
"=%s \n\n", ids);
990 }
else if (!strcmp(buff,
"genmove") || !strcmp(buff,
"genmove_black") || !strcmp(buff,
"genmove_white")){
993 if(!strcmp(buff,
"genmove")){
996 player = (color[0] ==
'b' || color[0] ==
'B') ? 1 : -1;
997 }
else if (!strcmp(buff,
"genmove_black")){
1003 if(black_time_left <= 30) secs = 2.5;
1004 else secs = orig_time;
1006 if(white_time_left <= 30) secs = 2.5;
1007 else secs = orig_time;
1009 ponder_player = -player;
1013 root =
run_mcts(root, net, board, two, player, mcts_iters, cpuct, secs);
1019 if(move_num > resign && m.
value < .1 && m.
mcts < .1){
1020 printf(
"=%s resign\n\n", ids);
1021 }
else if(m.
row == 19){
1022 printf(
"=%s pass\n\n", ids);
1032 move_go(board, player, row, col);
1033 copy_cpu(19*19*3, board, 1, one, 1);
1035 if (col >= 8) ++col;
1036 printf(
"=%s %c%d\n\n", ids,
'A' + col, row);
1039 }
else if (!strcmp(buff,
"p")){
1041 }
else if (!strcmp(buff,
"final_status_list")){
1044 fprintf(stderr,
"final_status\n");
1045 char *line =
fgetl(stdin);
1047 if(type[0] ==
'd' || type[0] ==
'D'){
1049 FILE *f = fopen(
"game.txt",
"w");
1051 fprintf(f,
"%s final_status_list dead\n", ids);
1053 FILE *p = popen(
"./gnugo --mode gtp < game.txt",
"r");
1054 for(i = 0; i < count; ++i){
1059 while((l =
fgetl(p))){
1064 printf(
"?%s unknown command\n\n", ids);
1066 }
else if (!strcmp(buff,
"kgs-genmove_cleanup")){
1069 fprintf(stderr,
"kgs-genmove_cleanup\n");
1070 char *line =
fgetl(stdin);
1073 FILE *f = fopen(
"game.txt",
"w");
1075 fprintf(f,
"%s kgs-genmove_cleanup %s\n", ids, type);
1077 FILE *p = popen(
"./gnugo --mode gtp < game.txt",
"r");
1078 for(i = 0; i < count; ++i){
1083 while((l =
fgetl(p))){
1088 char *line =
fgetl(stdin);
1090 printf(
"?%s unknown command\n\n", ids);
1095 printf(
"%d %d %d\n",passed, black_stones_left, white_stones_left);
1104 float *board = calloc(19*19*3,
sizeof(
float));
1106 float *
move = calloc(19*19+1,
sizeof(
float));
1110 printf(
"%.2f%% Win Chance\n", (result+1)/2*100);
1114 top_k(move, 19*19+1, nind, indexes);
1116 for(i = 0; i < nind; ++i){
1117 int index = indexes[i];
1121 printf(
"%d: Pass, %.2f%%\n", i+1, move[index]*100);
1123 printf(
"%d: %c %d, %.2f%%\n", i+1, col +
'A' + 1*(col > 7 &&
noi), (
inverted)?19 - row : row+1, move[index]*100);
1128 if(color == 1) printf(
"X Enter move: ");
1129 else printf(
"O Enter move: ");
1132 char *line =
fgetl(stdin);
1134 int dnum = sscanf(line,
"%d", &picked);
1135 int cnum = sscanf(line,
"%c", &c);
1136 if (strlen(line) == 0 || dnum) {
1139 int index = indexes[picked];
1147 if (c <= 'T' && c >=
'A'){
1148 int num = sscanf(line,
"%c %d", &c, &row);
1151 if (col > 7 &&
noi) col -= 1;
1152 if (num == 2)
move_go(board, 1, row, col);
1153 }
else if (c ==
'p') {
1155 }
else if(c==
'b' || c ==
'w'){
1157 int num = sscanf(line,
"%c %c %d", &g, &c, &row);
1160 if (col > 7 &&
noi) col -= 1;
1162 int mc = (g ==
'b') ? 1 : -1;
1164 board[row*19 + col] = 1;
1166 board[19*19 + row*19 + col] = 1;
1169 }
else if(c ==
'c'){
1171 int num = sscanf(line,
"%c %c %d", &g, &c, &row);
1174 if (col > 7 &&
noi) col -= 1;
1176 board[row*19 + col] = 0;
1177 board[19*19 + row*19 + col] = 0;
1190 FILE *f = fopen(
"game.txt",
"w");
1192 fprintf(f,
"final_score\n");
1194 FILE *p = popen(
"./gnugo --mode gtp < game.txt",
"r");
1195 for(i = 0; i < count; ++i){
1202 while((l =
fgetl(p))){
1203 fprintf(stderr,
"%s \t", l);
1204 int n = sscanf(l,
"= %c+%f", &player, &score);
1208 if(player ==
'W') score = -score;
1213 void self_go(
char *filename,
char *weightfile,
char *f2,
char *w2,
int multi)
1227 net2 = calloc(1,
sizeof(
network));
1231 char boards[600][93];
1235 float *board = calloc(19*19*3,
sizeof(
float));
1237 float *one = calloc(19*19*3,
sizeof(
float));
1238 float *two = calloc(19*19*3,
sizeof(
float));
1245 int mcts_iters = 500;
1252 if((score > 0) == (total%2==0)) ++p1;
1255 fprintf(stderr,
"Total: %d, Player 1: %f, Player 2: %f\n", total, (
float)p1/total, (
float)p2/total);
1267 memset(board, 0, 3*19*19*
sizeof(
float));
1278 if ((total%2==0) == (player==1)){
1285 network *use = ((total%2==0) == (player==1)) ? net : net2;
1286 mcts_tree *
t = ((total%2==0) == (player==1)) ? tree1 : tree2;
1287 t =
run_mcts(t, use, board, two, player, mcts_iters, cpuct, 0);
1289 if(((total%2==0) == (player==1))) tree1 =
t;
1307 boards[count][0] = row;
1308 boards[count][1] = col;
1313 move_go(board, player, row, col);
1314 copy_cpu(19*19*3, board, 1, one, 1);
1324 fprintf(stderr,
"usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
1333 printf(
"%s\n", gpu_list);
1334 int len = strlen(gpu_list);
1337 for(i = 0; i < len; ++i){
1338 if (gpu_list[i] ==
',') ++ngpus;
1340 gpus = calloc(ngpus,
sizeof(
int));
1341 for(i = 0; i < ngpus; ++i){
1342 gpus[i] = atoi(gpu_list);
1343 gpu_list = strchr(gpu_list,
',')+1;
1350 int clear =
find_arg(argc, argv,
"-clear");
1352 char *cfg = argv[3];
1353 char *weights = (argc > 4) ? argv[4] : 0;
1354 char *c2 = (argc > 5) ? argv[5] : 0;
1355 char *w2 = (argc > 6) ? argv[6] : 0;
1356 int multi =
find_arg(argc, argv,
"-multi");
1357 int anon =
find_arg(argc, argv,
"-anon");
1363 if(0==strcmp(argv[2],
"train"))
train_go(cfg, weights, c2, gpus, ngpus, clear);
1364 else if(0==strcmp(argv[2],
"valid"))
valid_go(cfg, weights, multi, c2);
1365 else if(0==strcmp(argv[2],
"self"))
self_go(cfg, weights, c2, w2, multi);
1366 else if(0==strcmp(argv[2],
"test"))
test_go(cfg, weights, multi);
1367 else if(0==strcmp(argv[2],
"engine"))
engine_go(cfg, weights, iters, time, temp, cpuct, anon, resign);
float * copy_board(float *board)
int find_arg(int argc, char *argv[], char *arg)
void set_batch_network(network *net, int b)
int suicide_go(float *b, int p, int r, int c)
void run_go(int argc, char **argv)
int max_index(float *a, int n)
float predict_move2(network *net, float *board, float *move, int multi)
char * find_char_arg(int argc, char **argv, char *arg, char *def)
char * basecfg(char *cfgfile)
float train_network(network *net, data d)
void top_k(float *a, int n, int k, int *index)
int * random_index_order(int min, int max)
void move_go(float *b, int p, int r, int c)
void test_go(char *cfg, char *weights, int multi)
moves load_go_moves(char *filename)
void free_network(network *net)
image float_to_image(int w, int h, int c, float *data)
void save_weights(network *net, char *filename)
network * parse_network_cfg(char *filename)
void valid_go(char *cfgfile, char *weightfile, int multi, char *filename)
float select_mcts(mcts_tree *root, network *net, float *prev, float cpuct)
mcts_tree * run_mcts(mcts_tree *tree, network *net, float *board, float *ko, int player, int n, float cpuct, float secs)
int print_game(float *board, FILE *fp)
void free_mcts(mcts_tree *root)
void string_to_board(char *s, float *board)
void engine_go(char *filename, char *weightfile, int mcts_iters, float secs, float temp, float cpuct, int anon, int resign)
move pick_move(mcts_tree *tree, float temp, int player)
void axpy_cpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY)
float find_float_arg(int argc, char **argv, char *arg, float def)
struct mcts_tree mcts_tree
float get_current_rate(network *net)
void scal_cpu(int N, float ALPHA, float *X, int INCX)
struct mcts_tree ** children
float * network_predict_rotations(network *net, float *next)
mcts_tree * ponder(mcts_tree *tree, network *net, float *b, float *ko, int player, float cpuct)
int find_int_arg(int argc, char **argv, char *arg, int def)
network * load_network(char *cfg, char *weights, int clear)
int check_ko(float *x, float *ko)
mcts_tree * move_mcts(mcts_tree *tree, int index)
mcts_tree * expand(float *next, float *ko, network *net)
void cuda_set_device(int n)
float score_game(float *board)
void copy_cpu(int N, float *X, int INCX, float *Y, int INCY)
void print_board(FILE *stream, float *board, int player, int *indexes)
void self_go(char *filename, char *weightfile, char *f2, char *w2, int multi)
void rotate_image_cw(image im, int times)
size_t get_current_batch(network *net)
void flip_board(float *board)
matrix make_matrix(int rows, int cols)
void train_go(char *cfgfile, char *weightfile, char *filename, int *gpus, int ngpus, int clear)
int compare_board(float *a, float *b)
int max_int_index(int *a, int n)
int legal_go(float *b, float *ko, int p, int r, int c)
int sample_array(float *a, int n)
void load_weights(network *net, char *filename)
void board_to_string(char *s, float *board)
data random_go_moves(moves m, int n)
double what_time_is_it_now()