From 0e8d73bb3edcc8bdff6e3ded442b66f68265059a Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Sun, 21 Jun 2020 23:01:57 +0200 Subject: First push --- src/pruning_tables.c | 483 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 483 insertions(+) create mode 100644 src/pruning_tables.c (limited to 'src/pruning_tables.c') diff --git a/src/pruning_tables.c b/src/pruning_tables.c new file mode 100644 index 0000000..8936b99 --- /dev/null +++ b/src/pruning_tables.c @@ -0,0 +1,483 @@ +#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<