00001
00002
00003 #include "osl/eval/ppair/piecePairPieceEval.h"
00004 #include "osl/eval/ppair/piecePairRawEval.h"
00005 #include "osl/eval/endgame/attackDefense.h"
00006 #include "osl/eval/endgame/attackKing.h"
00007 #include "osl/eval/endgame/defenseKing.h"
00008 #include "osl/eval/endgame/kingPieceValues.h"
00009 #include "osl/eval/progressEval.h"
00010 #include "osl/container/pieceValues.h"
00011 #include "osl/record/csaRecord.h"
00012 #include "osl/state/numEffectState.h"
00013 #include "osl/apply_move/applyMove.h"
00014 #include "osl/oslConfig.h"
00015 #include <stdexcept>
00016 #include <iostream>
00017 #include <iomanip>
00018 #include <cstdlib>
00019 #include <cstdio>
00020 #include <unistd.h>
00021
00022 using namespace osl;
00023 using namespace osl::eval;
00024 using namespace osl::eval::endgame;
00025
00026 void usage(const char *prog)
00027 {
00028 using namespace std;
00029 cerr << "Usage: " << prog << " [-a] [-t raw|piece|attack|defense|endgame|progress] [-f pair-file-name] csa-filename"
00030 << endl;
00031 exit(1);
00032 }
00033
00034 void show(const char *filename, const std::string&);
00035
00036 bool show_all_states = false;
00037 int main(int argc, char **argv)
00038 {
00039 const char *program_name = argv[0];
00040 bool error_flag = false;
00041
00042 std::string table_filename
00043 = OslConfig::home() + "/data/sibling-attack.pair";
00044 std::string eval_type = "piece";
00045
00046 extern char *optarg;
00047 extern int optind;
00048 char c;
00049 while ((c = getopt(argc, argv, "at:f:vh")) != EOF)
00050 {
00051 switch(c)
00052 {
00053 case 'a': show_all_states = true;
00054 break;
00055 case 'f': table_filename = optarg;
00056 break;
00057 case 't': eval_type = optarg;
00058 break;
00059 default: error_flag = true;
00060 }
00061 }
00062 argc -= optind;
00063 argv += optind;
00064
00065 if (error_flag)
00066 usage(program_name);
00067
00068 PiecePairPieceTable::Table.setUp(table_filename.c_str());
00069
00070 for (int i=0; i<argc; ++i)
00071 {
00072 show(argv[i], eval_type);
00073 }
00074 }
00075
00076 void show(const SimpleState& state, const std::string& eval_type)
00077 {
00078 std::cout << state;
00079 const progress::Effect5x3 progress((NumEffectState(state)));
00080 std::cout << "black " << progress.progress16(BLACK).value()
00081 << " white " << progress.progress16(WHITE).value()
00082 << " average " << progress.progress16().value()
00083 << "\n";
00084 PieceValues values;
00085 if (eval_type == "progress")
00086 ProgressEval::setValues(state, values);
00087 else if (eval_type == "endgame")
00088 AttackDefense::setValues(state, values);
00089 else if (eval_type == "attack")
00090 KingPieceValues<AttackKing>::setValues(state, values);
00091 else if (eval_type == "defense")
00092 KingPieceValues<DefenseKing>::setValues(state, values);
00093 else if (eval_type == "piece")
00094 PiecePairPieceEval::setValues(state, values);
00095 else if (eval_type == "raw")
00096 PiecePairRawEval::setValues(state, values);
00097 else
00098 throw std::runtime_error("unknown function type "+eval_type);
00099 values.showValues(std::cout, state);
00100 }
00101
00102 void show(const char *filename, const std::string& eval_type)
00103 {
00104 CsaFile file(filename);
00105 const vector<osl::Move> moves = file.getRecord().getMoves();
00106 NumEffectState state(file.getInitialState());
00107 for (unsigned int i=0; i<moves.size(); i++)
00108 {
00109 if (show_all_states)
00110 show(state, eval_type);
00111 const Move m = moves[i];
00112 ApplyMoveOfTurn::doMove(state, m);
00113 }
00114 show(state, eval_type);
00115 }
00116
00117
00118
00119
00120
00121