public DiscernibilityMatrix(DecisionSystem ds,IEnumerable<int> reduct, double ruleValue)
 {
     var sa = new StandardApproximationSpace(ds, reduct);
     RuleValue = ruleValue;
     var columns = sa.LowerApproximation(RuleValue);
     //so sánh với các phần tử không thuộc lower approximation
     var rows =
         ds.Universe.Where(p => columns.All(p2 => p2[0] != p[0])).Where(p => p[ds.DecisionAttributes[0]] != RuleValue);
     Matrix = new List<List<List<pairID>>>();
     foreach (var column in columns)
     {
         var dataRow = new List<List<pairID>>();
         foreach (var row in rows)
         {
             var dataInstances = new List<pairID>();
             foreach (var header in reduct)
             {
                 if (row[header] != column[header])
                 {
                     dataInstances.Add(new pairID(header, int.Parse(column[header].ToString())));
                 }
             }
             if(dataInstances.Count!=0)
                 dataRow.Add(dataInstances);
         }
         if(dataRow.Count!=0)
         Matrix.Add(dataRow);
     }
 }
 // Current only support only one denpendent attribute,
 //   which is decision attr in DecisionSystem object
 private float CalcDependencyDegree(IEnumerable<int> targetAttrs)
 {
     // cardinal number of object univers
     StandardApproximationSpace apprSpace = new StandardApproximationSpace(this.DS, targetAttrs);
     int posCardNum = apprSpace.PositiveRegion(this.DS.DecisionAttribute).Count();
     float dependDegree = (float)posCardNum / this.DS.ObjectCount;
     return dependDegree;
 }