void THierarchicalCluster::permute(const TIntList &neworder) { if ((!branches && neworder.size()) || (branches->size() != neworder.size())) raiseError("the number of clusters does not match the lenght of the permutation vector"); int *temp = new int [last - first], *t = temp; TIntList::const_iterator pi = neworder.begin(); THierarchicalClusterList::iterator bi(branches->begin()), be(branches->end()); THierarchicalClusterList newBranches; for(; bi != be; bi++, pi++) { PHierarchicalCluster branch = branches->at(*pi); newBranches.push_back(branch); TIntList::const_iterator bei(mapping->begin() + branch->first), bee(mapping->begin() + branch->last); const int offset = (t - temp) - (branch->first - first); for(; bei != bee; *t++ = *bei++); if (offset) branch->recursiveMove(offset); } TIntList::iterator bei(mapping->begin() + first), bee(mapping->begin() + last); for(t = temp; bei!=bee; *bei++ = *t++); bi = branches->begin(); THierarchicalClusterList::const_iterator nbi(newBranches.begin()); for(; bi != be; *bi++ = *nbi++); }
void TExampleForMissing::resetExample() { checkProperty(dataDescription); DCs.clear(); DKs.clear(); float averageWeight=1; TVarList::const_iterator vi(domain->attributes->begin()), vie(domain->attributes->end()); TExample::iterator ei(begin()), bei(ei); vector<float>::const_iterator ai(dataDescription->averages.begin()), aei(dataDescription->averages.end()); for(; vi!=vie; ei++, vi++) { if ((*ei).isSpecial()) { if ((*vi)->varType==TValue::FLOATVAR) *ei=TValue(*ai); else if (dataDescription->missingWeight && (*ei).isDK()) { DKs.push_back(ei-bei); averageWeight/=float((*vi)->noOfValues()); } else DCs.push_back(ei-bei); (*vi)->firstValue(*ei); } if (ai!=aei) ai++; } if (dataDescription->missingWeight) { float weight = dataDescription->originalWeight ? getMeta(dataDescription->originalWeight).floatV : 1; if (dataDescription->domainDistributions) { TDomainDistributions::const_iterator di(dataDescription->domainDistributions->begin()); ITERATE(vector<int>, ci, DKs) { // DKs contain only discrete variables, so it is safe to cast const TDiscDistribution &dist = CAST_TO_DISCDISTRIBUTION(*(di+*ci)); if (dist.abs) weight *= dist.front() / dist.abs; } }