コード例 #1
0
 public FProbTupleBLL(FProbTupleBLL fproTuple)
 {
     this.fproTriples = new List<FProbTripleBLL>();
     foreach (FProbTripleBLL item in fproTuple.fproTriples)
     {
         FProbTripleBLL triple = new FProbTripleBLL(item);
         this.fproTriples.Add(triple);
     }
 }
コード例 #2
0
        /// <summary>
        /// Important! Function return tuple match with query condition from relation table database
        /// </summary>
        /// <param name="tuple"></param>
        /// <returns></returns>
        public bool Satisfied(FProbTupleBLL tuple)
        {
            this.tuple = tuple;
            string conditionStr = this.conditionString;

            #region
            int i = 0;
            int j = 0;
            while (i < conditionStr.Length - 1)
            {
                if (conditionStr[i] == '(')
                {
                    j = i + 1;
                    while (j < conditionStr.Length)
                    {
                        if (conditionStr[j] == ']')
                        {
                            if (IsSelectionExpression(conditionStr.Substring(i, j - i + 1)))
                            {
                                string expValue = ExpressionValue(conditionStr.Substring(i, j - i + 1)) ? "1" : "0";
                                conditionStr = conditionStr.Insert(i, expValue);
                                conditionStr = conditionStr.Remove(i + 1, j - i + 1);
                                break;
                            }

                            if (MessageError != string.Empty)
                            {
                                return(false);
                            }
                        }
                        j++;
                    }
                }
                i++;
            }

            #endregion

            conditionStr = conditionStr.Replace(" ", "").ToLower();
            conditionStr = conditionStr.Replace("and", "&");
            conditionStr = conditionStr.Replace("or", "|");
            conditionStr = conditionStr.Replace("not", "!");
            List <string> rpn = SC_PostfixNotation(conditionStr);            // reverse to postfix notation
            return(CalculateCondition(rpn));
        }
