/**
* Remove pairs from index that only belong to single CTS
*/
public void purge()
{
final LongArrayList toBeRemoved = new LongArrayList();
pairsToTiersIndex.forEachPair(new LongObjectProcedure()
{
public boolean apply(long key, Object value)
{
// List of formulaAndTierIndices
LongArrayList tiers = (LongArrayList) value;
int tiersCount = tiers.size();
if (tiersCount < 2)
{
toBeRemoved.add(key);
}
else
{
long formulaAndTierIndex = tiers.getQuick(0);
long formulaIndexPart = formulaAndTierIndex & 0xFFFFFFFF00000000L;
for (int i = 1; i < tiersCount; i++)
{
long formulaAndTierIndex2 = tiers.getQuick(i);
long formulaIndexPart2 = formulaAndTierIndex2 & 0xFFFFFFFF00000000L;
if (formulaIndexPart != formulaIndexPart2)
{
// Found distinct formulas
// See VarPairsIndex#addTier() for details of key construction
int varName1 = (int) (key >> 21);
int varName2 = (int) (key & 0x1FFFFF);
addVarNamePair(varName1, key);
addVarNamePair(varName2, key);
return true;
}
}
// All triplets are from the same formula
toBeRemoved.add(key);
}
return true;
}
private void addVarNamePair(int varName1, long key)
{
LongArrayList pairs = (LongArrayList) varNameToPairsIndex.get(varName1);
if (pairs == null)
{
pairs = new LongArrayList(new long[]{ key });
varNameToPairsIndex.put(varName1, pairs);
}
else
{
pairs.add(key);
}
}
});
int size = toBeRemoved.size();