checkDuplicate.cc
Go to the documentation of this file.
00001 #include "osl/record/checkDuplicate.h"
00002 #include "osl/state/numEffectState.h"
00003 #include <boost/foreach.hpp>
00004 #include <boost/format.hpp>
00005 #include <iostream>
00006 
00007 std::pair<osl::HashKey,osl::PathEncoding> osl::record::
00008 CheckDuplicate::getLastState(const vector<Move>& moves)
00009 {
00010   NumEffectState state;
00011   PathEncoding path(BLACK);
00012   
00013   BOOST_FOREACH(Move move, moves)
00014   {
00015     state.makeMove(move);
00016     path.pushMove(move);
00017     assert(state.isConsistent(true));
00018   }
00019   return std::make_pair(HashKey(state), path);
00020 }
00021 
00022 osl::record::CheckDuplicate::DUPLICATE_RESULT osl::record::
00023 CheckDuplicate::regist(const vector<Move>& moves)
00024 {
00025   const std::pair<HashKey, PathEncoding> pair = getLastState(moves);
00026   return regist(pair.first, pair.second);
00027 }
00028 
00029 osl::record::CheckDuplicate::DUPLICATE_RESULT osl::record::
00030 CheckDuplicate::regist(const HashKey& key, 
00031                        const PathEncoding& moves)
00032 {
00033   ++regist_counter;
00034 
00035   vector<PathEncoding>& rs = keys[key];
00036   if (rs.empty())
00037   {
00038     // not found. i.e. a new key
00039     rs.push_back(moves);
00040     return NO_DUPLICATE;
00041   }
00042   else
00043   {
00044     if (std::find(rs.begin(), rs.end(), moves)
00045         == rs.end())
00046     {
00047       // new moves
00048       ++duplicated_hash_counter;
00049       rs.push_back(moves);
00050       return HASH_DUPLICATE;
00051     }
00052     else
00053     {
00054       // hit 
00055       ++duplicated_moves_counter;
00056       return MOVES_DUPLICATE;
00057     }
00058   }
00059 }
00060 
00061 void osl::record::
00062 CheckDuplicate::print(std::ostream& out) const
00063 {
00064   out << boost::format("Trials %d, Unique %d, Duplicates Hash %d, Duplicated moves %d\n")
00065     % regist_counter 
00066     % keys.size() 
00067     % duplicated_hash_counter 
00068     % duplicated_moves_counter;
00069 }
00070 
00071 // ;;; Local Variables:
00072 // ;;; mode:c++
00073 // ;;; c-basic-offset:2
00074 // ;;; End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines