Beispiel #1
0
 private void Minimalize()
 {
     if (_prepared)
     {
         return;
     }
     while (true)
     {
         var change = false;
         for (var i = 0; i < DependencyList.Count; i++)
         {
             for (var j = 0; j < DependencyList.Count; j++)
             {
                 if (i == j)
                 {
                     continue;
                 }
                 if (!DependencyList[i].Item1.IsSuperSet(DependencyList[j].Item1))
                 {
                     continue;
                 }
                 foreach (var key in Keys.Where(key => DependencyList[j].Item2[key]))
                 {
                     change |= DependencyList[i].Item2[key] || DependencyList[i].Item1[key];
                     DependencyList[i].Item1.Set(key, false);
                     DependencyList[i].Item2.Set(key, false);
                 }
             }
         }
         if (!change)
         {
             break;
         }
         DependencyList.RemoveAll(dependency => !dependency.Item2.ToBitString().Contains('1'));
         for (var i = 0; i < DependencyList.Count; i++)
         {
             for (var j = i + 1; j < DependencyList.Count; j++)
             {
                 if (!DependencyList[i].Item1.EqualsTo(DependencyList[j].Item1))
                 {
                     continue;
                 }
                 DependencyList[i].Item2.Or(DependencyList[j].Item2);
                 DependencyList.RemoveAt(j);
                 j--;
             }
         }
     }
 }