00001 /* simpleHashRecord.cc 00002 */ 00003 #include "osl/search/simpleHashRecord.h" 00004 #include "osl/record/csa.h" 00005 #include <map> 00006 #include <iostream> 00007 #include <iomanip> 00008 00009 void osl::search:: 00010 SimpleHashRecord::dump(std::ostream& os) const 00011 { 00012 os << "SimpleHashRecord " << this 00013 << " node_count " << nodeCount() << "\n"; 00014 os << "best move " << record::csa::show(best_move.getMove()) 00015 << " " << best_move.getLogProb() 00016 << " " << best_move.record << "\t"; 00017 os << "limit: l " << lower_limit << " u " << upper_limit << "\n"; 00018 os << "in_check " << is_king_in_check << "\n"; 00019 os << "tried oracle " << qrecord.attack_oracle.proof 00020 << " " << qrecord.attack_oracle.proof_last_move 00021 << " " << qrecord.attack_oracle.disproof << "\n"; 00022 if (hasLowerBound(0)) 00023 os << lowerBound(); 00024 else 00025 os << "*"; 00026 os << " < "; 00027 if (hasUpperBound(0)) 00028 os << upperBound(); 00029 else 00030 os << "*"; 00031 os << "\n"; 00032 os << "moves " << limit_of_moves << " " << used_categories << "\n"; 00033 moves().dump(os); 00034 qrecord.dump(os); 00035 } 00036 00037 void osl::search:: 00038 SimpleHashRecord::dumpNodeCount(std::ostream& os, size_t max) const 00039 { 00040 os << "total: " << search_nodes << "\t"; 00041 if (search_nodes) { 00042 const double total = search_nodes; 00043 typedef std::multimap<double, SearchMove, std::greater<double> > map_t; 00044 map_t m; 00045 SearchMoveSet::const_range r(moves()); 00046 for (SearchMoveSet::const_iterator p=r.first; p!=r.last; ++p) 00047 { 00048 if (p->record) 00049 m.insert(std::make_pair(p->record->nodeCount()/total, *p)); 00050 } 00051 size_t i=0; 00052 for (map_t::const_iterator p=m.begin(); p!=m.end() && i < max; ++p, ++i) 00053 { 00054 os << std::setprecision(3) << p->first * 100.0 00055 << "% " << record::csa::show(p->second.getMove()) << "\t"; 00056 } 00057 } 00058 os << std::endl; 00059 } 00060 00061 double osl::search:: 00062 SimpleHashRecord::nodeRatio(Move move) const 00063 { 00064 const SearchMove *recorded = moves().find(move); 00065 if (! recorded || ! recorded->record) 00066 return 0.0; 00067 return recorded->record->nodeCount() / (double)search_nodes; 00068 } 00069 00070 size_t osl::search:: 00071 SimpleHashRecord::sumOfNodeCountOfChildren() const 00072 { 00073 size_t sum = 0; 00074 SearchMoveSet::const_range r(moves()); 00075 for (SearchMoveSet::const_iterator p=r.first; p!=r.last; ++p) 00076 { 00077 if (p->record) 00078 sum += p->record->nodeCount(); 00079 } 00080 return sum; 00081 } 00082 00083 void osl::search:: 00084 SimpleHashRecord::setSumNodeCountOfChildren() 00085 { 00086 search_nodes = sumOfNodeCountOfChildren(); 00087 } 00088 00089 void osl::search:: 00090 SimpleHashRecord::copyFrom(const SimpleHashRecord& src) 00091 { 00092 *this = src; 00093 // clear limitations 00094 qrecord.checkmate_nodes = std::min(qrecord.checkmate_nodes, 1); 00095 qrecord.threatmate_nodes = std::min(qrecord.threatmate_nodes, 1); 00096 search_nodes = 0; 00097 qrecord.attack_oracle = AttackOracleAges(); 00098 qrecord.threatmate_oracle = AttackOracleAges(); 00099 00100 SearchMoveSet::range r(moves()); 00101 for (SearchMoveSet::iterator p=r.first; p!=r.last; ++p) 00102 { 00103 p->record = 0; 00104 } 00105 } 00106 00107 00108 void osl::search:: 00109 SimpleHashRecord::fixBestMove() 00110 { 00111 if (bestMove().record) 00112 { 00113 SearchMove *stored_move = moves().find(bestMove().getMove()); 00114 best_move.record = stored_move->record; 00115 } 00116 } 00117 00118 00119 /* ------------------------------------------------------------------------- */ 00120 // ;;; Local Variables: 00121 // ;;; mode:c++ 00122 // ;;; c-basic-offset:2 00123 // ;;; End: