00001
00002
00003 #include "osl/eval/ml/openMidEndingEval.h"
00004 #include "osl/progress/ml/newProgress.h"
00005 #include "osl/record/csaRecord.h"
00006 #include "osl/container/pieceValues.h"
00007 #include "osl/state/numEffectState.h"
00008 #include "osl/apply_move/applyMove.h"
00009 #include "osl/oslConfig.h"
00010 #include "osl/pieceStand.h"
00011 #include "osl/record/kanjiPrint.h"
00012 #include <iostream>
00013 #include <iomanip>
00014 #include <cstdlib>
00015 #include <cstdio>
00016 #include <unistd.h>
00017
00018 using namespace osl;
00019 using namespace osl::eval;
00020
00021 void usage(const char *prog)
00022 {
00023 using namespace std;
00024 cerr << "Usage: " << prog << " csa-filename"
00025 << endl;
00026 exit(1);
00027 }
00028
00029 void show(const char *filename);
00030 int verbose = 0;
00031 int piece_estimate_level = 2;
00032
00033 int main(int argc, char **argv)
00034 {
00035 const char *program_name = argv[0];
00036 bool error_flag = false;
00037
00038 extern char *optarg;
00039 extern int optind;
00040 char c;
00041 while ((c = getopt(argc, argv, "e:vh")) != EOF)
00042 {
00043 switch(c)
00044 {
00045 case 'e':
00046 if (atoi(optarg) > 0)
00047 piece_estimate_level = atoi(optarg);
00048 break;
00049 default: error_flag = true;
00050 }
00051 }
00052 argc -= optind;
00053 argv += optind;
00054
00055 if (error_flag)
00056 usage(program_name);
00057
00058 eval::ml::OpenMidEndingEval::setUp();
00059 progress::ml::NewProgress::setUp();
00060
00061 for (int i=0; i<argc; ++i)
00062 {
00063 show(argv[i]);
00064 }
00065 }
00066
00067 void make1(const NumEffectState& state, const eval::ml::OpenMidEndingEval& eval, PieceValues& values)
00068 {
00069 for (int i=0; i<Piece::SIZE; ++i) {
00070 const Piece piece = state.getPieceOf(i);
00071 if (! piece.isOnBoard() || unpromote(piece.ptype()) == KING)
00072 continue;
00073 const NumEffectState removed(state.emulateCapture(piece, piece.owner()));
00074 const eval::ml::OpenMidEndingEval eval_removed(removed);
00075 values[piece.number()] = eval.value() - eval_removed.value();
00076 }
00077 }
00078
00079 void make2(const NumEffectState& state, const eval::ml::OpenMidEndingEval& eval, PieceValues& values)
00080 {
00081 CArray<int,40> count = {{ 0 }};
00082 for (int i=0; i<Piece::SIZE; ++i) {
00083 values[i] = 0;
00084 const Piece piece = state.getPieceOf(i);
00085 if (! piece.isOnBoard() || unpromote(piece.ptype()) == KING)
00086 continue;
00087 const NumEffectState removed(state.emulateCapture(piece, piece.owner()));
00088 const eval::ml::OpenMidEndingEval eval_removed(removed);
00089 for (int j=0; j<Piece::SIZE; ++j) {
00090 const Piece piece2 = state.getPieceOf(j);
00091 if (! piece2.isOnBoard() || unpromote(piece2.ptype()) == KING || i == j)
00092 continue;
00093 const NumEffectState removed2(removed.emulateCapture(piece2, piece2.owner()));
00094 const eval::ml::OpenMidEndingEval eval_removed2(removed2);
00095 values[j] += eval_removed.value() - eval_removed2.value();
00096 count[j]++;
00097 }
00098 }
00099 for (int i=0; i<Piece::SIZE; ++i)
00100 if (count[i])
00101 values[i] /= count[i];
00102 }
00103
00104 void show(const NumEffectState& state)
00105 {
00106 static const boost::shared_ptr<osl::record::KIFCharacters> characters(new osl::record::KIFCharacters());
00107 static osl::record::KanjiPrint printer(std::cout, characters);
00108 static const double scale = 200.0
00109 / eval::ml::OpenMidEndingEval::captureValue(newPtypeO(WHITE,PAWN));
00110 const eval::ml::OpenMidEndingEval eval(state);
00111 PieceValues values;
00112 if (piece_estimate_level == 1)
00113 make1(state, eval, values);
00114 else
00115 make2(state, eval, values);
00116 printer.print(state);
00117 for (int z=0; z<2; ++z) {
00118 for (size_t t=0; t<PieceStand::order.size(); ++t) {
00119 const Ptype ptype = PieceStand::order[t];
00120 bool shown = false;
00121 for (int i=Ptype_Table.getIndexMin(ptype); i<Ptype_Table.getIndexLimit(ptype); ++i) {
00122 const Piece piece = state.getPieceOf(i);
00123 if (! piece.isOnBoard() || unpromote(piece.ptype()) != ptype
00124 || piece.owner() != indexToPlayer(z))
00125 continue;
00126 if (! shown)
00127 std::cout << Ptype_Table.getCsaName(ptype);
00128 shown = true;
00129 std::cout << " (" << piece.position().x() << "," << piece.position().y()
00130 << ") " << (int)(values[piece.number()]*scale);
00131 }
00132 if (shown)
00133 std::cout << "\n";
00134 }
00135 }
00136 std::cout << "total " << (int)(eval.value()*scale)
00137 << " (progress: " << eval.progress16().value()
00138 << ", open-mid-endgame: " << eval.openingValue()
00139 << " " << eval.midgameValue()
00140 << " " << eval.endgameValue()
00141 << " )\n";
00142 }
00143
00144 void show(const char *filename)
00145 {
00146 CsaFile file(filename);
00147 const vector<osl::Move> moves = file.getRecord().getMoves();
00148 NumEffectState state(file.getInitialState());
00149 for (unsigned int i=0; i<moves.size(); i++)
00150 {
00151 show(state);
00152 const Move m = moves[i];
00153 ApplyMoveOfTurn::doMove(state, m);
00154 }
00155 show(state);
00156 }
00157
00158
00159
00160
00161
00162