template<class SimFunc>
Definition at line 79 of file RadiusClusteror.h. References Impala::Core::Table::TableTem< Col1T, Col2T, Col3T, Col4T, Col5T, Col6T, Col7T, Col8T, Col9T >::Add(), Impala::Core::Table::TableTem< Col1T, Col2T, Col3T, Col4T, Col5T, Col6T, Col7T, Col8T, Col9T >::Get1(), Impala::Core::Table::TableTem< Col1T, Col2T, Col3T, Col4T, Col5T, Col6T, Col7T, Col8T, Col9T >::Get2(), Impala::Core::Table::TableTem< Col1T, Col2T, Col3T, Col4T, Col5T, Col6T, Col7T, Col8T, Col9T >::GetColumn2(), Impala::Core::Feature::Clusteror::GetRegionFeatureSet(), ILOG_ERROR, ILOG_VAR, Impala::Core::Feature::RadiusClusteror< SimFunc >::mAllowOverlap, Impala::Core::Feature::RadiusClusteror< SimFunc >::mAllowSlack, Impala::Core::Feature::RadiusClusteror< SimFunc >::mBuffer, Impala::Core::Feature::RadiusClusteror< SimFunc >::mCanProcess, Impala::Core::Feature::RadiusClusteror< SimFunc >::mClusterCount, Impala::Core::Feature::RadiusClusteror< SimFunc >::mClusterVec, Impala::Core::Feature::RadiusClusteror< SimFunc >::mNrConsidered, Impala::Core::Feature::RadiusClusteror< SimFunc >::mProcessEnded, Impala::Core::Feature::RadiusClusteror< SimFunc >::mRadius, Impala::Core::Feature::RadiusClusteror< SimFunc >::mSimFunc, Impala::Core::Feature::RadiusClusteror< SimFunc >::mSlack, Impala::Core::Feature::RadiusClusteror< SimFunc >::mSlackStart, Impala::Core::Vector::RadiusSimilarity(), Impala::Core::Table::RemoveRow(), and Impala::Core::Table::Table::Size(). Referenced by Impala::Core::Feature::RadiusClusteror< SimFunc >::Cluster(), and Impala::Core::Feature::RadiusClusteror< SimFunc >::FinishBuffer(). 00080 { 00081 ILOG_VAR(Impala.Core.Feature.RadiusClusteror.ProcessBuffer); 00082 if (!mCanProcess) 00083 { 00084 ILOG_ERROR("cannot process, do not call"); 00085 return; 00086 } 00087 00088 String dot = (GetRegionFeatureSet() == 0) ? ":" : "."; 00089 std::cout << dot << std::flush; 00090 00091 // find the 'best' point for a new cluster 00092 int bestPoint = -1; 00093 Real64 maxSim = -1; 00094 for (int j=0 ; j<mBuffer->Size() ; j++) 00095 { 00096 VectorReal64 vec = mBuffer->Get2(j); 00097 /* 00098 Real64 sim; 00099 if (mMode == MODE_ORG) 00100 sim = Vector::MinimumSimilarity(vec, mBuffer->GetColumn2(), 00101 mBuffer->Size(), mSimFunc); 00102 if (mMode == MODE_NEW) 00103 sim = Vector::AverageSimilarity(vec, mBuffer->GetColumn2(), 00104 mBuffer->Size(), mSimFunc); 00105 if (mMode == MODE_COUNT) 00106 sim = Vector::RadiusSimilarity(vec, mBuffer->GetColumn2(), 00107 mRadius, mBuffer->Size(), 00108 mSimFunc); 00109 */ 00110 Real64 sim = Vector::RadiusSimilarity(vec, mBuffer->GetColumn2(), 00111 mRadius / mSlack, 00112 mBuffer->Size(), mSimFunc); 00113 00114 if (sim > maxSim) 00115 { 00116 maxSim = sim; // keep the point with the largest sim 00117 bestPoint = j; 00118 } 00119 } 00120 std::cout << maxSim << dot << std::flush; 00121 if (maxSim < 2) 00122 { // no sensible candidate found in current buffer 00123 if (mAllowSlack && (mSlack < 2)) 00124 { 00125 mSlack *= 2; 00126 mSlackStart = mNrConsidered; 00127 return ProcessBuffer(); 00128 } 00129 mCanProcess = false; 00130 mProcessEnded = mNrConsidered; 00131 return; 00132 } 00133 00134 mClusterVec->Add(mBuffer->Get1(bestPoint), mBuffer->Get2(bestPoint)); 00135 00136 // remove points within range of the new cluster 00137 bool* filter = new bool[mBuffer->Size()]; 00138 VectorReal64 bestVec = mBuffer->Get2(bestPoint); 00139 int count = 0; 00140 maxSim = -1; 00141 Real64 radThres = mRadius * ((mAllowOverlap) ? 1.0 : 0.5); 00142 for (int i=0 ; i<mBuffer->Size() ; i++) 00143 { 00144 Real64 sim = mSimFunc.DoIt(bestVec, mBuffer->Get2(i)); 00145 filter[i] = (sim >= radThres); 00146 if (sim >= mRadius) 00147 count++; 00148 if (sim > maxSim) 00149 maxSim = sim; 00150 } 00151 //if (count == 0) 00152 // ILOG_INFO("Similarity too high: max = " << maxSim); 00153 Table::RemoveRow(mBuffer, filter); 00154 delete filter; 00155 00156 mClusterCount.push_back(count); 00157 }
Here is the call graph for this function:
|