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
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
00048 ++duplicated_hash_counter;
00049 rs.push_back(moves);
00050 return HASH_DUPLICATE;
00051 }
00052 else
00053 {
00054
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
00072
00073
00074