Index   Main   Namespaces   Classes   Hierarchy   Annotated   Files   Compound   Global   Pages  

SgProbCut.h

Go to the documentation of this file.
00001 //----------------------------------------------------------------------------
00002 /** @file SgProbCut.h
00003 
00004     Implementation of Buro's Multi-ProbCut method for use with SgSearch.
00005     See <a href="http://www.cs.ualberta.ca/~mburo/publications.html">
00006     Michael Buro's publications</a> on ProbCut and Multi-ProbCut
00007 
00008 */
00009 //----------------------------------------------------------------------------
00010 
00011 #ifndef SG_PROBCUT_H
00012 #define SG_PROBCUT_H
00013 
00014 #include "SgArray.h"
00015 #include "SgBlackWhite.h"
00016 #include "SgMove.h"
00017 #include "SgSearch.h"
00018 #include "SgStack.h"
00019 #include "SgVector.h"
00020 
00021 //----------------------------------------------------------------------------
00022 
00023 class SgProbCut
00024 {
00025 public:
00026     static const int MAX_PROBCUT = 20;
00027 
00028     SgProbCut();
00029 
00030     struct Cutoff {
00031         float a, b, sigma;
00032         int shallow, deep;
00033 
00034         Cutoff() : shallow(-1), deep(-1) {}
00035     };
00036 
00037     void AddCutoff(const Cutoff &c);
00038 
00039     bool GetCutoff(int deep, int index, Cutoff &cutoff);
00040 
00041     float GetThreshold() const;
00042 
00043     bool IsEnabled() const;
00044 
00045     bool ProbCut(SgSearch& search, int depth, int alpha, int beta, 
00046                  SgSearchStack& moveStack,
00047                  bool* isExactValue, int* value);
00048 
00049     void SetEnabled(bool flag);
00050 
00051     void SetThreshold(float t);
00052 
00053 private:
00054     float m_threshold;
00055     bool m_enabled;
00056 
00057     SgArray<SgArray<Cutoff, MAX_PROBCUT+1>, MAX_PROBCUT+1> m_cutoffs;
00058     SgArray<int, MAX_PROBCUT+1> m_cutoff_sizes;
00059 };
00060 
00061 inline SgProbCut::SgProbCut()
00062 {
00063     m_threshold = 1.0;
00064     m_enabled = false;
00065     for (int i = 0; i < MAX_PROBCUT+1; ++i) m_cutoff_sizes[i] = 0;
00066 }
00067 
00068 inline void SgProbCut::AddCutoff(const Cutoff &c)
00069 {
00070     int i = m_cutoff_sizes[c.deep];
00071     m_cutoffs[c.deep][i] = c;
00072     ++m_cutoff_sizes[c.deep];
00073 }
00074 
00075 inline bool SgProbCut::GetCutoff(int deep, int index, Cutoff &cutoff)
00076 {
00077     if (deep > MAX_PROBCUT) return false;
00078     if (index >= m_cutoff_sizes[deep]) return false;
00079     cutoff = m_cutoffs[deep][index];
00080     return true;
00081 }
00082 
00083 inline void SgProbCut::SetThreshold(float t)
00084 {
00085     m_threshold = t;
00086 }
00087 
00088 inline float SgProbCut::GetThreshold() const
00089 {
00090     return m_threshold;
00091 }
00092 
00093 inline void SgProbCut::SetEnabled(bool flag)
00094 {
00095     m_enabled = flag;
00096 }
00097 
00098 inline bool SgProbCut::IsEnabled() const
00099 {
00100     return m_enabled;
00101 }
00102 
00103 //----------------------------------------------------------------------------
00104 
00105 #endif // SG_PROBCUT_H


17 Jun 2010 Doxygen 1.4.7