예제 #1
0
        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;
        }
예제 #2
0
 public void SetChild(int index, VaryNode child)
 {
     children[index] = child;
 }