protected virtual IList<IIntSet> MakeEdgeSetsDisjoint( IList<IIntSet> edges )
{
OrderedHashSet<IIntSet> disjointSets = new OrderedHashSet<IIntSet>();
// walk each incoming edge label/set and add to disjoint set
int numEdges = edges.Count;
for ( int e = 0; e < numEdges; e++ )
{
IntervalSet t = (IntervalSet)edges[e];
if ( disjointSets.Contains( t ) )
{ // exact set present
continue;
}
// compare t with set i for disjointness
IntervalSet remainder = t; // remainder starts out as whole set to add
int numDisjointElements = disjointSets.Count;
for ( int i = 0; i < numDisjointElements; i++ )
{
IntervalSet s_i = (IntervalSet)disjointSets[i];
if ( t.And( s_i ).IsNil )
{ // nothing in common
continue;
}
//[email protected](label+" collides with "+rl);
// For any (s_i, t) with s_i&t!=nil replace with (s_i-t, s_i&t)
// (ignoring s_i-t if nil; don't put in list)
// Replace existing s_i with intersection since we
// know that will always be a non nil character class
IntervalSet intersection = (IntervalSet)s_i.And( t );
disjointSets[i] = intersection;
// Compute s_i-t to see what is in current set and not in incoming
IIntSet existingMinusNewElements = s_i.Subtract( t );
//[email protected](s_i+"-"+t+"="+existingMinusNewElements);
if ( existingMinusNewElements != null && !existingMinusNewElements.IsNil )
{
// found a new character class, add to the end (doesn't affect
// outer loop duration due to n computation a priori.
disjointSets.Add( existingMinusNewElements );
}
// anything left to add to the reachableLabels?
remainder = (IntervalSet)t.Subtract( s_i );
if ( remainder.IsNil )
{
break; // nothing left to add to set. done!
}
t = remainder;
}
if ( !remainder.IsNil )
{
disjointSets.Add( remainder );
}
}
return disjointSets.GetElements();
}