void C4Network2ResChunkData::AddChunkRange(int32_t iStart, int32_t iLength) { // security if (iStart < 0 || iStart + iLength > iChunkCnt || iLength <= 0) return; // find position ChunkRange *pRange, *pPrev; for (pRange = pChunkRanges, pPrev = NULL; pRange; pPrev = pRange, pRange = pRange->Next) if (pRange->Start >= iStart) break; // create new ChunkRange *pNew = new ChunkRange; pNew->Start = iStart; pNew->Length = iLength; // add to list pNew->Next = pRange; (pPrev ? pPrev->Next : pChunkRanges) = pNew; // counts iPresentChunkCnt += iLength; iChunkRangeCnt++; // check merges if (pPrev && MergeRanges(pPrev)) while (MergeRanges(pPrev)) {} else while (MergeRanges(pNew)) {} }
void udtPatternSearchPlugIn::FinishDemoAnalysis() { if(_analyzers.GetSize() == 0) { return; } for(u32 i = 0, analyzerCount = _analyzers.GetSize(); i < analyzerCount; ++i) { _analyzers[i]->FinishAnalysis(); } // If we only have 1 analyzer, we don't need to do any sorting. if(_analyzers.GetSize() == 1) { MergeRanges(CutSections, _analyzers[0]->CutSections); return; } // // Create a list with all the cut sections. // udtVMArray<CutSection> tempCutSections(1 << 16, "CutByPatternPlugIn::FinishDemoAnalysis::TempCutSectionsArray"); for(u32 i = 0, analyzerCount = _analyzers.GetSize(); i < analyzerCount; ++i) { udtPatternSearchAnalyzerBase* const analyzer = _analyzers[i]; for(u32 j = 0, cutCount = analyzer->CutSections.GetSize(); j < cutCount; ++j) { const udtCutSection cut = _analyzers[i]->CutSections[j]; CutSection newCut; newCut.udtCutSection::operator=(cut); tempCutSections.Add(newCut); } } // // Apply sorting pass #1. // const u32 cutCount = tempCutSections.GetSize(); qsort(tempCutSections.GetStartAddress(), (size_t)cutCount, sizeof(CutSection), &SortByStartTimeAscending); // // Apply sorting pass #2, which must be stable with respect to // the sorting of pass #1. // for(u32 i = 0; i < cutCount; ++i) { tempCutSections[i].Order = (int)i; } qsort(tempCutSections.GetStartAddress(), (size_t)cutCount, sizeof(CutSection), &StableSortByGameStateIndexAscending); // // Create a new list with the sorted data using the final data format // and merge the sections if asked for it. // if((GetInfo().Flags & (u32)udtPatternSearchArgFlags::MergeCutSections) != 0) { udtVMArray<udtCutSection> cutSections(1 << 16, "CutByPatternPlugIn::FinishDemoAnalysis::MergedCutSectionsArray"); AppendCutSections(cutSections, tempCutSections); MergeRanges(CutSections, cutSections); } else { CutSections.Clear(); AppendCutSections(CutSections, tempCutSections); } }
void DecisionStump<MatType>::TrainOnAtt(const arma::rowvec& attribute, const arma::Row<size_t>& labels) { size_t i, count, begin, end; arma::rowvec sortedSplitAtt = arma::sort(attribute); arma::uvec sortedSplitIndexAtt = arma::stable_sort_index(attribute.t()); arma::Row<size_t> sortedLabels(attribute.n_elem); sortedLabels.fill(0); arma::vec tempSplit; arma::Row<size_t> tempLabel; for (i = 0; i < attribute.n_elem; i++) sortedLabels(i) = labels(sortedSplitIndexAtt(i)); arma::rowvec subCols; rType mostFreq; i = 0; count = 0; while (i < sortedLabels.n_elem) { count++; if (i == sortedLabels.n_elem - 1) { begin = i - count + 1; end = i; arma::rowvec zSubCols((sortedLabels.cols(begin, end)).n_elem); zSubCols.fill(0.0); subCols = sortedLabels.cols(begin, end) + zSubCols; mostFreq = CountMostFreq<double>(subCols); split.resize(split.n_elem + 1); split(split.n_elem - 1) = sortedSplitAtt(begin); binLabels.resize(binLabels.n_elem + 1); binLabels(binLabels.n_elem - 1) = mostFreq; i++; } else if (sortedLabels(i) != sortedLabels(i + 1)) { if (count < bucketSize) { // Test for different values of bucketSize, especially extreme cases. begin = i - count + 1; end = begin + bucketSize - 1; if (end > sortedLabels.n_elem - 1) end = sortedLabels.n_elem - 1; } else { begin = i - count + 1; end = i; } arma::rowvec zSubCols((sortedLabels.cols(begin, end)).n_elem); zSubCols.fill(0.0); subCols = sortedLabels.cols(begin, end) + zSubCols; // Find the most frequent element in subCols so as to assign a label to // the bucket of subCols. mostFreq = CountMostFreq<double>(subCols); split.resize(split.n_elem + 1); split(split.n_elem - 1) = sortedSplitAtt(begin); binLabels.resize(binLabels.n_elem + 1); binLabels(binLabels.n_elem - 1) = mostFreq; i = end + 1; count = 0; } else i++; } // Now trim the split matrix so that buckets one after the after which point // to the same classLabel are merged as one big bucket. MergeRanges(); }