00001 #include "osl/ntesuki/ntesukiSearcher.tcc"
00002 #include <climits>
00003
00004 bool osl::ntesuki::NtesukiSearcher::
00005 delay_non_pass = false;
00006
00007 bool osl::ntesuki::NtesukiSearcher::
00008 ptt_invalid_defense = false;
00009
00010 bool osl::ntesuki::NtesukiSearcher::
00011 delay_interpose = false;
00012
00013 bool osl::ntesuki::NtesukiSearcher::
00014 delay_nopromote = false;
00015
00016 bool osl::ntesuki::NtesukiSearcher::
00017 delay_non_attack = false;
00018
00019 bool osl::ntesuki::NtesukiSearcher::
00020 read_attack_only = false;
00021
00022 bool osl::ntesuki::NtesukiSearcher::
00023 ptt_non_attack = false;
00024
00025 bool osl::ntesuki::NtesukiSearcher::
00026 ptt_siblings_fail = false;
00027
00028 bool osl::ntesuki::NtesukiSearcher::
00029 ptt_siblings_success = false;
00030
00031 bool osl::ntesuki::NtesukiSearcher::
00032 ptt_uncle = false;
00033
00034 bool osl::ntesuki::NtesukiSearcher::
00035 ptt_aunt = false;
00036
00037
00038
00039
00040 osl::ntesuki::NtesukiSearcher::
00041 NtesukiSearcher(State& state,
00042 NtesukiMoveGenerator *mg,
00043 unsigned int table_limit,
00044 volatile int *stop_flag,
00045 bool verbose,
00046 int max_pass,
00047 NtesukiRecord::IWScheme iwscheme,
00048 NtesukiRecord::PSScheme psscheme,
00049 NtesukiRecord::ISScheme isscheme,
00050 int tsumero_cost,
00051 int tsumero_estimate,
00052 double gc_ratio)
00053 : state(state),
00054 mg(mg),
00055 table(table_limit,
00056 static_cast<unsigned int>(table_limit * gc_ratio),
00057 verbose),
00058 simulator(state, mg, path, table, isscheme, verbose),
00059 node_count(0),
00060 verbose(verbose),
00061 stop_flag(stop_flag),
00062 path(state.getTurn()),
00063
00064 max_pass(max_pass),
00065 iwscheme(iwscheme),
00066 psscheme(psscheme),
00067 isscheme(isscheme),
00068 tsumero_cost(tsumero_cost),
00069 tsumero_estimate(tsumero_estimate),
00070 gc_ratio(gc_ratio),
00071
00072 blockByAttackBack(0), blockByPass(0),
00073 attack_node_count(0),
00074 attack_node_under_attack_count(0),
00075 attack_node_moves_count(0),
00076 defense_node_count(0),
00077 defense_node_under_attack_count(0),
00078 defense_node_moves_count(0),
00079 pass_count(0), pass_success_count(0),
00080 pass_attack_count(0), pass_attack_success_count(0),
00081 sibling_defense_count(0), sibling_defense_success_count(0),
00082 sibling_attack_count(0), sibling_attack_success_count(0),
00083 isshogi_defense_count(0), isshogi_defense_success_count(0),
00084 isshogi_attack_count(0), isshogi_attack_success_count(0),
00085 immediate_win(0), immediate_lose(0),
00086 attack_back_count(0),
00087 proof_without_inversion_count(0), proof_AND_count(0), disproof_by_inversion_count(0)
00088 {
00089 NtesukiRecord::table = &table;
00090 NtesukiRecord::state = &state;
00091 NtesukiRecord::mg = mg;
00092 NtesukiRecord::split_count = 0;
00093 NtesukiRecord::confluence_count = 0;
00094
00095 if (this->max_pass > (int)NtesukiRecord::SIZE)
00096 this->max_pass = NtesukiRecord::SIZE;
00097
00098 if (verbose)
00099 {
00100 std::cerr << "NtesukiSearcher \n"
00101 << "IWScheme:\t" << iwscheme << "\n"
00102 << "PSScheme:\t" << psscheme << "\n"
00103 << "ISScheme:\t" << isscheme << "\n"
00104 << "Fixed:\t" << NtesukiRecord::fixed_search_depth<< "\n"
00105 << "Tsumero cost:\t" << tsumero_cost << "\n"
00106 << "Tsumero estimate:\t" << tsumero_estimate << "\n"
00107 << "Inversion cost:\t" << NtesukiRecord::inversion_cost << "\n"
00108 ;
00109 std::cerr << "enhancements: ";
00110 if(NtesukiSearcher::ptt_uncle)
00111 std::cerr << " PTT_UNCLE";
00112 if(NtesukiSearcher::ptt_siblings_fail)
00113 std::cerr << " PTT_SIBLINGS_FAIL";
00114 if(NtesukiSearcher::ptt_siblings_success)
00115 std::cerr << " PTT_SIBLINGS_SUCCESS";
00116 if(NtesukiSearcher::delay_non_pass)
00117 std::cerr << " DELAY_NON_PASS";
00118 if (NtesukiSearcher::ptt_invalid_defense)
00119 std::cerr << " PASS_SIMULATION";
00120 if (NtesukiSearcher::delay_interpose)
00121 std::cerr << " DELAY_INTERPOSE";
00122 if(NtesukiSearcher::delay_nopromote)
00123 std::cerr << " DELAY_NOPROMOTE";
00124 if(NtesukiSearcher::delay_non_attack)
00125 std::cerr << " DELAY_NON_ATTACK";
00126 if(NtesukiSearcher::read_attack_only)
00127 std::cerr << " READ_ATTACK_ONLY";
00128 if(NtesukiSearcher::ptt_non_attack)
00129 std::cerr << " PTT_NON_ATTACK";
00130 if (NtesukiRecord::use_dominance)
00131 std::cerr << " USE_DOMINANCE";
00132 std::cerr << "\n";
00133 }
00134 }
00135
00136 osl::ntesuki::NtesukiSearcher::
00137 ~NtesukiSearcher()
00138 {
00139 if (verbose)
00140 {
00141 std::cerr << "~NtesukiSearcher "
00142 << table.size()
00143 << "/" << node_count
00144 << "/" << read_node_limit << "\t"
00145 << "pass(" << pass_success_count << "/" << pass_count << ")\n"
00146
00147 << "attack_node\t"
00148 << attack_node_under_attack_count << "/"
00149 << attack_node_count << "\t"
00150 << attack_node_moves_count << "moves\n"
00151
00152 << "defense_node\t"
00153 << defense_node_under_attack_count << "/"
00154 << defense_node_count << "\t"
00155 << defense_node_moves_count << "moves\n"
00156
00157 << "immidate(" << immediate_win << ", "
00158 << immediate_lose << ")\n"
00159
00160 << "attack_back(" << attack_back_count << ")\n"
00161
00162 << "sibling_success(" << sibling_defense_success_count
00163 << "/" << sibling_defense_count << ")\n"
00164 << "sibling_fail(" << sibling_attack_success_count
00165 << "/" << sibling_attack_count << ")\n"
00166
00167 << "is_att(" << isshogi_attack_success_count
00168 << "/" << isshogi_attack_count << ")\t"
00169 << "is_def(" << isshogi_defense_success_count
00170 << "/" << isshogi_defense_count << ")\n"
00171
00172 << "inversion_win(" << disproof_by_inversion_count
00173 << "/" << proof_AND_count
00174 << "/" << proof_without_inversion_count << ")\n"
00175
00176 << "DAG\t"
00177 << NtesukiRecord::split_count << "/"
00178 << NtesukiRecord::confluence_count << "\n"
00179 ;
00180 }
00181 }
00182
00183 NtesukiTable&
00184 osl::ntesuki::NtesukiSearcher::
00185 getTable()
00186 {
00187 return table;
00188 }
00189
00190
00191
00192 namespace osl
00193 {
00194 namespace ntesuki
00195 {
00196 template int NtesukiSearcher::search<BLACK>();
00197 template int NtesukiSearcher::search<WHITE>();
00198 }
00199 }
00200
00201