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