BookBuilderCommands.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #ifndef BOOKBUILDERCOMMANDS_HPP
00007 #define BOOKBUILDERCOMMANDS_HPP
00008
00009 #include "BookBuilder.hpp"
00010 #include "BookCommands.hpp"
00011 #include "HexHtpEngine.hpp"
00012
00013 _BEGIN_BENZENE_NAMESPACE_
00014
00015
00016
00017
00018 template<class PLAYER>
00019 class BookBuilderCommands : public BookCommands
00020 {
00021 public:
00022 BookBuilderCommands(Game& game, HexEnvironment& env,
00023 boost::scoped_ptr<Book>& book,
00024 BookCheck& bookCheck, PLAYER& player);
00025
00026 ~BookBuilderCommands();
00027
00028 void Register(GtpEngine& engine);
00029
00030 private:
00031
00032 BookBuilder<PLAYER> m_bookBuilder;
00033
00034 typedef BookBuilderCommands<PLAYER> BookBuilderType;
00035 void Register(GtpEngine& engine, const std::string& command,
00036 typename GtpCallback<BookBuilderType>::Method method);
00037
00038 void CmdBookPriorities(HtpCommand& cmd);
00039 void CmdBookExpand(HtpCommand& cmd);
00040 void CmdBookRefresh(HtpCommand& cmd);
00041 void CmdBookIncreaseWidth(HtpCommand& cmd);
00042 void CmdParamBookBuilder(HtpCommand& cmd);
00043 };
00044
00045
00046
00047 template<class PLAYER>
00048 BookBuilderCommands<PLAYER>::BookBuilderCommands(Game& game,
00049 HexEnvironment& env,
00050 boost::scoped_ptr<Book>& book,
00051 BookCheck& bookCheck,
00052 PLAYER& player)
00053 : BookCommands(game, env, book, bookCheck),
00054 m_bookBuilder(player)
00055 {
00056 }
00057
00058 template<class PLAYER>
00059 BookBuilderCommands<PLAYER>::~BookBuilderCommands()
00060 {
00061 }
00062
00063 template<class PLAYER>
00064 void BookBuilderCommands<PLAYER>::Register(GtpEngine& e)
00065 {
00066 BookCommands::Register(e);
00067 Register(e, "book-expand", &BookBuilderCommands<PLAYER>::CmdBookExpand);
00068 Register(e, "book-priorities",
00069 &BookBuilderCommands<PLAYER>::CmdBookPriorities);
00070 Register(e, "book-refresh", &BookBuilderCommands<PLAYER>::CmdBookRefresh);
00071 Register(e, "book-increase-width",
00072 &BookBuilderCommands<PLAYER>::CmdBookIncreaseWidth);
00073 Register(e, "param_book_builder",
00074 &BookBuilderCommands<PLAYER>::CmdParamBookBuilder);
00075 }
00076
00077 template<class PLAYER>
00078 void BookBuilderCommands<PLAYER>::Register(GtpEngine& engine,
00079 const std::string& command,
00080 typename GtpCallback<BookBuilderType>::Method method)
00081 {
00082 engine.Register(command, new GtpCallback<BookBuilderType>(this, method));
00083 }
00084
00085
00086
00087 template<class PLAYER>
00088 void BookBuilderCommands<PLAYER>::CmdParamBookBuilder(HtpCommand& cmd)
00089 {
00090 if (cmd.NuArg() == 0)
00091 {
00092 cmd << '\n'
00093 << "[bool] use_widening "
00094 << m_bookBuilder.UseWidening() << '\n'
00095 << "[bool] use_ice "
00096 << m_bookBuilder.UseICE() << '\n'
00097 << "[string] alpha "
00098 << m_bookBuilder.Alpha() << '\n'
00099 << "[string] expand_width "
00100 << m_bookBuilder.ExpandWidth() << '\n'
00101 << "[string] expand_threshold "
00102 << m_bookBuilder.ExpandThreshold() << '\n'
00103 << "[string] num_threads "
00104 << m_bookBuilder.NumThreads() << '\n';
00105 }
00106 else if (cmd.NuArg() == 2)
00107 {
00108 std::string name = cmd.Arg(0);
00109 if (name == "alpha")
00110 m_bookBuilder.SetAlpha(cmd.FloatArg(1));
00111 else if (name == "expand_width")
00112 m_bookBuilder.SetExpandWidth(cmd.SizeTypeArg(1, 1));
00113 else if (name == "expand_threshold")
00114 m_bookBuilder.SetExpandThreshold(cmd.SizeTypeArg(1, 1));
00115 else if (name == "num_threads")
00116 m_bookBuilder.SetNumThreads(cmd.SizeTypeArg(1));
00117 else if (name == "use_ice")
00118 m_bookBuilder.SetUseICE(cmd.BoolArg(1));
00119 else if (name == "use_widening")
00120 m_bookBuilder.SetUseWidening(cmd.BoolArg(1));
00121 else
00122 throw HtpFailure() << "unknown parameter: " << name;
00123 }
00124 else
00125 throw HtpFailure("Expected 0 or 2 arguments.");
00126 }
00127
00128
00129
00130
00131 template<class PLAYER>
00132 void BookBuilderCommands<PLAYER>::CmdBookExpand(HtpCommand& cmd)
00133 {
00134 if (m_book.get() == 0)
00135 throw HtpFailure() << "No open book.";
00136 cmd.CheckNuArg(1);
00137 int iterations = cmd.IntArg(0, 1);
00138 HexState state(m_game.Board(), m_game.Board().WhoseTurn());
00139 HexBoard& brd = m_env.SyncBoard(m_game.Board());
00140 m_bookBuilder.SetState(*m_book, state);
00141 m_bookBuilder.SetWorkBoard(brd);
00142 m_bookBuilder.Expand(iterations);
00143 }
00144
00145
00146 template<class PLAYER>
00147 void BookBuilderCommands<PLAYER>::CmdBookRefresh(HtpCommand& cmd)
00148 {
00149 UNUSED(cmd);
00150 if (m_book.get() == 0)
00151 throw HtpFailure() << "No open book.";
00152 HexState state(m_game.Board(), m_game.Board().WhoseTurn());
00153 HexBoard& brd = m_env.SyncBoard(m_game.Board());
00154 m_bookBuilder.SetState(*m_book, state);
00155 m_bookBuilder.SetWorkBoard(brd);
00156 m_bookBuilder.Refresh();
00157 }
00158
00159
00160
00161 template<class PLAYER>
00162 void BookBuilderCommands<PLAYER>::CmdBookIncreaseWidth(HtpCommand& cmd)
00163 {
00164 UNUSED(cmd);
00165 if (m_book.get() == 0)
00166 throw HtpFailure() << "No open book.";
00167 HexState state(m_game.Board(), m_game.Board().WhoseTurn());
00168 HexBoard& brd = m_env.SyncBoard(m_game.Board());
00169 m_bookBuilder.SetState(*m_book, state);
00170 m_bookBuilder.SetWorkBoard(brd);
00171 m_bookBuilder.IncreaseWidth();
00172 }
00173
00174 template<class PLAYER>
00175 void BookBuilderCommands<PLAYER>::CmdBookPriorities(HtpCommand& cmd)
00176 {
00177 if (m_book.get() == 0)
00178 throw HtpFailure() << "No open book.";
00179 HexState state(m_game.Board(), m_game.Board().WhoseTurn());
00180 HexBookNode parent;
00181 if (!m_book->Get(state, parent))
00182 return;
00183 for (BitsetIterator p(state.Position().GetEmpty()); p; ++p)
00184 {
00185 state.PlayMove(*p);
00186 HexBookNode succ;
00187 if (m_book->Get(state, succ))
00188 {
00189 cmd << " " << *p;
00190 float priority = m_bookBuilder.ComputePriority(parent,
00191 succ.m_value,
00192 succ.m_priority);
00193 float value = BookUtil::InverseEval(succ.m_value);
00194 if (HexEvalUtil::IsWin(value))
00195 cmd << " W";
00196 else if (HexEvalUtil::IsLoss(value))
00197 cmd << " L";
00198 else
00199 cmd << " " << std::fixed << std::setprecision(1) << priority;
00200 }
00201 state.UndoMove(*p);
00202 }
00203 }
00204
00205
00206
00207 _END_BENZENE_NAMESPACE_
00208
00209 #endif // BOOKBUILDERCOMMANDS_HPP