Check in Bonanza Feliz 0.0
[bonanza.git] / problem.c
1 #include "shogi.h"
2
3 int
4 solve_problems( tree_t * restrict ptree, unsigned int nposition )
5 {
6   const char *str_move;
7   uint64_t total_node;
8   unsigned int game_status_save, move, uposition, te1, te0;
9   int iret, success, failure, ianswer, istatus, iresult;
10
11   success = failure = 0;
12   total_node = 0;
13   if ( get_elapsed( &te0 ) < 0 ) { return -1; };
14
15   for ( uposition = 0; uposition < nposition; uposition++ )
16     {
17       istatus = in_CSA( ptree, &record_problems, NULL,
18                         ( flag_nomake_move | flag_detect_hang
19                           | flag_rejections ) );
20       if ( istatus < 0 ) { return istatus; }
21
22       if ( istatus > record_next )
23         {
24           snprintf( str_message, SIZE_MESSAGE, str_fmt_line,
25                     record_problems.lines, str_bad_record );
26           str_error = str_message;
27           return -2;
28         }
29
30       /* examine all of answers */
31       Out( "Answers:" );
32       for ( ianswer = 0; ianswer < MAX_ANSWER; ianswer++ )
33         {
34           str_move = &( record_problems.info.str_move[ianswer][0] );
35           if ( str_move[0] == '\0' ) { break; }
36           if ( ( root_turn && str_move[0] != '-' )
37                || ( ! root_turn && str_move[0] != '+' ) )
38             {
39               snprintf( str_message, SIZE_MESSAGE, str_fmt_line,
40                         record_problems.lines,
41                         "Answers has invalid sign of turn." );
42               str_error = str_message;
43               return -2;
44             }
45
46           iret = interpret_CSA_move( ptree, &move, str_move+1 );
47           if ( iret < 0 ) { return iret; }
48
49           iret = make_move_root( ptree, move, ( flag_detect_hang | flag_rep
50                                                 | flag_nomake_move ) );
51           if ( iret < 0 ) { return iret; }
52
53           Out( "%s ", str_move );
54         }
55       Out( "\n" );
56       if ( ! ianswer )
57         {
58           snprintf( str_message, SIZE_MESSAGE, str_fmt_line,
59                     record_problems.lines,
60                     "No answers in the record" );
61           str_error = str_message;
62           return -2;
63         }
64
65       iret = out_board( ptree, stdout, 0, 0 );
66       if ( iret < 0 ) { return iret; }
67
68       if ( get_elapsed( &time_start ) < 0 ) { return -1; };
69       time_turn_start = time_start;
70
71       game_status_save  = game_status;
72       game_status      |= flag_problem | flag_nopeek | flag_thinking;
73       iresult           = iterate( ptree, 0 );
74       game_status       = game_status_save;
75       if ( iresult < 0 ) { return iresult; }
76
77       if ( iresult ) { success++; }
78       else           { failure++; }
79
80       total_node += ptree->node_searched;
81
82       str_move = str_CSA_move( last_pv.a[1] );
83       Out( "problem #%d answer=%s -- %s (correct=%d, incorrect=%d)\n\n",
84            success+failure, str_move, iresult ? "correct" : "incorrect",
85            success, failure );
86
87       if ( istatus == record_eof ) { break; }
88       if ( istatus == record_misc )
89         {
90           iret = record_wind( &record_problems );
91           if ( iret < 0 )           { return iret; }
92           if ( iret == record_eof ) { break; }
93         }
94     }
95
96   if ( get_elapsed( &te1 ) < 0 ) { return -1; }
97
98   Out( "Total Nodes:   %" PRIu64 "\n", total_node );
99   Out( "Total Elapsed: %.2f\n", (double)( te1 - te0 ) / 1000.0 );
100
101   return 1;
102 }