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--; } } } }