00001 /* quiescenceRecord.cc 00002 */ 00003 #include "osl/search/quiescenceRecord.h" 00004 #include "osl/record/csa.h" 00005 #include "osl/ptypeTable.h" 00006 #include <boost/static_assert.hpp> 00007 #include <map> 00008 #include <iostream> 00009 00010 BOOST_STATIC_ASSERT(osl::search::QuiescenceFlags::LAST_FLAG 00011 < sizeof(osl::search::QuiescenceFlags)*8); 00012 00013 namespace osl 00014 { 00015 namespace search 00016 { 00017 namespace 00018 { 00019 typedef std::map<int, const char *> name_map_t; // TODO:QuiescenceFlags::lags 00020 const name_map_t& make_names() 00021 { 00022 static name_map_t result; 00023 if (result.empty()) 00024 { 00025 for (int i=PTYPE_BASIC_MIN; i<=PTYPE_MAX; ++i) 00026 { 00027 const Ptype p = static_cast<Ptype>(i); 00028 result[p] = Ptype_Table.getName(p); 00029 } 00030 result[QuiescenceFlags::KING_ESCAPE] = "KING_ESCAPE"; 00031 result[QuiescenceFlags::PROMOTE] = "PROMOTE"; 00032 result[QuiescenceFlags::CHECK] = "CHECK"; 00033 result[QuiescenceFlags::DROP] = "DROP"; 00034 result[QuiescenceFlags::ALL_ESCAPE] = "ALL_ESCAPE"; 00035 result[QuiescenceFlags::MAJOR_PIECE_ATTACK] = "MAJOR_PIECE_ATTACK"; 00036 result[QuiescenceFlags::KNIGHT_ATTACK] = "KNIGHT_ATTACK"; 00037 result[QuiescenceFlags::GOLDSILVER_ATTACK] = "GOLDSILVER_ATTACK"; 00038 result[QuiescenceFlags::ADVANCE_BISHOP] = "ADVANCE_BISHOP"; 00039 result[QuiescenceFlags::KING8_ATTACK] = "KING8_ATTACK"; 00040 result[QuiescenceFlags::ESCAPE_FROM_LAST_MOVE] = "ESCAPE!"; 00041 result[QuiescenceFlags::PINNED_ATTACK] = "PINNED_ATTACK"; 00042 result[QuiescenceFlags::UTILIZE_PROMOTED] = "UTILIZE_PROMOTED"; 00043 result[QuiescenceFlags::BREAK_THREATMATE] = "BREAK_THREATMATE"; 00044 result[QuiescenceFlags::KING_WALK] = "KING_WALK"; 00045 } 00046 return result; 00047 } 00048 } // anonymous namespace 00049 } // namespace search 00050 } // namespace osl 00051 00052 void osl::search:: 00053 QuiescenceRecord::dump(std::ostream& os) const 00054 { 00055 os << "QuiescenceRecord " << this << "\n"; 00056 os << lower_bound << " (" << (int)lower_depth << ")" 00057 << upper_bound << " (" << (int)upper_depth << ")"; 00058 if (hasStaticValue()) 00059 { 00060 os << " s " << static_value << toString(staticValueType()); 00061 os << " t1 " << threat1.value << " " << record::csa::show(threat1.move) 00062 << " t2 " << threat2.value << " " << record::csa::show(threat2.move); 00063 } 00064 os << "\n"; 00065 os << "checkmate read " << checkmate_nodes << "\t" 00066 << "threatmate read " << threatmate_nodes << "\n"; 00067 os << "best move " << record::csa::show(best_move) << "\n"; 00068 os << "threatmate " << threatmate << "\n"; 00069 os << "king8info " << king8info << "\n"; 00070 os << "oracle a " << attack_oracle.proof 00071 << " t " << threatmate_oracle.proof << "\n"; 00072 os << "flags: "; 00073 const name_map_t& names = make_names(); 00074 { 00075 int printed = 0; 00076 for (int i=0; i<QuiescenceFlags::LAST_FLAG; ++i) 00077 { 00078 if (flags.data & (1 << (i))) // isGenerated 00079 { 00080 ++printed; 00081 const name_map_t::const_iterator p=names.find(i); 00082 if (p != names.end()) 00083 os << p->second << " "; 00084 else 00085 os << "(" << i << ") "; 00086 if (printed % 4 == 0) 00087 os << "\n"; 00088 } 00089 } 00090 if (printed % 4) 00091 os << "\n"; 00092 } 00093 os << "sendoffs " << sendoffs.size(); 00094 for (size_t i=0; i<sendoffs.size(); ++i) 00095 { 00096 os << " " << record::csa::show(sendoffs[i]); 00097 } 00098 os << "\n"; 00099 os << "moves " << moves_size(); 00100 size_t i=0; 00101 MoveVector moves_copy; 00102 loadMoves(moves_copy); 00103 for (MoveVector::const_iterator p=moves_copy.begin(); p!=moves_copy.end(); ++p, ++i) 00104 { 00105 os << " " << record::csa::show(*p); 00106 if (i % 8 == 7) 00107 os << "\n"; 00108 } 00109 if (i % 8 != 7) 00110 os << "\n"; 00111 } 00112 00113 const char *osl::search:: 00114 QuiescenceRecord::toString(StaticValueType type) 00115 { 00116 switch (type) 00117 { 00118 case UNKNOWN: 00119 return "?"; 00120 case UPPER_BOUND: 00121 return ">"; 00122 case EXACT: 00123 return "="; 00124 default: 00125 assert(0); 00126 } 00127 return "!"; // should not occur 00128 } 00129 00130 /* ------------------------------------------------------------------------- */ 00131 // ;;; Local Variables: 00132 // ;;; mode:c++ 00133 // ;;; c-basic-offset:2 00134 // ;;; End: