Fix force mode after setboard
[bonanza.git] / ponder.c
1 #include <stdlib.h>
2 #include <limits.h>
3 #include "shogi.h"
4
5
6 int
7 ponder( tree_t * restrict ptree )
8 {
9   const char *str;
10   unsigned int move;
11   int iret;
12
13   if ( ( game_status & ( mask_game_end | flag_noponder | flag_nopeek ) )
14        || abs( last_root_value ) > score_max_eval
15        || ! record_game.moves
16        || sec_limit_up == UINT_MAX ) { return 1; }
17
18   ponder_nmove = gen_legal_moves( ptree, ponder_move_list, 1 );
19
20   if ( get_elapsed( &time_start ) < 0 ) { return -1; }
21
22   Out( "\nSearch a move to ponder\n\n" );
23   OutCsaShogi( "info ponder start\n" );
24
25 #if defined(XBOARD)
26   // [HGM] for converting to CSA move during ponder
27   for( iret = 0; iret < nsquare; iret++ ) root_pos[iret] = BOARD[iret];
28 #endif
29
30   game_status |= flag_puzzling;
31   iret         = iterate( ptree );
32   game_status &= ~flag_puzzling;
33   if ( iret < 0 ) { return iret; }
34
35   if ( game_status & ( flag_quit | flag_quit_ponder | flag_suspend ) )
36     {
37       OutCsaShogi( "info ponder end\n" );
38       return 1;
39     }
40
41   if ( abs(last_root_value) > score_max_eval )
42     {
43       OutCsaShogi( "info ponder end\n" );
44       return 1;
45     }
46
47   ponder_move = move = last_pv.a[1];
48   str = str_CSA_move( move );
49   Out( "\nPonder on %c%s (%+.2f)\n\n",
50        ach_turn[root_turn], str, (double)last_root_value / 100.0 );
51
52   iret = make_move_root( ptree, move, flag_rep );
53   if ( iret < 0 )
54     {
55       OutCsaShogi( "info ponder end\n" );
56       return iret;
57     }
58   
59   if ( game_status & mask_game_end )
60     {
61       OutCsaShogi( "info ponder end\n" );
62       return unmake_move_root( ptree );
63     }
64   
65   if ( get_elapsed( &time_start ) < 0 ) { return -1; }
66
67   game_status |= flag_pondering;
68
69   iret = iterate( ptree );
70   if ( game_status & flag_thinking )
71     {
72       game_status &= ~flag_thinking;
73       if ( iret < 0 ) { return iret; }
74
75       iret = com_turn_start( ptree, flag_from_ponder );
76       if ( iret < 0 ) { return iret; }
77       
78       return 2;
79     }
80   OutCsaShogi( "info ponder end\n" );
81   game_status &= ~flag_pondering;
82   return unmake_move_root( ptree );
83 }
84
85
86 #if defined(MNJ_LAN) || defined(USI)
87 int
88 analyze( tree_t * restrict ptree )
89 {
90   int iret;
91
92 #if defined(MNJ_LAN)
93   if ( game_status & mask_game_end )
94     {
95       MnjOut( "pid=%d move=%%TORYO v=%de n=0 final%s\n",
96               mnj_posi_id, -score_bound,
97               ( mnj_depth_stable == INT_MAX ) ? "" : " stable" );
98       return 1;
99     }
100 #endif
101
102   iret = get_elapsed( &time_start );
103   if ( iret < 0 ) { return iret; }
104
105   game_status |= flag_pondering;
106   iret = iterate( ptree );
107   game_status &= ~flag_pondering;
108
109   if ( abs(last_root_value) > score_max_eval )
110     {
111       MnjOut( "pid=%d final%s\n", mnj_posi_id,
112               ( mnj_depth_stable == INT_MAX ) ? "" : " stable" );
113     }
114
115   return iret;
116 }
117 #endif