/** * MANDATORY, decompose rectangle * * @param s set, representing rectangle to decompose * * @param sv resulting two (or more) rectangles * * @param record the incumbent value * */ virtual void branch (Set & s, GVector < Set > & sv, GVector < Solution > & solv, Solution & incumbent, BNBBranchInfo * info, InfiniInt ql) { bool rv; Set asetv[MAX_BNB_CHILDREN]; FixedVector < Set > setv(asetv, MAX_BNB_CHILDREN); rv = false; sv.push_back(s); if(!mDiscarders.empty()) { int sz = mDiscarders.size(); for(int i = 0; i < sz; i++){ if(sv.empty()) break; while(!sv.empty()) { Set s = sv.back(); sv.pop_back(); mDiscarders[i]->discard(s, setv, solv, incumbent, info); } int sz = setv.size(); for(int i = 0; i < sz; i ++) { sv.push_back(setv[i]); } setv.clear(); //sv.insert(sv.end(), setv.begin(), setv.end()); } } //TODO make selection of sets to produce solutions int sz = sv.size(); for(int i = 0; i < sz; i ++) { Solution sol; if(makeSolution(sv[i], sol)) solv.push_back(sol); } /* if(mOptions & Options::DO_LOCAL_SEARCH) { int sz = solv.size(); for(int i = 0; i < sz; i++){ improveSolution(solv[i]); } } */ }
void discard(typename Factory::Set& s, GVector<typename Factory::Set > &sv, GVector<typename Factory::Solution > &solv, FT record, BNBBranchInfo* info) { int n = s.mA.size(); int I = s.mSplitI; int m = s.mSegments.size(); if(m > 0) { for(int i = 0; i <= m; i ++) { typename Factory::Set sn(n); bool put = false; for(int j = 0; j < n; j ++) { sn.mA[j] = s.mA[j]; sn.mB[j] = s.mB[j]; } if(i == 0) { Segment<FT> seg = s.mSegments.at(i); if(s.mA[I] < seg.mA) { sn.mB[I] = seg.mA; put = true; } } else if(i == m) { Segment<FT> pseg = s.mSegments.at(i-1); if(s.mB[I] > pseg.mB) { sn.mA[I] = pseg.mB; put = true; } } else { Segment<FT> pseg = s.mSegments.at(i-1); Segment<FT> seg = s.mSegments.at(i); sn.mA[I] = pseg.mB; sn.mB[I] = seg.mA; put = true; } if(put) { sn.mSplitI = BoxUtils::getLongestEdge(sn); sv.push_back(sn); } } if(sv.size() == 1) { typename Factory::Set ss; ss = sv[0]; sv.pop_back(); split(ss, sv); } } else { split(s, sv); } if(!sv.empty()) info->mBranched ++; }
void split(const typename Factory::Set &s, GVector<typename Factory::Set > &sv) { int n = s.mA.size(); int I = s.mSplitI; FT mid = 0.5 * (s.mA[I] + s.mB[I]); typename Factory::Set sl(n), sr(n); for(int i = 0; i < n; i ++) { sl.mA[i] = sr.mA[i] = s.mA[i]; sl.mB[i] = sr.mB[i] = s.mB[i]; } sl.mB[I] = mid; sr.mA[I] = mid; sl.mSplitI = BoxUtils::getLongestEdge(sl); sr.mSplitI = BoxUtils::getLongestEdge(sr); sv.push_back(sr); sv.push_back(sl); }
//------------------------------------------------------------------------------ void CPostEffectLoader::PreLoadEffects( GVector<CPostEffectPtr>& outEffects ) { Ast(outEffects.empty()); for (TiXmlNode* node = xmlConfig->FirstChild(); node != NULL; node = node->NextSibling()) { TiXmlElement* pElement = node->ToElement(); if (pElement && pElement->ValueStr() == "PostEffect") { CPostEffectPtr effect = new CPostEffect(); string name = pElement->Attribute("name"); string reset = pElement->Attribute("reset"); effect->SetName(name); effect->SetReset("true" == reset); outEffects.push_back(effect); } } }