00001
00002
00003
00004
00005
00006 #ifndef GOUCT_BOOKBUILDERCOMMANDS_H
00007 #define GOUCT_BOOKBUILDERCOMMANDS_H
00008
00009 #include <string>
00010 #include <typeinfo>
00011 #include "GtpEngine.h"
00012 #include "GoUctPlayoutPolicy.h"
00013 #include "GoUctGlobalSearch.h"
00014 #include "GoUctPlayer.h"
00015 #include "GoUctBookBuilder.h"
00016
00017 class GoBoard;
00018 class GoPlayer;
00019 class GoUctBoard;
00020 class GoUctSearch;
00021
00022
00023
00024 template<class PLAYER>
00025 class GoUctBookBuilderCommands
00026 {
00027 public:
00028
00029
00030
00031
00032
00033
00034
00035 GoUctBookBuilderCommands(GoBoard& bd, GoPlayer*& player,
00036 boost::scoped_ptr<GoAutoBook>& book);
00037
00038 void AddGoGuiAnalyzeCommands(GtpCommand& cmd);
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 void CmdOpen(GtpCommand& cmd);
00053 void CmdClose(GtpCommand& cmd);
00054 void CmdExpand(GtpCommand& cmd);
00055 void CmdRefresh(GtpCommand& cmd);
00056 void CmdParam(GtpCommand& cmd);
00057 void CmdScores(GtpCommand& cmd);
00058 void CmdCounts(GtpCommand& cmd);
00059 void CmdPriority(GtpCommand& cmd);
00060
00061
00062 void Register(GtpEngine& engine);
00063
00064 private:
00065 GoBoard& m_bd;
00066
00067 GoPlayer*& m_player;
00068
00069 boost::scoped_ptr<GoAutoBook>& m_book;
00070
00071 GoUctBookBuilder<PLAYER> m_bookBuilder;
00072
00073 PLAYER& Player();
00074
00075 void Register(GtpEngine& e, const std::string& command,
00076 typename GtpCallback<GoUctBookBuilderCommands>::Method method);
00077
00078 void ShowInfluence(GtpCommand& cmd, GoAutoBookState& state);
00079 };
00080
00081
00082
00083 template<class PLAYER>
00084 GoUctBookBuilderCommands<PLAYER>
00085 ::GoUctBookBuilderCommands(GoBoard& bd, GoPlayer*& player,
00086 boost::scoped_ptr<GoAutoBook>& book)
00087 : m_bd(bd),
00088 m_player(player),
00089 m_book(book),
00090 m_bookBuilder(bd)
00091 {
00092 }
00093
00094 template<class PLAYER>
00095 void GoUctBookBuilderCommands<PLAYER>::AddGoGuiAnalyzeCommands(GtpCommand& cmd)
00096 {
00097 cmd <<
00098 "none/AutoBook Close/autobook_close\n"
00099 "none/AutoBook Expand/autobook_expand\n"
00100 "none/AutoBook Open/autobook_open %r\n"
00101 "param/AutoBook Param/autobook_param\n"
00102 "none/AutoBook Refresh/autobook_refresh\n"
00103 "gfx/AutoBook Scores/autobook_scores\n"
00104 "gfx/AutoBook Counts/autobook_counts\n"
00105 "gfx/AutoBook Priority/autobook_priority\n";
00106 }
00107
00108 template<class PLAYER>
00109 void GoUctBookBuilderCommands<PLAYER>::Register(GtpEngine& e)
00110 {
00111 Register(e, "autobook_close", &GoUctBookBuilderCommands<PLAYER>::CmdClose);
00112 Register(e, "autobook_counts",
00113 &GoUctBookBuilderCommands<PLAYER>::CmdCounts);
00114 Register(e, "autobook_expand",
00115 &GoUctBookBuilderCommands<PLAYER>::CmdExpand);
00116 Register(e, "autobook_open", &GoUctBookBuilderCommands<PLAYER>::CmdOpen);
00117 Register(e, "autobook_param", &GoUctBookBuilderCommands<PLAYER>::CmdParam);
00118 Register(e, "autobook_priority",
00119 &GoUctBookBuilderCommands<PLAYER>::CmdPriority);
00120 Register(e, "autobook_refresh",
00121 &GoUctBookBuilderCommands<PLAYER>::CmdRefresh);
00122 Register(e, "autobook_scores",
00123 &GoUctBookBuilderCommands<PLAYER>::CmdScores);
00124 }
00125
00126 template<class PLAYER>
00127 void GoUctBookBuilderCommands<PLAYER>::
00128 Register(GtpEngine& engine, const std::string& command,
00129 typename GtpCallback<GoUctBookBuilderCommands>::Method method)
00130 {
00131 engine.Register(command,
00132 new GtpCallback<GoUctBookBuilderCommands>(this, method));
00133 }
00134
00135 template<class PLAYER>
00136 PLAYER& GoUctBookBuilderCommands<PLAYER>::Player()
00137 {
00138 if (m_player == 0)
00139 throw GtpFailure("player not GoUctPlayer");
00140 try
00141 {
00142 return dynamic_cast<PLAYER&>(*m_player);
00143 }
00144 catch (const std::bad_cast&)
00145 {
00146 throw GtpFailure("player not of right type!");
00147 }
00148 }
00149
00150
00151
00152 template<class PLAYER>
00153 void GoUctBookBuilderCommands<PLAYER>::ShowInfluence(GtpCommand& cmd,
00154 GoAutoBookState& state)
00155 {
00156 cmd << "INFLUENCE ";
00157 for (GoBoard::Iterator it(m_bd); it; ++it)
00158 {
00159 if (m_bd.IsLegal(*it))
00160 {
00161 state.Play(*it);
00162 SgBookNode node;
00163 if (m_book->Get(state, node))
00164 {
00165 float value
00166 = m_bookBuilder.InverseEval(m_bookBuilder.Value(node));
00167 float scaledValue = (value * 2 - 1);
00168 if (m_bd.ToPlay() != SG_BLACK)
00169 scaledValue *= -1;
00170 cmd << ' ' << SgWritePoint(*it) << ' ' << scaledValue;
00171 }
00172 state.Undo();
00173 }
00174 }
00175 }
00176
00177
00178
00179 template<class PLAYER>
00180 void GoUctBookBuilderCommands<PLAYER>::CmdOpen(GtpCommand& cmd)
00181 {
00182 cmd.CheckNuArg(1);
00183 m_book.reset(new GoAutoBook(cmd.Arg(0)));
00184 }
00185
00186 template<class PLAYER>
00187 void GoUctBookBuilderCommands<PLAYER>::CmdClose(GtpCommand& cmd)
00188 {
00189 cmd.CheckArgNone();
00190 m_book.reset(0);
00191 }
00192
00193 template<class PLAYER>
00194 void GoUctBookBuilderCommands<PLAYER>::CmdExpand(GtpCommand& cmd)
00195 {
00196 if (m_book.get() == 0)
00197 throw GtpFailure() << "No opened autobook!\n";
00198 cmd.CheckNuArg(1);
00199 int numExpansions = cmd.IntArg(0, 1);
00200 m_bookBuilder.SetPlayer(Player());
00201 m_bookBuilder.SetState(*m_book);
00202 m_bookBuilder.Expand(numExpansions);
00203 }
00204
00205 template<class PLAYER>
00206 void GoUctBookBuilderCommands<PLAYER>::CmdRefresh(GtpCommand& cmd)
00207 {
00208 if (m_book.get() == 0)
00209 throw GtpFailure() << "No opened autobook!\n";
00210 cmd.CheckArgNone();
00211 m_bookBuilder.SetPlayer(Player());
00212 m_bookBuilder.SetState(*m_book);
00213 m_bookBuilder.Refresh();
00214 }
00215
00216 template<class PLAYER>
00217 void GoUctBookBuilderCommands<PLAYER>::CmdParam(GtpCommand& cmd)
00218 {
00219 if (cmd.NuArg() == 0)
00220 {
00221 cmd << "[bool] use_widening " << m_bookBuilder.UseWidening() << '\n'
00222 << "[string] alpha " << m_bookBuilder.Alpha() << '\n'
00223 << "[string] expand_width " << m_bookBuilder.ExpandWidth() << '\n'
00224 << "[string] expand_threshold "
00225 << m_bookBuilder.ExpandThreshold() << '\n'
00226 << "[string] num_threads " << m_bookBuilder.NumThreads() << '\n'
00227 << "[string] num_games_per_evaluation "
00228 << m_bookBuilder.NumGamesPerEvaluation() << '\n'
00229 << "[string] num_games_per_sort "
00230 << m_bookBuilder.NumGamesPerSort() << '\n';
00231 }
00232 else if (cmd.NuArg() == 2)
00233 {
00234 std::string name = cmd.Arg(0);
00235 if (name == "num_threads")
00236 m_bookBuilder.SetNumThreads(cmd.IntArg(1, 1));
00237 else if (name == "num_games_per_evaluation")
00238 m_bookBuilder.SetNumGamesPerEvaluation(cmd.SizeTypeArg(1, 1));
00239 else if (name == "num_games_per_sort")
00240 m_bookBuilder.SetNumGamesPerSort(cmd.SizeTypeArg(1, 1));
00241 else if (name == "use_widening")
00242 m_bookBuilder.SetUseWidening(cmd.BoolArg(1));
00243 else if (name == "expand_width")
00244 m_bookBuilder.SetExpandWidth(cmd.IntArg(1, 1));
00245 else if (name == "expand_threshold")
00246 m_bookBuilder.SetExpandThreshold(cmd.IntArg(1, 1));
00247 else if (name == "alpha")
00248 {
00249 float alpha = cmd.FloatArg(1);
00250 if (alpha < 0)
00251 throw GtpFailure("Alpha must be greater than 0!");
00252 m_bookBuilder.SetAlpha(alpha);
00253 }
00254 }
00255 else
00256 throw GtpFailure() << "Expected 0 or 2 arguments!\n";
00257 }
00258
00259 template<class PLAYER>
00260 void GoUctBookBuilderCommands<PLAYER>::CmdScores(GtpCommand& cmd)
00261 {
00262 if (m_book.get() == 0)
00263 throw GtpFailure() << "No opened autobook!\n";
00264 cmd.CheckArgNone();
00265 GoAutoBookState state(m_bd);
00266 state.Synchronize();
00267 ShowInfluence(cmd, state);
00268 cmd << "\nLABEL ";
00269 for (GoBoard::Iterator it(m_bd); it; ++it)
00270 {
00271 if (m_bd.IsLegal(*it))
00272 {
00273 state.Play(*it);
00274 SgBookNode node;
00275 if (m_book->Get(state, node))
00276 {
00277 float value
00278 = m_bookBuilder.InverseEval(m_bookBuilder.Value(node));
00279 cmd << ' ' << SgWritePoint(*it)
00280 << ' ' << std::fixed << std::setprecision(3) << value;
00281 }
00282 state.Undo();
00283 }
00284 }
00285 cmd << '\n';
00286 }
00287
00288 template<class PLAYER>
00289 void GoUctBookBuilderCommands<PLAYER>::CmdCounts(GtpCommand& cmd)
00290 {
00291 if (m_book.get() == 0)
00292 throw GtpFailure() << "No opened autobook!\n";
00293 cmd.CheckArgNone();
00294 GoAutoBookState state(m_bd);
00295 state.Synchronize();
00296 ShowInfluence(cmd, state);
00297 cmd << "\nLABEL ";
00298 for (GoBoard::Iterator it(m_bd); it; ++it)
00299 {
00300 if (m_bd.IsLegal(*it))
00301 {
00302 state.Play(*it);
00303 SgBookNode node;
00304 if (m_book->Get(state, node))
00305 cmd << ' ' << SgWritePoint(*it) << ' ' << node.m_count;
00306 state.Undo();
00307 }
00308 }
00309 cmd << '\n';
00310 }
00311
00312 template<class PLAYER>
00313 void GoUctBookBuilderCommands<PLAYER>::CmdPriority(GtpCommand& cmd)
00314 {
00315 if (m_book.get() == 0)
00316 throw GtpFailure() << "No opened autobook!\n";
00317 cmd.CheckArgNone();
00318 GoAutoBookState state(m_bd);
00319 state.Synchronize();
00320 SgBookNode parent;
00321 if (!m_book->Get(state, parent))
00322 throw GtpFailure("Current state not in book!");
00323 ShowInfluence(cmd, state);
00324 cmd << "\nLABEL ";
00325 for (GoBoard::Iterator it(m_bd); it; ++it)
00326 {
00327 if (m_bd.IsLegal(*it))
00328 {
00329 state.Play(*it);
00330 SgBookNode child;
00331 if (m_book->Get(state, child))
00332 {
00333 float priority = m_bookBuilder.ComputePriority
00334 (parent, child.m_value, child.m_priority);
00335 cmd << ' ' << SgWritePoint(*it) << ' '
00336 << std::fixed << std::setprecision(1) << priority;
00337 }
00338 state.Undo();
00339 }
00340 }
00341 cmd << '\n';
00342 }
00343
00344
00345
00346 #endif // GOUCT_BOOKBUILDERCOMMANDS_H