説明を見る。00001 #include "osl/record/checkDuplicate.h"
00002 #include "osl/numEffectState.h"
00003 #include <boost/format.hpp>
00004 #include <iostream>
00005
00006 std::pair<osl::HashKey,osl::PathEncoding> osl::record::
00007 CheckDuplicate::getLastState(const std::vector<Move>& moves)
00008 {
00009 NumEffectState state;
00010 PathEncoding path(BLACK);
00011
00012 for (Move move: moves) {
00013 state.makeMove(move);
00014 path.pushMove(move);
00015 assert(state.isConsistent(true));
00016 }
00017 return std::make_pair(HashKey(state), path);
00018 }
00019
00020 osl::record::CheckDuplicate::DUPLICATE_RESULT osl::record::
00021 CheckDuplicate::regist(const std::vector<Move>& moves)
00022 {
00023 const std::pair<HashKey, PathEncoding> pair = getLastState(moves);
00024 return regist(pair.first, pair.second);
00025 }
00026
00027 osl::record::CheckDuplicate::DUPLICATE_RESULT osl::record::
00028 CheckDuplicate::regist(const HashKey& key,
00029 const PathEncoding& moves)
00030 {
00031 ++regist_counter;
00032
00033 std::vector<PathEncoding>& rs = keys[key];
00034 if (rs.empty())
00035 {
00036
00037 rs.push_back(moves);
00038 return NO_DUPLICATE;
00039 }
00040 else
00041 {
00042 if (std::find(rs.begin(), rs.end(), moves)
00043 == rs.end())
00044 {
00045
00046 ++duplicated_hash_counter;
00047 rs.push_back(moves);
00048 return HASH_DUPLICATE;
00049 }
00050 else
00051 {
00052
00053 ++duplicated_moves_counter;
00054 return MOVES_DUPLICATE;
00055 }
00056 }
00057 }
00058
00059 void osl::record::
00060 CheckDuplicate::print(std::ostream& out) const
00061 {
00062 out << boost::format("Trials %d, Unique %d, Duplicates Hash %d, Duplicated moves %d\n")
00063 % regist_counter
00064 % keys.size()
00065 % duplicated_hash_counter
00066 % duplicated_moves_counter;
00067 }
00068
00069
00070
00071
00072