00001
00002
00003 #include "osl/checkmate/analyzer/showAllTree.h"
00004 #include "osl/checkmate/analyzer/treeWriter.h"
00005 #include "osl/checkmate/analyzer/recordSet.h"
00006 #include "osl/checkmate/checkHashRecord.h"
00007 #include "osl/checkmate/sameBoardList.h"
00008 #include "osl/container/moveVector.h"
00009 #include <map>
00010
00011 namespace osl
00012 {
00013 namespace checkmate
00014 {
00015 typedef std::multimap<int, const CheckMove*> CheckMoveMap;
00016 }
00017 }
00018
00019 osl::checkmate::analyzer::
00020 ShowAllTree::ShowAllTree(std::ostream& o, int m, bool e, bool s)
00021 : os(o), maxDepth(m), expandFinalState(e), showTerminalMoves(s)
00022 {
00023 os << "// ShowAllTree::config " << m << " " << e << " " << s << "\n";
00024 }
00025
00026 bool osl::checkmate::analyzer::
00027 ShowAllTree::isTerminal(const CheckHashRecord *record)
00028 {
00029 return (! record)
00030 || (record->needMoveGeneration()
00031 #if 0
00032 && record->twins.empty()
00033 #endif
00034 && ((!record->sameBoards) || (record->sameBoards->size() == 1)))
00035 ;
00036 }
00037
00038 void osl::checkmate::analyzer::
00039 ShowAllTree::showOutline(const CheckHashRecord *record) const
00040 {
00041 TreeStreamWriter writer(&os, false);
00042 show(writer, record);
00043 }
00044
00045 void osl::checkmate::analyzer::
00046 ShowAllTree::showDot(const CheckHashRecord *record, size_t threshold) const
00047 {
00048 DotWriter writer(os, threshold);
00049 show(writer, record);
00050 }
00051
00052 void osl::checkmate::analyzer::
00053 ShowAllTree::show(TreeWriter& writer, const CheckHashRecord *record) const
00054 {
00055 RecordSet visited;
00056 writer.incDepth();
00057 if (! record)
00058 {
00059 writer.writeln("null tree");
00060 }
00061 else
00062 {
00063 writer.showRecord(record);
00064 show(record, writer, visited);
00065 }
00066 writer.decDepth();
00067 }
00068
00069 void osl::checkmate::analyzer::
00070 ShowAllTree::show(const CheckHashRecord *record,
00071 TreeWriter& writer, RecordSet& visited) const
00072 {
00073 if (! visited.insert(record).second)
00074 {
00075 writer.writeln("(confluence)");
00076 if (! record->isConfluence)
00077 writer.writeln(" not recognized !!");
00078 return;
00079 }
00080 if ((! expandFinalState)
00081 && (record->proofDisproof().isFinal()
00082 || (! record->twins.empty())))
00083 {
00084
00085 return;
00086 }
00087 writer.incDepth();
00088 if (
00089 record->distance < maxDepth)
00090 {
00091
00092 if (showTerminalMoves)
00093 {
00094 MoveVector moves;
00095 for (CheckMoveList::const_iterator p=record->moves.begin();
00096 p!=record->moves.end(); ++p)
00097 {
00098 if (isTerminal(p->record))
00099 moves.push_back(p->move);
00100 }
00101 writer.showMoves(moves);
00102 }
00103
00104 CheckMoveMap m;
00105 for (CheckMoveList::const_iterator p=record->moves.begin();
00106 p!=record->moves.end(); ++p)
00107 {
00108 if (! isTerminal(p->record))
00109 m.insert(std::make_pair(p->record->proof(), &*p));
00110 }
00111 for (CheckMoveMap::const_iterator p=m.begin(); p!=m.end(); ++p)
00112 {
00113 writer.showMove(record, *p->second);
00114 show(p->second->record, writer, visited);
00115 }
00116 }
00117 writer.decDepth();
00118 }
00119
00120
00121
00122
00123
00124