VCBuilder.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #ifndef VCBUILDER_HPP
00007 #define VCBUILDER_HPP
00008
00009 #include "Hex.hpp"
00010 #include "VC.hpp"
00011 #include "VCList.hpp"
00012 #include "VCSet.hpp"
00013 #include "Groups.hpp"
00014 #include "PatternState.hpp"
00015
00016 _BEGIN_BENZENE_NAMESPACE_
00017
00018
00019
00020
00021 struct VCBuilderParam
00022 {
00023
00024 int max_ors;
00025
00026
00027
00028 bool and_over_edge;
00029
00030
00031 bool use_patterns;
00032
00033
00034
00035
00036 bool use_non_edge_patterns;
00037
00038
00039
00040 bool use_greedy_union;
00041
00042
00043 bool abort_on_winning_connection;
00044
00045
00046 VCBuilderParam();
00047 };
00048
00049
00050
00051
00052
00053 struct VCBuilderStatistics
00054 {
00055
00056 int base_attempts;
00057
00058
00059 int base_successes;
00060
00061
00062 int pattern_attempts;
00063
00064
00065 int pattern_successes;
00066
00067
00068 int and_full_attempts;
00069
00070
00071 int and_full_successes;
00072
00073
00074 int and_semi_attempts;
00075
00076
00077 int and_semi_successes;
00078
00079
00080 int or_attempts;
00081
00082
00083 int or_successes;
00084
00085
00086 int doOrs;
00087
00088
00089
00090 int goodOrs;
00091
00092
00093 int shrunk0;
00094
00095
00096 int shrunk1;
00097
00098
00099 int upgraded;
00100
00101
00102 int killed0;
00103
00104
00105 int killed1;
00106
00107
00108 std::string ToString() const;
00109 };
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 class VCBuilder
00130 {
00131 public:
00132
00133
00134 VCBuilder(VCBuilderParam& param);
00135
00136
00137 ~VCBuilder();
00138
00139
00140
00141
00142 VCBuilderParam& Parameters();
00143
00144
00145 const VCBuilderParam& Parameters() const;
00146
00147
00148 VCBuilderStatistics Statistics(HexColor color) const;
00149
00150
00151 void ClearStatistics();
00152
00153
00154
00155
00156
00157 void Build(VCSet& con, const Groups& groups,
00158 const PatternState& patterns);
00159
00160
00161
00162
00163
00164
00165
00166 void Build(VCSet& cons, const Groups& oldGroups,
00167 const Groups& newGroups, const PatternState& patterns,
00168 bitset_t added[BLACK_AND_WHITE],
00169 ChangeLog<VC>* log);
00170
00171 private:
00172
00173
00174
00175
00176
00177
00178 class WorkQueue
00179 {
00180 public:
00181 WorkQueue();
00182 bool empty() const;
00183 const HexPointPair& front() const;
00184 std::size_t capacity() const;
00185
00186 void clear();
00187 void pop();
00188 void push(const HexPointPair& pair);
00189
00190 private:
00191 std::size_t m_head;
00192 std::vector<HexPointPair> m_array;
00193 bool m_seen[BITSETSIZE][BITSETSIZE];
00194 };
00195
00196
00197
00198
00199 typedef enum { CREATE_FULL, CREATE_SEMI } AndRule;
00200
00201 void doAnd(HexPoint from, HexPoint over, HexPoint to,
00202 AndRule rule, const VC& vc, const bitset_t& capturedSet,
00203 const VCList* old);
00204
00205 class OrRule
00206 {
00207 public:
00208 OrRule(const VCBuilder& builder)
00209 : m_builder(builder), m_semi(64), m_tail(64) {};
00210
00211 int operator()(const VC& vc, const VCList* semi_list,
00212 VCList* full_list, std::list<VC>& added,
00213 int max_ors, ChangeLog<VC>* log,
00214 VCBuilderStatistics& stats);
00215
00216 private:
00217 const VCBuilder& m_builder;
00218
00219
00220 std::vector<VC> m_semi;
00221 std::vector<bitset_t> m_tail;
00222 };
00223
00224 OrRule m_orRule;
00225
00226 void andClosure(const VC& vc);
00227
00228 void DoSearch();
00229
00230 void ProcessSemis(HexPoint xc, HexPoint yc);
00231
00232 void ProcessFulls(HexPoint p1, HexPoint p2);
00233
00234 bool AddNewFull(const VC& vc);
00235
00236 bool AddNewSemi(const VC& vc);
00237
00238 void LoadCapturedSetPatterns();
00239
00240 void ComputeCapturedSets(const PatternState& patterns);
00241
00242 void AddBaseVCs();
00243
00244 void AddPatternVCs();
00245
00246 void AbsorbMergeShrinkUpgrade(const bitset_t& added_black,
00247 const bitset_t& added_white);
00248
00249 void Merge(const Groups& oldGroups, bitset_t added[BLACK_AND_WHITE]);
00250
00251 void MergeAndShrink(const bitset_t& affected,
00252 const bitset_t& added);
00253
00254 void MergeAndShrink(const bitset_t& added,
00255 HexPoint xin, HexPoint yin,
00256 HexPoint xout, HexPoint yout);
00257
00258 void RemoveAllContaining(const Groups& groups, const bitset_t& bs);
00259
00260
00261
00262 VCBuilderParam& m_param;
00263
00264 WorkQueue m_queue;
00265
00266 VCBuilderStatistics m_statsForColor[BLACK_AND_WHITE];
00267
00268 VCBuilderStatistics* m_statistics;
00269
00270 const Groups* m_groups;
00271
00272 const StoneBoard* m_brd;
00273
00274 VCSet* m_con;
00275
00276 HexColor m_color;
00277
00278 ChangeLog<VC>* m_log;
00279
00280 bitset_t m_capturedSet[BITSETSIZE];
00281
00282 PatternSet m_capturedSetPatterns[BLACK_AND_WHITE];
00283
00284 HashedPatternSet m_hash_capturedSetPatterns[BLACK_AND_WHITE];
00285 };
00286
00287 inline VCBuilderParam& VCBuilder::Parameters()
00288 {
00289 return m_param;
00290 }
00291
00292 inline const VCBuilderParam& VCBuilder::Parameters() const
00293 {
00294 return m_param;
00295 }
00296
00297 inline VCBuilderStatistics VCBuilder::Statistics(HexColor color) const
00298 {
00299 return m_statsForColor[color];
00300 }
00301
00302 inline void VCBuilder::ClearStatistics()
00303 {
00304 m_statsForColor[BLACK] = VCBuilderStatistics();
00305 m_statsForColor[WHITE] = VCBuilderStatistics();
00306 }
00307
00308
00309
00310 _END_BENZENE_NAMESPACE_
00311
00312 #endif // VCBUILDER_HPP