void RandomMin::Compare( int index, double val)
{
list <ValueGroup>::iterator vg = m_vgList.begin();
if (vg == m_vgList.end())
{
//
// Empty list. Add the new value.
m_vgList.push_back( ValueGroup( index, val));
m_sampleCnt++;
}
else if ((val - m_vgList.rbegin()->m_val) > m_tol)
{
//
// New value is worse than current worst value.
if (m_sampleCnt < m_sampleSize)
{
// But we need more samples.
m_vgList.push_back( ValueGroup( index, val));
m_sampleCnt++;
}
}
else
{
if ((val - vg->m_val) < -m_tol)
{
//
// The new value is better than the best value.
m_vgList.push_front( ValueGroup(index, val));
m_sampleCnt++;
}
else
{
//
// Value is somewhere in between best and worst.
int oldSampleCnt = m_sampleCnt;
while (vg != m_vgList.end())
{
if (fabs(val - vg->m_val) <= m_tol)
{
// essentially equal.
vg->m_index.push_back(index);
m_sampleCnt++;
break;
}
else if (val < vg->m_val)
{
m_vgList.insert( vg, ValueGroup(index, val));
m_sampleCnt++;
break;
}
++vg;
}
assert(m_sampleCnt-oldSampleCnt == 1);
}
list <ValueGroup>::reverse_iterator rvg = m_vgList.rbegin();
int worstValGroupCnt = rvg->m_index.size();
if ((m_sampleCnt - worstValGroupCnt) == m_sampleSize)
{
m_vgList.pop_back();
m_sampleCnt -= worstValGroupCnt;
}
rvg = m_vgList.rbegin();
worstValGroupCnt = rvg->m_index.size();
assert((m_sampleCnt - worstValGroupCnt) < m_sampleSize);
}
}
End of Listing