#include #include "pruning_tables.h" #include "moves.h" /* The data contained in e.g. eofb pruning table is the same that is contained * in eolr pruning table and so on. For small tables the memory wasted is not * too much and it makes things easier. I may change this when I implement * bigger tables. */ int eofb_pruning_table[pow2to11]; int eorl_pruning_table[pow2to11]; int eoud_pruning_table[pow2to11]; int coud_pruning_table[pow3to7]; int cofb_pruning_table[pow3to7]; int corl_pruning_table[pow3to7]; int cp_pruning_table[factorial8]; int eorl_from_eofb_pruning_table[pow2to11]; int eoud_from_eofb_pruning_table[pow2to11]; int eoud_from_eorl_pruning_table[pow2to11]; int eofb_from_eorl_pruning_table[pow2to11]; int eofb_from_eoud_pruning_table[pow2to11]; int eorl_from_eoud_pruning_table[pow2to11]; int coud_from_eofb_pruning_table[pow3to7]; int coud_from_eorl_pruning_table[pow3to7]; int cofb_from_eorl_pruning_table[pow3to7]; int cofb_from_eoud_pruning_table[pow3to7]; int corl_from_eoud_pruning_table[pow3to7]; int corl_from_eofb_pruning_table[pow3to7]; int cp_drud_pruning_table[factorial8]; int cp_drfb_pruning_table[factorial8]; int cp_drrl_pruning_table[factorial8]; int epud_pruning_table[factorial8]; int epfb_pruning_table[factorial8]; int eprl_pruning_table[factorial8]; int cp_htr_pruning_table[factorial8]; int cpud_to_htr_pruning_table[factorial8]; int cpfb_to_htr_pruning_table[factorial8]; int cprl_to_htr_pruning_table[factorial8]; /* About 1Mb each */ int8_t eofb_epose_pruning_table[pow2to11][binom12on4]; int8_t eorl_eposs_pruning_table[pow2to11][binom12on4]; int8_t eoud_eposm_pruning_table[pow2to11][binom12on4]; /* About 4.5Mb each */ int8_t eofb_coud_pruning_table[pow2to11][pow3to7]; int8_t eofb_corl_pruning_table[pow2to11][pow3to7]; int8_t eorl_coud_pruning_table[pow2to11][pow3to7]; int8_t eorl_cofb_pruning_table[pow2to11][pow3to7]; int8_t eoud_cofb_pruning_table[pow2to11][pow3to7]; int8_t eoud_corl_pruning_table[pow2to11][pow3to7]; /* About 1Mb each */ int8_t coud_epose_from_eofb_pruning_table[pow3to7][binom12on4]; int8_t cofb_eposs_from_eorl_pruning_table[pow3to7][binom12on4]; int8_t corl_eposm_from_eoud_pruning_table[pow3to7][binom12on4]; int8_t coud_epose_from_eorl_pruning_table[pow3to7][binom12on4]; int8_t cofb_eposs_from_eoud_pruning_table[pow3to7][binom12on4]; int8_t corl_eposm_from_eofb_pruning_table[pow3to7][binom12on4]; /* Firs one is 88Mb, second one is 71Mb */ int8_t cp_co_pruning_table[factorial8][pow3to7]; int8_t triple_eo_pruning_table[pow2to11][binom12on4*binom8on4]; int initialized_small = 0; int initialized_directdr = 0; int initialized_drfromeo = 0; int initialized_huge = 0; void init_single_table(int n, int t_tab[][19], int p_tab[n], int mask) { int state[n]; state[0] = 0; /* 0 should always be the solved state. */ p_tab[0] = 0; int state_count = 1; for (int i = 0; i < state_count; i++) { for (int m = 1; m < 19; m++) { int next = t_tab[state[i]][m]; if (mask & (1< p_tab[state[i]] + 1) && next) { p_tab[next] = p_tab[state[i]] + 1; state[state_count++] = next; } } } } } void init_double_table(int n1, int n2, int t_table1[n1][19], int t_table2[n2][19], int8_t p_table[n1][n2], int mask) { static int state1[factorial8*pow3to7], state2[factorial8*pow3to7]; state1[0] = 0; state2[0] = 0; p_table[0][0] = 0; int state_count = 1; for (int i = 0; i < state_count; i++) { for (int m = 1; m < 19; m++) { int next1 = t_table1[state1[i]][m]; int next2 = t_table2[state2[i]][m]; if (mask & (1<