public void addClause(Clause c, List<Clause> sos, List<Clause> usable)
{
// Perform forward subsumption elimination
bool addToSOS = true;
for (int i = minNoLiterals; i < c.getNumberLiterals(); i++)
{
List<Clause> fs = clausesGroupedBySize[i];
if (null != fs)
{
foreach (Clause s in fs)
{
if (s.subsumes(c))
{
addToSOS = false;
break;
}
}
}
if (!addToSOS)
{
break;
}
}
if (addToSOS)
{
sos.Add(c);
lightestClauseHeuristic.addedClauseToSOS(c);
indexClause(c);
// Have added clause, therefore
// perform backward subsumption elimination
List<Clause> subsumed = new List<Clause>();
for (int i = c.getNumberLiterals() + 1; i <= maxNoLiterals; i++)
{
subsumed.Clear();
List<Clause> bs = clausesGroupedBySize[i];
if (null != bs)
{
foreach (Clause s in bs)
{
if (c.subsumes(s))
{
subsumed.Add(s);
if (sos.Contains(s))
{
sos.Remove(s);
lightestClauseHeuristic
.removedClauseFromSOS(s);
}
usable.Remove(s);
}
}
foreach(Clause c2 in subsumed)
{
bs.Remove(c2);
}
}
}
}
}