00001
00002
00003 #include "osl/state/numEffectState.h"
00004 #include "osl/record/csa.h"
00005 #include "osl/record/csaRecord.h"
00006 #include "osl/container/moveVector.h"
00007 #include "osl/move_generator/legalMoves.h"
00008 #include "osl/move_action/store.h"
00009 #include "osl/move_generator/addEffectWithEffect.h"
00010 #include "osl/move_generator/addEffect_.h"
00011 #include "osl/search/quiescenceGenerator.tcc"
00012 #include "osl/checkmate/king8Info.h"
00013 #include "osl/apply_move/applyMove.h"
00014 #include "osl/record/csa.h"
00015 #include <boost/program_options.hpp>
00016 #include <iostream>
00017 using namespace osl;
00018
00023 int main(int argc, char **argv)
00024 {
00025 bool csa, generate_check, quiesce_check;
00026 boost::program_options::options_description command_line_options;
00027 command_line_options.add_options()
00028 ("csa",
00029 boost::program_options::value<bool>(&csa)->default_value(false),
00030 "Show legal moves in CSA format")
00031 ("input-file", boost::program_options::value< std::vector<std::string> >(),
00032 "input files in kisen format")
00033 ("generate-check",
00034 boost::program_options::value<bool>(&generate_check)->default_value(false),
00035 "generate only check moves instead of all legal moves")
00036 ("generate-quiesce-check",
00037 boost::program_options::value<bool>(&quiesce_check)->default_value(false),
00038 "generate only check moves used in quiescence search")
00039 ("help", "Show help message");
00040 boost::program_options::variables_map vm;
00041 boost::program_options::positional_options_description p;
00042 p.add("input-file", -1);
00043
00044 try
00045 {
00046 boost::program_options::store(
00047 boost::program_options::command_line_parser(
00048 argc, argv).options(command_line_options).positional(p).run(), vm);
00049 boost::program_options::notify(vm);
00050 if (vm.count("help"))
00051 {
00052 std::cerr << "Usage: " << argv[0] << " [options] CSA_FILE1 CSA_FILE2 ..."
00053 << std::endl;
00054 std::cout << command_line_options << std::endl;
00055 return 0;
00056 }
00057 }
00058 catch (std::exception &e)
00059 {
00060 std::cerr << "error in parsing options" << std::endl
00061 << e.what() << std::endl;
00062 std::cerr << "Usage: " << argv[0] << " [options] CSA_FILE1 CSA_FILE2 ..."
00063 << std::endl;
00064 std::cerr << command_line_options << std::endl;
00065 return 1;
00066 }
00067
00068 const std::vector<std::string> files =
00069 vm["input-file"].as< std::vector<std::string> >();
00070
00071 for (size_t i = 0; i < files.size(); ++i)
00072 {
00073 const Record record = CsaFile(files[i]).getRecord();
00074 NumEffectState state(record.getInitialState());
00075 const vector<Move> moves=record.getMoves();
00076 for (vector<Move>::const_iterator p=moves.begin(); p!=moves.end(); ++p)
00077 {
00078 ApplyMoveOfTurn::doMove(state, *p);
00079 }
00080 MoveVector legal_moves;
00081 if (generate_check)
00082 {
00083 move_action::Store store(legal_moves);
00084 move_generator::GenerateAddEffectWithEffect::generate<true>
00085 (state.getTurn(), state, state.getKingPiece(alt(state.getTurn())).position(), store);
00086 }
00087 else if (quiesce_check)
00088 {
00089 const checkmate::King8Info info(state.Iking8Info(state.getTurn()));
00090 if (state.getTurn() == BLACK)
00091 search::QuiescenceGenerator<BLACK>::check(state, state.pin(WHITE), legal_moves, info.libertyCount()==0);
00092 else
00093 search::QuiescenceGenerator<WHITE>::check(state, state.pin(WHITE), legal_moves, info.libertyCount()==0);
00094 }
00095 else
00096 {
00097 LegalMoves::generate(state, legal_moves);
00098 }
00099 if (i > 0)
00100 {
00101 std::cout << std::endl;
00102 }
00103 if (csa)
00104 {
00105 for (size_t i = 0; i < legal_moves.size(); ++i)
00106 {
00107 std::cout << osl::record::csa::show(legal_moves[i]) << std::endl;
00108 }
00109 }
00110 else
00111 {
00112 std::cout << legal_moves;
00113 }
00114 }
00115 }
00116
00117
00118
00119
00120
00121
00122
00123