コード例 #3
0
        /// <summary>
        /// Important! Calculate prob query expression, prob data from database
        /// </summary>
        /// <param name="valueOne"></param>
        /// <param name="valueTwo"></param>
        /// <param name="operaterStr"></param>
        /// <returns></returns>
        private string GetProbInterval(string valueOne, string valueTwo, string operaterStr)
        {
            double        minProb = 0, maxProb = 0;
            int           indexOne, indexTwo, countTripleOne, countTripleTwo;
            FProbTupleBLL tuple = this.tuple;
            string        typenameOne;
            string        typenameTwo;

            try
            {
                if (operaterStr.Contains("equal_ig") || operaterStr.Contains("equal_in") || operaterStr.Contains("equal_me"))         // Biểu thức so sánh bằng giữa hai thuộc tính trên cùng một bộ
                {
                    indexOne = IndexOf(valueOne);
                    indexTwo = IndexOf(valueTwo);
                    if (indexOne == -1 || indexTwo == -1)
                    {
                        return(string.Empty);
                    }

                    countTripleOne = tuple.FproTriples[indexOne].Value.Count;
                    countTripleTwo = tuple.FproTriples[indexTwo].Value.Count;
                    typenameOne    = Attributes[indexOne].FproDataType.TypeName;
                    typenameTwo    = Attributes[indexTwo].FproDataType.TypeName;

                    if (typenameOne != typenameTwo)
                    {
                        //Attribute value does not match the data type !
                        MessageError = String.Format("Error :{0} and {1} must  the same data type", valueOne, valueTwo);
                        return(string.Empty);
                    }

                    for (int i = 0; i < countTripleOne; i++)
                    {
                        for (int j = 0; j < countTripleTwo; j++)
                        {
                            double pro = 0.0;
                            pro = this.CompareTriple(tuple.FproTriples[indexOne].Value[i].ToString().Trim(), tuple.FproTriples[indexTwo].Value[j].ToString().Trim(), "_=", typenameOne);
                            //pro = EQUALTRIPPLE(tuple.Triples[indexOne].Value[i].ToString().Trim(), tuple.Triples[indexTwo].Value[j].ToString().Trim(), typenameOne);
                            if (((typenameOne == "ContinuousFuzzySet" || typenameOne == "DiscreteFuzzySet") && pro != -1) || ((typenameOne != "ContinuousFuzzySet" || typenameOne != "DiscreteFuzzySet") && pro != 0))
                            {
                                switch (operaterStr)
                                {
                                case "equal_in":
                                    minProb += pro * tuple.FproTriples[indexOne].MinProb[i] * tuple.FproTriples[indexTwo].MinProb[j];
                                    maxProb  = Math.Min(1, maxProb + (tuple.FproTriples[indexOne].MaxProb[i] * tuple.FproTriples[indexTwo].MaxProb[j] * pro));
                                    break;

                                case "equal_ig":
                                    minProb += Math.Max(0, tuple.FproTriples[indexOne].MinProb[i] + tuple.FproTriples[indexTwo].MinProb[j] - 1) * pro;
                                    maxProb  = Math.Min(1, maxProb + (Math.Min(tuple.FproTriples[indexOne].MaxProb[i], tuple.FproTriples[indexTwo].MaxProb[j])) * pro);
                                    break;

                                case "equal_me":
                                    minProb = 0;
                                    maxProb = Math.Min(1, maxProb + 0);
                                    break;

                                default: break;
                                }
                            }
                        }
                    }
                }
                else
                if (SelectConditionBLL.isCompareOperator(operaterStr)) // Biểu thức so sánh giữa một thuộc tính với một giá trị
                {
                    indexOne = this.IndexOf(valueOne);                 // vị trí của thuộc tính trong ds các thuộc tính
                    if (indexOne == -1)
                    {
                        return(string.Empty);
                    }

                    if (valueTwo.Contains("'"))
                    {
                        int count = valueTwo.Split(new char[] { '\'' }).Length - 1;

                        if (valueTwo.Substring(0, 1) != "'")
                        {
                            MessageError = "Unclosed quotation mark before the character string " + valueTwo;
                            return(string.Empty);
                        }

                        if (valueTwo.Substring(valueTwo.Length - 1, 1) != "'")
                        {
                            MessageError = "Unclosed quotation mark after the character string " + valueTwo;
                            return(string.Empty);
                        }

                        if (count != 2)
                        {
                            MessageError = "Unclosed quotation mark at the character string " + valueTwo;
                            return(string.Empty);
                        }

                        valueTwo = valueTwo.Remove(0, 1);
                        valueTwo = valueTwo.Remove(valueTwo.Length - 1, 1);
                    }

                    countTripleOne = tuple.FproTriples[indexOne].Value.Count;     // số lượng các cặp xác xuất trong thuộc tính
                    typenameOne    = Attributes[indexOne].FproDataType.TypeName;

                    FProDataTypeBLL dataType = new FProDataTypeBLL();
                    dataType.TypeName     = Attributes[indexOne].FproDataType.TypeName;
                    dataType.DataType     = Attributes[indexOne].FproDataType.DataType;
                    dataType.DomainValues = Attributes[indexOne].FproDataType.DomainValues;
                    dataType.DomainString = Attributes[indexOne].FproDataType.DomainString;

                    if (!dataType.CheckDataTypeOfVariables(valueTwo))
                    {
                        MessageError = String.Format("Conversion failed when converting the varchar value {0} to data type {1}.", valueTwo, typenameOne);
                        return(string.Empty);
                    }
                    else
                    {
                        if (dataType.TypeName == "ContinuousFuzzySet" || dataType.TypeName == "DiscreteFuzzySet")
                        {
                            for (int i = 0; i < countTripleOne; i++)
                            {
                                //calculate prob(A-->B)
                                double pro = this.CompareTriple(tuple.FproTriples[indexOne].Value[i].ToString().Trim(), valueTwo.Trim(), operaterStr, dataType.TypeName);
                                if (pro != -1.0)     // duyệt từng cặp xác xuất và so sánh
                                {
                                    minProb += pro * tuple.FproTriples[indexOne].MinProb[i];
                                    maxProb += pro * tuple.FproTriples[indexOne].MaxProb[i];
                                }
                            }
                        }
                        else
                        {
                            for (int i = 0; i < countTripleOne; i++)
                            {
                                double pro = this.CompareTriple(tuple.FproTriples[indexOne].Value[i].ToString().Trim(), valueTwo.Trim(), operaterStr, dataType.TypeName);
                                if (pro == 1.0)     // duyệt từng cặp xác xuất và so sánh
                                {
                                    minProb += tuple.FproTriples[indexOne].MinProb[i];
                                    maxProb += tuple.FproTriples[indexOne].MaxProb[i];
                                }
                            }
                        }
                    }
                }
                else                         // Biểu thức kết hợp giữa hai khoảng xác suất
                {
                    double   minProbOne, minProbTwo, maxProbOne, maxProbTwo;
                    string[] StrProb;

                    valueOne = valueOne.Replace("[", "");      // [L,U]
                    valueOne = valueOne.Replace("]", "");

                    StrProb    = valueOne.Split(',');
                    minProbOne = Convert.ToDouble(StrProb[0]);
                    maxProbOne = Convert.ToDouble(StrProb[1]);

                    valueTwo = valueTwo.Replace("[", "");      // [L,U]
                    valueTwo = valueTwo.Replace("]", "");

                    StrProb    = valueTwo.Split(',');
                    minProbTwo = Convert.ToDouble(StrProb[0]);
                    maxProbTwo = Convert.ToDouble(StrProb[1]);

                    switch (operaterStr)
                    {
                    case "⊗_ig": minProb = Math.Max(0, minProbOne + minProbTwo - 1); maxProb = Math.Min(maxProbOne, maxProbTwo); break;

                    case "⊗_in": minProb = minProbOne * minProbTwo; maxProb = maxProbOne * maxProbTwo; break;

                    case "⊗_me": minProb = 0; maxProb = 0; break;

                    case "⊕_ig": minProb = Math.Max(minProbOne, minProbTwo); maxProb = Math.Min(1, maxProbOne + maxProbTwo); break;

                    case "⊕_in": minProb = minProbOne + minProbTwo - (minProbOne * minProbTwo); maxProb = maxProbOne + maxProbTwo - (maxProbOne * maxProbTwo); break;

                    case "⊕_me": minProb = Math.Min(1, minProbOne + minProbTwo); maxProb = Math.Min(1, maxProbOne + maxProbTwo); break;

                    case "⊖_ig": minProb = Math.Max(0, minProbOne - maxProbTwo); maxProb = Math.Min(maxProbOne, 1 - minProbTwo); break;

                    case "⊖_in": minProb = minProbOne * (1 - maxProbTwo); maxProb = maxProbOne * (1 - minProbTwo); break;

                    case "⊖_me": minProb = minProbOne; maxProb = Math.Min(maxProbOne, 1 - minProbTwo); break;

                    default: MessageError = "Incorrect syntax near 'where'.";
                        break;
                    }
                }
            }
            catch
            {
                MessageError = "Incorrect syntax near 'where'.";
                return(string.Empty);
            }

            maxProb = 1 > maxProb ? maxProb : 1; // check maxProb
            return(String.Format("[{0},{1}]", minProb, maxProb));
        }