private VaryNode MakeVaryNode(int i, BitArray recordNums, int depth, Varset variables) { // this node will have variableCardinalities[i] children VaryNode vn = new VaryNode(network.GetCardinality(i)); // split into childNums List<BitArray> childNums = new List<BitArray>(); int mcv = -1; int mcvCount = -1; for (int k = 0; k < network.GetCardinality(i); k++) { childNums.Add(new BitArray(recordCount)); childNums[k] = childNums[k].Or(recordNums); childNums[k] = childNums[k].And(consistentRecords[i][k]); // also look for the mcv int count = 0; for (int idx = 0; idx < childNums[k].Count; idx++) { if (childNums[k][idx]) { count += 1; } } if (count > mcvCount) { mcv = k; mcvCount = count; } } // update the mcv vn.Mcv = mcv; // otherwise, rescue for (int k = 0; k < network.GetCardinality(i); k++) { int count = 0; for (int idx = 0; idx < childNums[k].Count; idx++) { if (childNums[k][idx]) { count += 1; } } if (k == mcv || count == 0) { continue; } ADNode child = MakeADTree(i + 1, childNums[k], depth + 1, variables); vn.SetChild(k, child); } return vn; }
public void SetChild(int index, VaryNode child) { children[index] = child; }