Force iteration to start at 1 in analyze mode
[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   game_status |= flag_puzzling;
26   iret         = iterate( ptree );
27   game_status &= ~flag_puzzling;
28   if ( iret < 0 ) { return iret; }
29
30   if ( game_status & ( flag_quit | flag_quit_ponder | flag_suspend ) )
31     {
32       OutCsaShogi( "info ponder end\n" );
33       return 1;
34     }
35
36   if ( abs(last_root_value) > score_max_eval )
37     {
38       OutCsaShogi( "info ponder end\n" );
39       return 1;
40     }
41
42   ponder_move = move = last_pv.a[1];
43   str = str_CSA_move( move );
44   Out( "\nPonder on %c%s (%+.2f)\n\n",
45        ach_turn[root_turn], str, (double)last_root_value / 100.0 );
46
47   iret = make_move_root( ptree, move, flag_rep );
48   if ( iret < 0 )
49     {
50       OutCsaShogi( "info ponder end\n" );
51       return iret;
52     }
53   
54   if ( game_status & mask_game_end )
55     {
56       OutCsaShogi( "info ponder end\n" );
57       return unmake_move_root( ptree );
58     }
59   
60   if ( get_elapsed( &time_start ) < 0 ) { return -1; }
61
62   game_status |= flag_pondering;
63
64   iret = iterate( ptree );
65   if ( game_status & flag_thinking )
66     {
67       game_status &= ~flag_thinking;
68       if ( iret < 0 ) { return iret; }
69
70       iret = com_turn_start( ptree, flag_from_ponder );
71       if ( iret < 0 ) { return iret; }
72       
73       return 2;
74     }
75   OutCsaShogi( "info ponder end\n" );
76   game_status &= ~flag_pondering;
77   return unmake_move_root( ptree );
78 }
79
80
81 #if defined(MNJ_LAN) || defined(USI)
82 int
83 analyze( tree_t * restrict ptree )
84 {
85   int iret;
86
87 #if defined(MNJ_LAN)
88   if ( game_status & mask_game_end )
89     {
90       MnjOut( "pid=%d move=%%TORYO v=%de n=0 final%s\n",
91               mnj_posi_id, -score_bound,
92               ( mnj_depth_stable == INT_MAX ) ? "" : " stable" );
93       return 1;
94     }
95 #endif
96
97   iret = get_elapsed( &time_start );
98   if ( iret < 0 ) { return iret; }
99
100   game_status |= flag_pondering;
101   iret = iterate( ptree );
102   game_status &= ~flag_pondering;
103
104   if ( abs(last_root_value) > score_max_eval )
105     {
106       MnjOut( "pid=%d final%s\n", mnj_posi_id,
107               ( mnj_depth_stable == INT_MAX ) ? "" : " stable" );
108     }
109
110   return iret;
111 }
112 #endif