00001 #ifndef OSL_MOVELOGPROB_H 00002 #define OSL_MOVELOGPROB_H 00003 00004 #include "osl/basic_type.h" 00005 #include <iosfwd> 00006 00007 namespace osl 00008 { 00009 class MoveLogProb : private Move 00010 { 00011 int log_prob; 00012 public: 00013 MoveLogProb(Move m,int l) : Move(m),log_prob(l) 00014 { 00015 assert(m.isInvalid() || m.isValidOrPass()); 00016 } 00017 MoveLogProb() : log_prob(0) {} 00018 00019 void setLogProb(int l) { log_prob=l; } 00024 void setLogProbAtLeast(int l) 00025 { 00026 if (logProb() < l) 00027 setLogProb(l); 00028 } 00033 void setLogProbAtMost(int l) 00034 { 00035 if (logProb() > l) 00036 setLogProb(l); 00037 } 00038 00039 const Move move()const{ return *this; } 00040 int logProb()const{ return log_prob; } 00041 bool validMove() const { return log_prob > 0; } 00042 00043 using Move::player; 00044 using Move::isNormal; 00045 using Move::isPass; 00046 }; 00047 std::ostream& operator<<(std::ostream& os,MoveLogProb const& move); 00048 00049 inline bool operator==(MoveLogProb const& lhs,MoveLogProb const& rhs) 00050 { 00051 return lhs.move()==rhs.move() && lhs.logProb()==rhs.logProb(); 00052 } 00053 inline bool operator<(MoveLogProb const& lhs,MoveLogProb const& rhs) 00054 { 00055 if (lhs.move() != rhs.move()) 00056 return lhs.move() < rhs.move(); 00057 return lhs.logProb() < rhs.logProb(); 00058 } 00059 00060 } // namespace ostream 00061 00062 00063 #endif /* OSL_MOVELOGPROB_H */ 00064 // ;;; Local Variables: 00065 // ;;; mode:c++ 00066 // ;;; c-basic-offset:2 00067 // ;;; End: