Home || Architecture || Video Search || Visual Search || Scripts || Applications || Important Messages || OGL || Src

template<class SimFunc>
virtual void Impala::Core::Feature::RadiusClusteror< SimFunc >::ProcessBuffer (  )  [inline, virtual]

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:


Generated on Fri Mar 19 11:10:31 2010 for ImpalaSrc by  doxygen 1.5.1