00001 #include "openingBookConverter.h"
00002
00003 #include "osl/state/simpleState.h"
00004 #include "osl/apply_move/applyMove.h"
00005 #include "osl/stl/vector.h"
00006 #include "osl/record/compactBoard.h"
00007 #include "osl/record/record.h"
00008 #include <iostream>
00009
00010 OpeningBookConverter::OpeningBookConverter(const char *filename)
00011 {
00012 std::ifstream ifs(filename);
00013 int nStates = osl::record::readInt(ifs);
00014 states.reserve(nStates);
00015 for (int i = 0 ; i < nStates; i++)
00016 {
00017 int blackWin = osl::record::readInt(ifs);
00018 int whiteWin = osl::record::readInt(ifs);
00019 int nMove = osl::record::readInt(ifs);
00020 int index = osl::record::readInt(ifs);
00021 states.push_back(OBState(index, nMove, blackWin, whiteWin));
00022 }
00023 while (true)
00024 {
00025 osl::Move move=osl::Move::makeDirect(osl::record::readInt(ifs));
00026 int stateIndex=osl::record::readInt(ifs);
00027 if (!ifs)
00028 break;
00029 moves.push_back(osl::record::opening::OBMove(move,stateIndex));
00030 }
00031 }
00032
00033 void
00034 OpeningBookConverter::write(const char* filename)
00035 {
00036 std::ofstream ofs(filename);
00037 osl::record::writeInt(ofs, states.size());
00038 for (osl::vector<OBState>::const_iterator it = states.begin();
00039 it != states.end(); ++it)
00040 {
00041 osl::record::writeInt(ofs, it->getOBMoveIndex());
00042 osl::record::writeInt(ofs, it->getNOBMove());
00043 osl::record::writeInt(ofs, it->getBlackWinCount());
00044 osl::record::writeInt(ofs, it->getWhiteWinCount());
00045 }
00046 for (osl::vector<osl::record::opening::OBMove>::const_iterator it = moves.begin();
00047 it != moves.end(); ++it)
00048 {
00049 osl::record::writeInt(ofs, it->getMove().intValue());
00050 osl::record::writeInt(ofs, it->getStateIndex());
00051 }
00052 }
00053
00054 void
00055 OpeningBookConverter::writeInNewFormat(std::ofstream& ofs)
00056 {
00057 osl::vector<int> weights(moves.size());
00058 osl::record::writeInt(ofs, 1);
00059 osl::record::writeInt(ofs, states.size());
00060 osl::record::writeInt(ofs, moves.size());
00061 osl::record::writeInt(ofs, 0);
00062 for (osl::vector<OBState>::const_iterator it = states.begin();
00063 it != states.end(); ++it)
00064 {
00065 osl::record::writeInt(ofs, it->getOBMoveIndex());
00066 osl::record::writeInt(ofs, it->getNOBMove());
00067 int total_wins = 0;
00068 osl::vector<int> wins;
00069 wins.reserve(it->getNOBMove());
00070 for (int i = 0; i < it->getNOBMove(); i++)
00071 {
00072 const osl::record::opening::OBMove& move
00073 = moves.at(i + it->getOBMoveIndex());
00074
00075 const OBState& state = states.at(move.getStateIndex());
00076 if (move.getMove().player() == osl::BLACK)
00077 wins.push_back(state.getBlackWinCount());
00078 else
00079 wins.push_back(state.getWhiteWinCount());
00080
00081 total_wins += wins.at(i);
00082 }
00083 for (int i = 0; i < it->getNOBMove(); i++)
00084 {
00085 if (total_wins != 0)
00086 weights.at(i + it->getOBMoveIndex()) = (wins.at(i) * 10000 / total_wins);
00087 else
00088 weights.at(i + it->getOBMoveIndex()) = 0;
00089 }
00090 osl::record::writeInt(ofs, it->getBlackWinCount());
00091 osl::record::writeInt(ofs, it->getWhiteWinCount());
00092 }
00093 int i = 0;
00094 for (osl::vector<osl::record::opening::OBMove>::const_iterator it = moves.begin();
00095 it != moves.end(); ++it, ++i)
00096 {
00097 osl::record::opening::WMove wmove(it->getMove(),
00098 it->getStateIndex(),
00099 weights.at(i));
00100 ofs << wmove;
00101 }
00102 }
00103
00104 void
00105 OpeningBookConverter::writeInNewFormat(const char* filename)
00106 {
00107 std::ofstream ofs(filename);
00108 writeInNewFormat(ofs);
00109 }
00110
00111 void
00112 OpeningBookConverter::writeInNewEditFormat(const char* filename)
00113 {
00114 std::ofstream ofs(filename);
00115 writeInNewFormat(ofs);
00116 osl::vector<osl::SimpleState> simpleStates(states.size());
00117 osl::vector<bool> visited(states.size());
00118 osl::vector<int> toTraceIndex;
00119
00120 for (unsigned int i = 0; i < states.size(); i++)
00121 visited[i] = false;
00122
00123 assert(states.size() >= 1);
00124
00125
00126 toTraceIndex.push_back(0);
00127 simpleStates[0] = osl::SimpleState(osl::HIRATE);
00128 visited[0] = true;
00129
00130 while (!toTraceIndex.empty())
00131 {
00132 const int index = toTraceIndex.back();
00133 toTraceIndex.pop_back();
00134 const OBState& s = states.at(index);
00135 const int moveIndex = s.getOBMoveIndex();
00136 for (int i = 0; i < s.getNOBMove(); i++)
00137 {
00138 const osl::record::opening::OBMove& m = moves.at(moveIndex + i);
00139 const int nextState = m.getStateIndex();
00140 if (!visited[nextState])
00141 {
00142 toTraceIndex.push_back(nextState);
00143 osl::SimpleState newState(simpleStates[index]);
00144 osl::ApplyMoveOfTurn::doMove(newState, m.getMove());
00145 simpleStates[nextState] = newState;
00146 visited[nextState] = true;
00147 }
00148 }
00149 }
00150 for (unsigned int i = 0; i < states.size(); i++)
00151 {
00152 osl::record::CompactBoard board(simpleStates[i]);
00153 ofs << board;
00154 }
00155 }
00156
00157
00158
00159