blob: da307665973b1596dfff11d78ff0a8e6b81c022b [file] [log] [blame]
#include "globals.h"
#include "macros.h"
static FILE *trait_file = NULL;
static s32bit
tr_total_non_safe_moves(s32bit player)
{
u32bit mask1, mask2;
s32bit num_rows = g_board_size[player];
s32bit count = 0, i;
for(i = 0; i < num_rows; i++){
mask1 = g_board[player][i] & g_board[player][i+2];
mask2 = ~g_board[player][i+1];
mask1 = (~((mask1 >> 1) & mask1)) & ((mask2 >> 1) & mask2);
// printf("%X\n", mask1);
count += countbits32(mask1);
}
return count;
}
static s32bit
tr_non_safe_moves_a_little_touchy(s32bit player)
{
u32bit mask1, mask2;
s32bit num_rows = g_board_size[player];
s32bit count = 0, i;
for(i = 0; i < num_rows; i++){
mask1 = g_board[player][i] | g_board[player][i+2];
mask2 = g_board[player][i+1];
mask1 = ( (mask1 << 1) | mask1
| (mask2 >> 1) | mask2 | (mask2 << 1) | (mask2 << 2) );
count += countbits32(~mask1);
}
if(count == -1){
print_board(player);
printf("%d %d\n", player, count);
exit(1);
}
return count;
}
static s32bit
tr_non_safe_moves_no_touchy(s32bit player)
{
return 1;
}
static s32bit
tr_total_empty_squares()
{
u32bit mask;
s32bit num_rows = g_board_size[0];
s32bit count = 0, i;
for(i = 0; i < num_rows; i++){
mask = ~(g_board[0][i+1]);
count += countbits32(mask);
}
return count;
}
static s32bit
tr_border_length_col(player)
{
u32bit mask;
s32bit num_rows = g_board_size[player];
s32bit count = 0, i;
for(i = 0; i <= num_rows; i++){
mask = g_board[player][i] ^ g_board[player][i+1];
count += countbits32(mask);
}
return count;
}
static s32bit
tr_border_length_row(player)
{
u32bit mask;
s32bit num_rows = g_board_size[player];
s32bit count = 0, i;
for(i = 0; i <= num_rows; i++){
mask = (g_board[player][i+1]>>1) ^ g_board[player][i+1];
mask &= 0x7FFFFFFF;
count += countbits32(mask);
}
return count;
}
extern void
write_node_info(u64bit num_nodes, s32bit winner)
{
s32bit num;
if(trait_file == NULL) {
trait_file = fopen("trait_file", "w");
if(trait_file == NULL)
fprintf(stderr, "Couldn't open \"trait_file\".\n");
}
fprintf(trait_file, "%c %15s :", (winner == VERTICAL) ? 'V' : 'H',
u64bit_to_string(num_nodes));
//========================================================
// number of non-safe moves.
//========================================================
// total number allowing overlapping of other non-safe moves
// and of safe moves.
num = tr_total_non_safe_moves(winner);
fprintf(trait_file, " %2d", num);
num = tr_total_non_safe_moves(winner^PLAYER_MASK);
fprintf(trait_file, " %2d :", num);
// non safe moves that don't touch a border, except diagonally.
num = tr_non_safe_moves_a_little_touchy(winner);
fprintf(trait_file, " %2d", num);
num = tr_non_safe_moves_a_little_touchy(winner^PLAYER_MASK);
fprintf(trait_file, " %2d :", num);
// non safe moves that don't touch a border, never.
num = tr_non_safe_moves_no_touchy(winner);
fprintf(trait_file, " %2d", num);
num = tr_non_safe_moves_no_touchy(winner^PLAYER_MASK);
fprintf(trait_file, " %2d :", num);
//========================================================
// Miscellaneous other info.
//========================================================
// empty squares.
num = tr_total_empty_squares();
fprintf(trait_file, " %2d :", num);
// border length.
num = tr_border_length_col(winner);
fprintf(trait_file, " %2d", num);
// border length.
num = tr_border_length_row(winner);
fprintf(trait_file, " %2d", num);
fprintf(trait_file, "\n");
}