///// <summary>
        ///// if it's leaf, add childNodes
        ///// </summary>
        ///// <param name="root"></param>
        ///// <param name="data">current table;  not necessaryly the original table</param>
        ///// <param name="valToCheck"></param>
        ///// <returns></returns>
        //private static bool CheckIfIsLeaf_sealIfLeaf(DataTable data, TreeNode root, string valToCheck)
        //{
        //	var isLeaf = true;
        //	var allEndValues = new List<string>();

        //	// get all leaf values for the attribute in question
        //	for (var i = 0; i < data.Rows.Count; i++)
        //	{
        //		if (data.Rows[i][root.TableIndex].ToString().Equals(valToCheck))
        //		{
        //			allEndValues.Add(data.Rows[i][data.Columns.Count - 1].ToString());
        //		}
        //	}

        //	// check whether all elements of the list have the same value
        //	if (allEndValues.Count > 0 && allEndValues.Any(x => x != allEndValues[0]))
        //	{
        //		isLeaf = false;
        //	}

        //	// create leaf with value to display and edge to the leaf
        //	if (isLeaf)
        //	{
        //		root.ChildNodes.Add(new TreeNode(true, allEndValues[0], valToCheck));
        //	}

        //	return isLeaf;
        //}
        private static TreeNode __GetRootNodeFroClass_tblAssumeDwelt(DataTable data, string inEdge)
        {
            var lastIndex = data.Columns.Count - 1;

            return(new TreeNode(
                       data.Columns[data.Columns.Count - 1].ColumnName
                       , lastIndex
                       ,
                       new MyAttribute(
                           data.Columns[lastIndex].ToString()
                           ,
                           MyAttribute.GetDifferentAttributeNamesOfColumn(data, lastIndex)
                           ),
                       inEdge
                       ));
        }
        private static TreeNode GetRootNode_tblAssumeDefiniteAttrsPurged(DataTable data, string inEdge)
        {
            ///if there is only one col: the class .
            ///
            if (data.Columns.Count == 1)
            {
                return(__GetRootNodeFroClass_tblAssumeDwelt(data, inEdge));
            }

            var attributes = new List <MyAttribute>();
            var highestInformationGainIndex = -1;
            var highestInformationGain      = double.MinValue;

            // Get all names, amount of attributes and attributes for every column
            for (var i = 0; i < data.Columns.Count - 1; i++)
            {
                var differentAttributenames = MyAttribute.GetDifferentAttributeNamesOfColumn(data, i);
                attributes.Add(new MyAttribute(data.Columns[i].ToString(), differentAttributenames));
            }

            // Calculate Entropy (S)
            var tableEntropy = _treed.trainSet._EntropyOfClassX.Entropy(data);

            for (var i = 0; i < attributes.Count; i++)
            {
                attributes[i].InformationGain = _treed._TrainSetX.GetGainRatioForCol(data, i, tableEntropy);

                if (attributes[i].InformationGain > highestInformationGain)
                {
                    highestInformationGain      = attributes[i].InformationGain;
                    highestInformationGainIndex = i;
                }
            }
            /// todo : gainRatio might be all nils
            ///
            if (highestInformationGain == 0)
            {
                return(__GetRootNodeFroClass_tblAssumeDwelt(data, inEdge));
            }

            return(new TreeNode(attributes[highestInformationGainIndex].Name, highestInformationGainIndex, attributes[highestInformationGainIndex], inEdge));
        }