private bool ComputeValue(AbstractQuantifierSetting setting, out double value)
        {
            TwoDimensionalContingencyTable tableA = new TwoDimensionalContingencyTable(setting.firstContingencyTableRows);
            tableA.StartColumnBound = ColumnFrom;
            tableA.StartRowBound = RowFrom;
            tableA.EndColumnBound = ColumnTo;
            tableA.EndRowBound = RowTo;

            TwoDimensionalContingencyTable tableB = new TwoDimensionalContingencyTable(setting.secondContingencyTableRows);
            tableB.StartColumnBound = ColumnFrom;
            tableB.StartRowBound = RowFrom;
            tableB.EndColumnBound = ColumnTo;
            tableB.EndRowBound = RowTo;

            if (ContingencyTable.IsOperationModeOverQuantifierValues(OperationMode))
            {
                double valueA;
                bool resultA = tableA.AnyValue(Relation, Treshold, Units, setting.allObjectsCount, out valueA);
                double valueB;
                bool resultB = tableB.AnyValue(Relation, Treshold, Units, setting.allObjectsCount, out valueB);
                value = TwoDimensionalContingencyTable.Combine(valueA, valueB, OperationMode);

                if (resultA && resultB)
                    return true;
                else
                    return false;
            }
            else
            {
                TwoDimensionalContingencyTable combinedTable =
                    ContingencyTable.Combine<TwoDimensionalContingencyTable>(tableA, tableB, OperationMode);
                return combinedTable.AnyValue(Relation, Treshold, Units, setting.allObjectsCount, out value);
            }
        }
        /// <summary>
        /// Gets the validity of the quantifier.
        /// </summary>
        /// <param name="setting">The setting.</param>
        /// <param name="__current">The __current.</param>
        /// <returns></returns>
        public override bool Validity(AbstractQuantifierSetting setting, Ice.Current __current)
        {
            TwoDimensionalContingencyTable table = new TwoDimensionalContingencyTable(setting.firstContingencyTableRows);
            table.StartColumnBound = ColumnFrom;
            table.StartRowBound = RowFrom;
            table.EndColumnBound = ColumnTo;
            table.EndRowBound = RowTo;

            double result;

            return table.AnyValue(Relation, Treshold, Units, setting.allObjectsCount, out result);
        }
        /// <summary>
        /// Gets the value of the quantifier above specified <c>setting</c>.
        /// </summary>
        /// <param name="setting">The setting.</param>
        /// <param name="__current">The __current.</param>
        /// <returns></returns>
        public override double Value(AbstractQuantifierSetting setting, Ice.Current __current)
        {
            TwoDimensionalContingencyTable table = new TwoDimensionalContingencyTable(setting.firstContingencyTableRows);
            table.StartColumnBound = ColumnFrom;
            table.StartRowBound = RowFrom;
            table.EndColumnBound = ColumnTo;
            table.EndRowBound = RowTo;

            return ContingencyTable.Value<TwoDimensionalContingencyTable>(
                valueFunctionDelegate,
                table,
                Units,
                setting.allObjectsCount);
        }
 /// <summary>
 /// SumOfMaximumsOfRows (sometimes also FunctionSumOfRows)
 /// </summary>
 /// <remarks>See [032 Zadání pro KL-Miner.doc] chapter 4.1.1.</remarks>
 public static double SumOfRowMaximumsValue(TwoDimensionalContingencyTable table)
 {
     long sumOfRowMax = 0;
     long rowMax;
     long sum = 0;
     int firstColumnIndex = table.FirstColumnIndex;
     int lastColumnIndex = table.LastColumnIndex;
     for (int rowIndex = table.FirstRowIndex; rowIndex <= table.LastRowIndex; rowIndex++)
     {
         rowMax = long.MinValue;
         for (int columnIndex = firstColumnIndex; columnIndex <= lastColumnIndex; columnIndex++)
         {
             sum += table.Table[rowIndex, columnIndex];
             rowMax = Math.Max(rowMax, table.Table[rowIndex, columnIndex]);
         }
         sumOfRowMax += rowMax;
     }
     return sumOfRowMax / ((double)table.Denominator * sum);
 }
 /// <summary>
 /// MI*(C,R) = MI(C,R) / min{ H(C), H(R) }
 /// </summary>
 /// <remarks>See [055 Náměty pro další vývoj KL-Miner.doc] or [080 Náměty pro další vývoj KL-Miner II.doc].</remarks>
 public static double MutualInformationNormalizedValue(TwoDimensionalContingencyTable table)
 {
     double marginalColumnEntropy = table.MarginalColumnEntropy;
     double marginalRowEntropy = table.MarginalRowEntropy;
     return marginalColumnEntropy + marginalRowEntropy - table.JointEntropy
         / Math.Min(marginalColumnEntropy, marginalRowEntropy);
 }
        /// <summary>
        /// See [053 Definice KL-kvantifikátorů.pdf] chapter 5.4.
        /// </summary>
        public static double KendalValue(TwoDimensionalContingencyTable table)
        {
            double denominator = table.Denominator;
            double p, q, sum, sumOfSecondPowerOfRowSums, sumOfSecondPowerOfColumnSums;
            p = q = sum = sumOfSecondPowerOfRowSums = sumOfSecondPowerOfColumnSums = 0;

            int firstRowIndex = table.FirstRowIndex;
            int lastRowIndex = table.LastRowIndex;
            int firstColumnIndex = table.FirstColumnIndex;
            int lastColumnIndex = table.LastColumnIndex;
            long[] columnSums = new long[lastColumnIndex - firstColumnIndex + 1];
            columnSums.Initialize();

            #region Initialize qTmp (Q table, P table can be computed from qTmp)

            // initializes Q table (qTmp) (P table can be computed from Q table)
            long[,] qTmp = new long[lastRowIndex + 1, lastColumnIndex + 1];
            qTmp.Initialize();
            //Sum(i>=k,j<=l)Nij where
            // .. k is row index,
            // .. l is column index and
            // .. Nij is number in contingecy table on ij position
            for (int rowIndex = lastRowIndex; rowIndex >= firstRowIndex; rowIndex--)
            {
                for (int columnIndex = firstColumnIndex; columnIndex <= lastColumnIndex; columnIndex++)
                {
                    if (columnIndex > firstColumnIndex)
                    {
                        // gets left rectangle
                        long leftRectangle = qTmp[rowIndex, columnIndex - 1];

                        // gets lower rectangle
                        long lowerRectangle = 0;
                        // gets left lower rectangle
                        long leftLowerRectangle = 0;
                        if (rowIndex < lastRowIndex)
                        {
                            lowerRectangle = qTmp[rowIndex + 1, columnIndex];
                            leftLowerRectangle = qTmp[rowIndex + 1, columnIndex - 1];
                        }

                        qTmp[rowIndex, columnIndex] =
                            leftRectangle
                            + lowerRectangle
                            - leftLowerRectangle
                            + table.Table[rowIndex, columnIndex];
                    }
                    else // i.e. (columnIndex == firstColumnIndex)
                    {
                        if (rowIndex < lastRowIndex)
                            qTmp[rowIndex, columnIndex] = qTmp[rowIndex + 1, columnIndex] + table.Table[rowIndex, columnIndex];
                        else // i.e.(rowIndex == lastRowIndex)
                            qTmp[rowIndex, columnIndex] = table.Table[rowIndex, columnIndex];
                    }
                }
            }
            #endregion

            for (int rowIndex = firstRowIndex; rowIndex <= lastRowIndex; rowIndex++)
            {
                double rowSum = 0;
                for (int columnIndex = firstColumnIndex; columnIndex <= lastColumnIndex; columnIndex++)
                {
                    long item = table.Table[rowIndex, columnIndex];
                    rowSum += item;
                    columnSums[columnIndex] += item;

                    if (rowIndex < lastRowIndex)
                    {
                        //qSum = Sum(i>k,j<l)Nij where k is row index, l is column index and Nij is number in contingecy table on ij position
                        long qSum = (columnIndex > firstColumnIndex) ? qTmp[rowIndex + 1, columnIndex - 1] : 0;
                        q += item * qSum;

                        //pSum = Sum(i>k,j>l)Nij where k is row index, l is column index and Nij is number in contingecy table on ij position
                        long pSum = qTmp[rowIndex + 1, lastColumnIndex] - qTmp[rowIndex + 1, columnIndex];
                        p += item * pSum;
                    }
                }
                sumOfSecondPowerOfRowSums += Math.Pow(rowSum, 2);
                sum += rowSum;
            }
            for (int columnIndex = firstColumnIndex; columnIndex <= lastColumnIndex; columnIndex++)
            {
                sumOfSecondPowerOfColumnSums += Math.Pow(columnSums[columnIndex], 2);
            }
            double secondPowerOfSum = Math.Pow(sum, 2);
            double resultDenominator = Math.Sqrt(
                (secondPowerOfSum - sumOfSecondPowerOfRowSums) * (secondPowerOfSum - sumOfSecondPowerOfColumnSums)
                );
            double resultNumerator = 2 * (p - q);
            double result = (resultNumerator / resultDenominator) / Math.Pow(denominator, 2);
            return result;
        }
 /// <summary>
 /// Information dependence of R on C
 /// ID(R|C) = 1 - ( H(R|C) / H(R) ) = 1 - ( ( H(C,R) - H(C) ) / H(R))
 /// </summary>
 /// <remarks>See [055 Náměty pro další vývoj KL-Miner.doc] or [080 Náměty pro další vývoj KL-Miner II.doc].</remarks>
 public static double InformationDependenceRCValue(TwoDimensionalContingencyTable table)
 {
     return 1 - (ConditionalRCEntropyValue(table) / table.MarginalRowEntropy);
 }
 /// <summary>
 /// H(R|C) = H(C,R) - H(C)
 /// </summary>
 /// <remarks>See [055 Náměty pro další vývoj KL-Miner.doc] or [080 Náměty pro další vývoj KL-Miner II.doc].</remarks>
 public static double ConditionalRCEntropyValue(TwoDimensionalContingencyTable table)
 {
     return table.JointEntropy - table.MarginalColumnEntropy;
 }
 /// <summary>
 /// Gets the chi-square value of the specified <c>table</c>.
 /// See [053 Definice KL-kvantifikátorů.pdf] chapter 3.1.
 /// See [055 Náměty pro další vývoj KL-Miner.doc] chapeter 2
 /// See [dmw3.pdf]
 /// </summary>
 /// <param name="table">The table.</param>
 /// <returns>Chi-square</returns>
 public static double ChiSquare(TwoDimensionalContingencyTable table)
 {
     //TODO Implement this (KL ChiSquare)
     return 0;
 }
        /// <summary>
        /// Returns XML string with all occurences of Active element "KL hypothesis".
        /// </summary>
        /// <param name="index">index of data source in FEplugin data sources table</param>
        /// <returns>XML string</returns>
        public static string getList(int index)
        {
            string resultString = ""; // result XML string

            // loading DTD to resultString
            try { resultString = XMLHelper.loadDTD(); }
            catch (Exception e)
            {
            #if (LADENI)
                MessageBox.Show("error while loading DTD: " + e.Message);
            #endif
                return resultString;
            }

            // root element
            resultString += "<active_list>";

            string PropName = "Hypotheses";  // name of property which contain a list of hypotheses
            // searching all boxes KL-uloh
            IBoxModule[] TaskBoxes = BoxesHelper.ListBoxesWithID(CFEsourcesTab.Sources[index] as CFEsource, "LISpMinerTasks.KLTask");

            // processing of each box - searching all KL-hypotheses
            string ErrStr = ""; // error report

            string matrix_name = "unknown";   // analyzed data matrix name
            string db_name="unknown";    // analyzed database name
            string task_name = "unknown";  // task name - given with user name of box FFTTast

            #region Loop - processing of each KL-Task from array TaskBoxes

            foreach (IBoxModule box in TaskBoxes)
            {
                try
                {
                    // searching data source name (database)
                    IBoxModule[] db_names = BoxesHelper.ListAncestBoxesWithID(box, "DataMiningCommon.Database");
                    if (db_names.GetLength(0) != 1)  // searched more than one data source or neither one
                        throw new System.Exception("found " + db_names.GetLength(0).ToString() + " databases");
                    db_name = (db_names[0].GetPropertyOther("DatabaseName") as StringT).stringValue;

                    // searching data matrix name
                    IBoxModule[] matrix_names = BoxesHelper.ListAncestBoxesWithID(box, "DataMiningCommon.DataMatrix");
                    if (matrix_names.GetLength(0) != 1)  // searched more than one data source or neither one
                        throw new System.Exception("found " + matrix_names.GetLength(0).ToString() + " data matrixes");
                    matrix_name = (matrix_names[0].GetPropertyOther("Name") as StringT).stringValue;

                    // searching task name
                    task_name = box.UserName;

                    // searching the list of all hypotheses in this task
                    HypothesesT HypT = box.GetPropertyOther(PropName) as HypothesesT;
                    HypothesisStruct[] HypList = HypT.hypothesesValue.Clone() as HypothesisStruct[];

                    // records for storing the results
                    Rec_hyp_KL rHyp = new Rec_hyp_KL();   // KL hypothesis
                    Rec_ti_attribute rAnt = new Rec_ti_attribute();  // Antecedent (Row attributes)
                    Rec_ti_attribute rSuc = new Rec_ti_attribute();  // Succedent (Column attributes)
                    Rec_ti_cedent rCon = new Rec_ti_cedent();  // condition

                    #region Loop - processing of each hypotheses jedne krabicky KLTask
                    // Loop over all hypotheses
                    for (int i = 0; i < HypList.GetLength(0); i++)
                    {
                        #region element hyp_KL

                        rHyp.id = "hypKL" + box.ProjectIdentifier.ToString() + "_" + i.ToString();
                        rHyp.db_name = db_name;
                        rHyp.matrix_name = matrix_name;
                        rHyp.task_name = task_name;
                        rHyp.row_attributes = "r_attr" + rHyp.id;
                        rHyp.column_attributes = "c_attr" + rHyp.id;
                        rHyp.condition = "con" + rHyp.id;
                        TwoDimensionalContingencyTable CT = new TwoDimensionalContingencyTable(HypList[i].quantifierSetting.firstContingencyTableRows); // Contingency Table
                        rHyp.Tab = HypList[i].quantifierSetting.firstContingencyTableRows;

                        // values of quantifiers - first set
                        try
                        {
                            rHyp.sum = CT.SumOfValues.ToString();
                            rHyp.min = CT.MinValue.ToString();
                            rHyp.max = CT.MaxValue.ToString();
                            rHyp.chi_sq = TwoDimensionalContingencyTable.ChiSquare(CT).ToString();
                            rHyp.fnc_s = TwoDimensionalContingencyTable.SumOfRowMaximumsValue(CT).ToString();
                            rHyp.fnc_r = TwoDimensionalContingencyTable.MinOfRowMaximumsValue(CT).ToString();
                            rHyp.h_c = CT.MarginalColumnEntropy.ToString();
                            rHyp.h_r = CT.MarginalRowEntropy.ToString();
                            rHyp.h_c_r = TwoDimensionalContingencyTable.ConditionalCREntropyValue(CT).ToString();
                            rHyp.mi = CT.MutualInformation.ToString();
                            //rHyp.aic = CT.???;  TODO
                            rHyp.kend = TwoDimensionalContingencyTable.KendalValue(CT).ToString();
                        }
                        catch (System.Exception e) // There are some errors in Ferda quantifier values!
                        {
                            ErrStr += "Box ProjectIdentifier=" + box.ProjectIdentifier.ToString() + ": chyba pri vypoctu kvantifikatoru: " + e.Message + "\n";
                        }

                        #endregion

                        #region element ti_attribute Row attributes (Antecedent)

                        rAnt.id = rHyp.row_attributes;
                        rAnt.type = "Row attributes";
                        rAnt.quant = "";   // deleting previous value
                        // category
                        List<Rec_ti_category> Cat_a = new List<Rec_ti_category>();
                        foreach (LiteralStruct lit in HypList[i].literals)
                        {
                            if (lit.cedentType == CedentEnum.Antecedent)
                            {
                                rAnt.quant += lit.literalName;
                                foreach (string s in lit.categoriesNames)
                                {
                                    Rec_ti_category C = new Rec_ti_category();
                                    C.value = s;
                                    Cat_a.Add(C);
                                }
                                // ??? k cemu je polozka LitralStruct.categoriesValues ?
                            }
                        }

                        #endregion

                        #region element ti_attribute Column attributes (Succedent)

                        rSuc.id = rHyp.column_attributes;
                        rSuc.type = "Column attributes";
                        rSuc.quant = "";   // deleting previous value
                        // category
                        List<Rec_ti_category> Cat_s = new List<Rec_ti_category>();
                        foreach (LiteralStruct lit in HypList[i].literals)
                        {
                            if (lit.cedentType == CedentEnum.Succedent)
                            {
                                rSuc.quant += lit.literalName;
                                foreach (string s in lit.categoriesNames)
                                {
                                    Rec_ti_category C = new Rec_ti_category();
                                    C.value = s;
                                    Cat_s.Add(C);
                                }
                                // ??? k cemu je polozka LitralStruct.categoriesValues ?
                            }
                        }

                        #endregion

                        #region element ti_cedent (Condition)

                        rCon.id = "con" + rHyp.id;
                        rCon.type = "Condition";
                        // literals
                        int litCounter = 0;  // counter of literals of this hypotheses
                        List<Rec_ti_literal> Lit_c = new List<Rec_ti_literal>();
                        foreach (BooleanLiteralStruct lit in HypList[i].booleanLiterals)
                        {
                            if (lit.cedentType == CedentEnum.Condition)
                            {
                                Rec_ti_literal l = new Rec_ti_literal();
                                l.id = "tiLit" + rHyp.id + "_" + litCounter.ToString();
                                litCounter++;
                                if (lit.negation)
                                    l.quant = "¬";
                                l.quant += lit.literalName;
                                int counter = 0;
                                foreach (string s in lit.categoriesNames)
                                {
                                    if (counter > 0)
                                        l.value += ",";
                                    l.value += s;
                                    counter++;
                                }
                                Lit_c.Add(l);
                            }
                        }

                        #endregion

                        #region Generating of one hypotheses to XML string

                        string oneHypString = "";
                        // generating hypotheses to XML
                        oneHypString += rHyp.ToXML();
                        // generating Row attributes (Antecedent) to XML
                        oneHypString += rAnt.ToXML(Cat_a);
                        // generating Column attributes (Succedent) to XML
                        oneHypString += rSuc.ToXML(Cat_s);
                        // generating Condition to XML
                        oneHypString += rCon.ToXML(Lit_c);

                        resultString += oneHypString;

                        #endregion
                    }
                    #endregion
                }
                catch (System.Exception e)
                {
                    ErrStr += "Box ProjectIdentifier=" + box.ProjectIdentifier.ToString() + ": " + e.Message + "\n";
                }
            }
            #endregion

             // root element
            resultString += "</active_list>";

            #if (LADENI)
            // generating of error message:
            if (!String.IsNullOrEmpty(ErrStr))  // LADICI
                MessageBox.Show("Pri nacitani KL hypotheses doslo k chybam:\n" + ErrStr, "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error);

            // LADICI - Kody - storing output to file "XMLsd4fthypExample.xml" in directory
            XMLHelper.saveXMLexample(resultString, "../XML/XMLKLhypExample.xml");
            #endif

            return resultString;
        }
        /// <summary>
        /// Returns XML string with all occurences of Active element "SD-KL hypothesis".
        /// </summary>
        /// <param name="index">index of data source in FEplugin data sources table</param>
        /// <returns>XML string</returns>
        public static string getList(int index)
        {
            string resultString = ""; // result XML string

            // loading DTD to resultString
            try { resultString = XMLHelper.loadDTD(); }
            catch (Exception e)
            {
            #if (LADENI)
                MessageBox.Show("error while loading DTD: " + e.Message);
            #endif
                return resultString;
            }

            // root element
            resultString += "<active_list>";

            string PropName = "Hypotheses";  // name of property which contain a list of hypotheses
            // searching all boxes SD-KL-tasks
            IBoxModule[] TaskBoxes = BoxesHelper.ListBoxesWithID(CFEsourcesTab.Sources[index] as CFEsource, "LISpMinerTasks.SDKLTask");

            // processing of each box -  searching all KL-hypotheses
            string ErrStr = ""; // error report

            string matrix_name = "unknown";   // analyzed data matrix name
            string db_name="unknown";    // analyzed database name
            string task_name = "unknown";  // task name - given with user name of box FFTTast

            // creatind delegates for functions of quantifiers
            // "sum of values"
            ContingencyTable.QuantifierValue<TwoDimensionalContingencyTable> sum_delegat = new ContingencyTable.QuantifierValue<TwoDimensionalContingencyTable>(TwoDimensionalContingencyTable.GetSumOfValues);
            // "min value"
            ContingencyTable.QuantifierValue<TwoDimensionalContingencyTable> min_delegat = new ContingencyTable.QuantifierValue<TwoDimensionalContingencyTable>(TwoDimensionalContingencyTable.GetMinValue);
            // "max value"
            ContingencyTable.QuantifierValue<TwoDimensionalContingencyTable> max_delegat = new ContingencyTable.QuantifierValue<TwoDimensionalContingencyTable>(TwoDimensionalContingencyTable.GetMaxValue);

            #region Loop - processing of each KL-Task from array TaskBoxes

            foreach (IBoxModule box in TaskBoxes)
            {
                try
                {
                    // searching data source name (database)
                    IBoxModule[] db_names = BoxesHelper.ListAncestBoxesWithID(box, "DataMiningCommon.Database");
                    if (db_names.GetLength(0) != 1)  // searched more than one data source or neither one
                        throw new System.Exception("found " + db_names.GetLength(0).ToString() + " databases");
                    db_name = (db_names[0].GetPropertyOther("DatabaseName") as StringT).stringValue;

                    // searching data matrix name
                    IBoxModule[] matrix_names = BoxesHelper.ListAncestBoxesWithID(box, "DataMiningCommon.DataMatrix");
                    if (matrix_names.GetLength(0) != 1)  // searched more than one data source or neither one
                        throw new System.Exception("found " + matrix_names.GetLength(0).ToString() + " data matrixes");
                    matrix_name = (matrix_names[0].GetPropertyOther("Name") as StringT).stringValue;

                    // searching task name
                    task_name = box.UserName;

                    // searching the list of all hypotheses in this task
                    HypothesesT HypT = box.GetPropertyOther(PropName) as HypothesesT;
                    HypothesisStruct[] HypList = HypT.hypothesesValue.Clone() as HypothesisStruct[];

                    // records for storing the results
                    Rec_hyp_SDKL rHyp = new Rec_hyp_SDKL();   // SD-KL hypothesis
                    Rec_ti_attribute rAnt = new Rec_ti_attribute();  // Antecedent (Row attributes)
                    Rec_ti_attribute rSuc = new Rec_ti_attribute();  // Succedent (Column attributes)
                    Rec_ti_cedent rCon = new Rec_ti_cedent();  // condition
                    Rec_ti_cedent rSet1 = new Rec_ti_cedent();  // set 1
                    Rec_ti_cedent rSet2 = new Rec_ti_cedent();  // set 2

                    #region Loop - processing of each hypotheses jedne krabicky SDKLTask
                    // Loop over all hypotheses
                    for (int i = 0; i < HypList.GetLength(0); i++)
                    {
                        #region element hyp_SDKL

                        rHyp.id = "hypSDKL" + box.ProjectIdentifier.ToString() + "_" + i.ToString();
                        rHyp.db_name = db_name;
                        rHyp.matrix_name = matrix_name;
                        rHyp.task_name = task_name;
                        rHyp.row_attributes = "r_attr" + rHyp.id;
                        rHyp.column_attributes = "c_attr" + rHyp.id;
                        rHyp.condition = "con" + rHyp.id;
                        rHyp.set1 = "set1" + rHyp.id;
                        rHyp.set2 = "set2" + rHyp.id;
                        TwoDimensionalContingencyTable CT1 = new TwoDimensionalContingencyTable(HypList[i].quantifierSetting.firstContingencyTableRows); // Contingency Table 1
                        TwoDimensionalContingencyTable CT2 = new TwoDimensionalContingencyTable(HypList[i].quantifierSetting.secondContingencyTableRows); // Contingency Table 2
                        rHyp.Tab1 = HypList[i].quantifierSetting.firstContingencyTableRows;
                        rHyp.Tab2 = HypList[i].quantifierSetting.secondContingencyTableRows;

                        // values of quantifiers - set1
                        try
                        {
                            rHyp.sum1 = CT1.SumOfValues.ToString();
                            rHyp.min1 = CT1.MinValue.ToString();
                            rHyp.max1 = CT1.MaxValue.ToString();
                            rHyp.chi_sq1 = TwoDimensionalContingencyTable.ChiSquare(CT1).ToString();
                            rHyp.fnc_s1 = TwoDimensionalContingencyTable.SumOfRowMaximumsValue(CT1).ToString();
                            rHyp.fnc_r1 = TwoDimensionalContingencyTable.MinOfRowMaximumsValue(CT1).ToString();
                            rHyp.h_c1 = CT1.MarginalColumnEntropy.ToString();
                            rHyp.h_r1 = CT1.MarginalRowEntropy.ToString();
                            rHyp.h_c_r1 = TwoDimensionalContingencyTable.ConditionalCREntropyValue(CT1).ToString();
                            rHyp.mi1 = CT1.MutualInformation.ToString();
                            //rHyp.aic = CT.???;  TODO
                            rHyp.kend1 = TwoDimensionalContingencyTable.KendalValue(CT1).ToString();
                        }
                        catch (System.Exception e) // TODO: Ferda ma chyby ve vypoctech -> opravit!
                        {
                            ErrStr += "Box ProjectIdentifier=" + box.ProjectIdentifier.ToString() + ": chyba pri vypoctu quantifier: " + e.Message + "\n";
                        }
                        // values of quantifiers - set2
                        try
                        {
                            rHyp.sum2 = CT2.SumOfValues.ToString();
                            rHyp.min2 = CT2.MinValue.ToString();
                            rHyp.max2 = CT2.MaxValue.ToString();
                            rHyp.chi_sq2 = TwoDimensionalContingencyTable.ChiSquare(CT2).ToString();
                            rHyp.fnc_s2 = TwoDimensionalContingencyTable.SumOfRowMaximumsValue(CT2).ToString();
                            rHyp.fnc_r2 = TwoDimensionalContingencyTable.MinOfRowMaximumsValue(CT2).ToString();
                            rHyp.h_c2 = CT2.MarginalColumnEntropy.ToString();
                            rHyp.h_r2 = CT2.MarginalRowEntropy.ToString();
                            rHyp.h_c_r2 = TwoDimensionalContingencyTable.ConditionalCREntropyValue(CT2).ToString();
                            rHyp.mi2 = CT2.MutualInformation.ToString();
                            //rHyp.aic = CT.???;  TODO
                            rHyp.kend2 = TwoDimensionalContingencyTable.KendalValue(CT2).ToString();
                        }
                        catch (System.Exception e) // Ferda ma chyby ve vypoctech!
                        {
                            ErrStr += "Box ProjectIdentifier=" + box.ProjectIdentifier.ToString() + ": chyba pri vypoctu quantifier: " + e.Message + "\n";
                        }
                        // values of quantifiers - diffrent of set1 a set2
                        try
                        {
                            rHyp.da_sum = TwoDimensionalContingencyTable.Value<TwoDimensionalContingencyTable>(sum_delegat, CT1, CT2, OperationModeEnum.DifferencesOfAbsoluteFrequencies).ToString();
                            rHyp.da_min = TwoDimensionalContingencyTable.Value<TwoDimensionalContingencyTable>(min_delegat, CT1, CT2, OperationModeEnum.DifferencesOfAbsoluteFrequencies).ToString();
                            rHyp.da_max = TwoDimensionalContingencyTable.Value<TwoDimensionalContingencyTable>(max_delegat, CT1, CT2, OperationModeEnum.DifferencesOfAbsoluteFrequencies).ToString();
                            rHyp.dr_sum = TwoDimensionalContingencyTable.Value<TwoDimensionalContingencyTable>(sum_delegat, CT1, CT2, OperationModeEnum.DifferencesOfRelativeFrequencies).ToString();
                            rHyp.dr_min = TwoDimensionalContingencyTable.Value<TwoDimensionalContingencyTable>(min_delegat, CT1, CT2, OperationModeEnum.DifferencesOfRelativeFrequencies).ToString();
                            rHyp.dr_max = TwoDimensionalContingencyTable.Value<TwoDimensionalContingencyTable>(max_delegat, CT1, CT2, OperationModeEnum.DifferencesOfRelativeFrequencies).ToString();
                        }
                        catch (System.Exception e) // Ferda ma chyby ve vypoctech!
                        {
                            ErrStr += "Box ProjectIdentifier=" + box.ProjectIdentifier.ToString() + ": chyba pri vypoctu quantifier: " + e.Message + "\n";
                        }

                        #endregion

                        #region element ti_attribute Row attributes (Antecedent)

                        rAnt.id = rHyp.row_attributes;
                        rAnt.type = "Row attributes";
                        rAnt.quant = "";   // deleting previous value
                        // category
                        List<Rec_ti_category> Cat_a = new List<Rec_ti_category>();
                        foreach (LiteralStruct lit in HypList[i].literals)
                        {
                            if (lit.cedentType == CedentEnum.Antecedent)
                            {
                                rAnt.quant += lit.literalName;
                                foreach (string s in lit.categoriesNames)
                                {
                                    Rec_ti_category C = new Rec_ti_category();
                                    C.value = s;
                                    Cat_a.Add(C);
                                }
                            }
                        }

                        #endregion

                        #region element ti_attribute Column attributes (Succedent)

                        rSuc.id = rHyp.column_attributes;
                        rSuc.type = "Column attributes";
                        rSuc.quant = "";   // deleting previous value
                        // category
                        List<Rec_ti_category> Cat_s = new List<Rec_ti_category>();
                        foreach (LiteralStruct lit in HypList[i].literals)
                        {
                            if (lit.cedentType == CedentEnum.Succedent)
                            {
                                rSuc.quant += lit.literalName;
                                foreach (string s in lit.categoriesNames)
                                {
                                    Rec_ti_category C = new Rec_ti_category();
                                    C.value = s;
                                    Cat_s.Add(C);
                                }
                            }
                        }

                        #endregion

                        #region element ti_cedent (Condition)

                        rCon.id = "con" + rHyp.id;
                        rCon.type = "Condition";
                        // literals
                        int litCounter = 0;  // counter of literals of this hypothesis
                        List<Rec_ti_literal> Lit_c = new List<Rec_ti_literal>();
                        foreach (BooleanLiteralStruct lit in HypList[i].booleanLiterals)
                        {
                            if (lit.cedentType == CedentEnum.Condition)
                            {
                                Rec_ti_literal l = new Rec_ti_literal();
                                l.id = "tiLit" + rHyp.id + "_" + litCounter.ToString();
                                litCounter++;
                                if (lit.negation)
                                    l.quant = "¬";
                                l.quant += lit.literalName;
                                int counter = 0;
                                foreach (string s in lit.categoriesNames)
                                {
                                    if (counter > 0)
                                        l.value += ",";
                                    l.value += s;
                                    counter++;
                                }
                                Lit_c.Add(l);
                            }
                        }

                        #endregion

                        #region element ti_cedent (Set1)

                        rSet1.id = rHyp.set1;
                        rSet1.type = "First Set";
                        // literals
                        List<Rec_ti_literal> Lit_s1 = new List<Rec_ti_literal>();
                        foreach (BooleanLiteralStruct lit in HypList[i].booleanLiterals)
                        {
                            if (lit.cedentType == CedentEnum.FirstSet)
                            {
                                Rec_ti_literal l = new Rec_ti_literal();
                                l.id = "tiLit" + rHyp.id + "_" + litCounter.ToString();
                                litCounter++;
                                if (lit.negation)
                                    l.quant = "¬";
                                l.quant += lit.literalName;
                                int counter = 0;
                                foreach (string s in lit.categoriesNames)
                                {
                                    if (counter > 0)
                                        l.value += ",";
                                    l.value += s;
                                    counter++;
                                }
                                Lit_s1.Add(l);
                            }
                        }

                        #endregion

                        #region element ti_cedent (Set2)

                        rSet2.id = rHyp.set2;
                        rSet2.type = "Second Set";
                        // literals
                        List<Rec_ti_literal> Lit_s2 = new List<Rec_ti_literal>();
                        foreach (BooleanLiteralStruct lit in HypList[i].booleanLiterals)
                        {
                            if (lit.cedentType == CedentEnum.SecondSet)
                            {
                                Rec_ti_literal l = new Rec_ti_literal();
                                l.id = "tiLit" + rHyp.id + "_" + litCounter.ToString();
                                litCounter++;
                                if (lit.negation)
                                    l.quant = "¬";
                                l.quant += lit.literalName;
                                int counter = 0;
                                foreach (string s in lit.categoriesNames)
                                {
                                    if (counter > 0)
                                        l.value += ",";
                                    l.value += s;
                                    counter++;
                                }
                                Lit_s2.Add(l);
                            }
                        }

                        #endregion

                        #region Generating of one hypothesis to XML string

                        string oneHypString = "";
                        // generating hypotheses to XML
                        oneHypString += rHyp.ToXML();
                        // generating Row attributes (Antecedent) to XML
                        oneHypString += rAnt.ToXML(Cat_a);
                        // generating Column attributes (Succedent) to XML
                        oneHypString += rSuc.ToXML(Cat_s);
                        // generating Condition to XML
                        oneHypString += rCon.ToXML(Lit_c);
                        // generating Set1 to XML
                        oneHypString += rSet1.ToXML(Lit_s1);
                        // generating Set2 to XML
                        oneHypString += rSet2.ToXML(Lit_s2);

                        resultString += oneHypString;

                        #endregion
                    }
                    #endregion
                }
                catch (System.Exception e)
                {
                    ErrStr += "Box ProjectIdentifier=" + box.ProjectIdentifier.ToString() + ": " + e.Message + "\n";
                }
            }
            #endregion

            // root element
            resultString += "</active_list>";

            #if (LADENI)
            // generating of error message:
            if (!String.IsNullOrEmpty(ErrStr))  // LADICI
                MessageBox.Show("Pri nacitani SD-KL hypotheses doslo k chybam:\n" + ErrStr, "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error);

            // LADICI - Kody - storing output to file "XMLsd4fthypExample.xml" in directory
            XMLHelper.saveXMLexample(resultString, "../XML/XMLsdKLhypExample.xml");
            #endif

            return resultString;
        }