Esempio n. 1
0
        private bool CalculateExpression(List <string> array, double L, double U)
        {
            List <string> stack = new List <string>();

            for (int i = 0; i < array.Count; i++)
            {
                if (!Operator.Contains(array[i]))
                {
                    stack.Add(array[i]);
                }
                else                                                 // Lấy hai giá trị ra khỏi stack và tính toán
                {
                    string valueTwo = stack[stack.Count - 1].Trim(); // get value
                    string valueOne = stack[stack.Count - 2].Trim();
                    stack.RemoveAt(stack.Count - 1);                 // xóa valueTwo
                    stack.RemoveAt(stack.Count - 1);                 // xóa valueOne

                    string value = GetProbInterval(valueOne, valueTwo, array[i].Trim());
                    if (value == string.Empty)
                    {
                        //this.conditionString = string.Empty; //kiem tra lai
                        return(false);
                    }
                    stack.Add(value);
                }
            }

            // Lấy khoảng xác suất của biểu thức chọn sau khi tính toán
            var tupleProp = new ElemProb(stack[0].Trim());

            return(L <= tupleProp.lowerBound && tupleProp.upperBound <= U);  // trả về true nếu khoảng xác biểu thức chọn thỏa mãn xác xuất câu truy vấn
        }
Esempio n. 2
0
        private bool ExpressionValue(string Str) //str is a single expression ex:"(patient.bloodtype_= 'b')"
        {
            // Get Probabilistic Interval
            ElemProb probInterval = convertConditionStrToProbInterVal(Str);

            // Get Selection Expression
            Str = converConditionStringToExpression(Str);
            List <string> array = new List <string>();

            // reverse to postfix notation
            array = SE_PostfixNotation(Str);

            return(CalculateExpression(array, probInterval.lowerBound, probInterval.upperBound));
        }
Esempio n. 3
0
        private string GetProbInterval(string valueOne, string valueTwo, string operaterStr)
        {
            ElemProb prop = null;

            int    indexOne, indexTwo, countValue;
            PTuple tuple = this.tuple;

            //string typenameOne;
            //string typenameTwo;


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

                    if (!Attributes[indexOne].Type.DataType.Equals(Attributes[indexTwo].Type.DataType))
                    {
                        //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);
                    }

                    var low = 0f;
                    var up  = 0f;
                    foreach (var valInAttr1 in tuple.valueSet[(valueOne)])
                    {
                        foreach (var valInAttr2 in tuple.valueSet[(valueTwo)])
                        {
                            if (EQUAL(valInAttr1.Trim(), valInAttr2.Trim(), Attributes[indexOne].Type.DataType))
                            {
                                switch (operaterStr)
                                {
                                case "equal_in":
                                    low += tuple.Ps.lowerBound * tuple.Ps.upperBound;
                                    up   = Math.Min(1, up + tuple.Ps.upperBound * tuple.Ps.upperBound);
                                    break;

                                case "equal_ig":
                                    low += Math.Min(0, tuple.Ps.lowerBound + tuple.Ps.lowerBound - 1);
                                    up   = Math.Min(1, up + Math.Min(tuple.Ps.upperBound, tuple.Ps.upperBound));
                                    break;

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

                                default: break;
                                }
                            }
                        }
                    }
                }
                else
                if (SelectCondition.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 //what is THIS !?
                    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);
                    }

                    PDataType dataType = new PDataType();
                    dataType.TypeName     = Attributes[indexOne].Type.TypeName;
                    dataType.DataType     = Attributes[indexOne].Type.DataType;
                    dataType.Domain       = Attributes[indexOne].Type.Domain;
                    dataType.DomainString = Attributes[indexOne].Type.DomainString;

                    if (!dataType.CheckDataTypeOfVariables(valueTwo))
                    {
                        MessageError = String.Format("Conversion failed when converting the varchar value {0} to data type {1}.", valueTwo, Attributes[indexOne].Type.DataType.ToString());
                        return(string.Empty);
                    }
                    countValue = tuple.valueSet[(valueOne)].Count;

                    prop = new ElemProb(0, 0);

                    foreach (var value in tuple.valueSet[(valueOne)])
                    {
                        if (this.Compare(value.ToString().Trim(), valueTwo.ToString(), operaterStr, Attributes[indexOne].Type.DataType.ToString())) //duyet tung value
                        {
                            try
                            {
                                prop.lowerBound += (1 / (float)countValue);
                                prop.upperBound += (1 / (float)countValue);
                            }
                            catch (Exception ex)
                            {
                                MessageError = ex.Message;
                            }
                            //break;
                        }
                    }
                    prop.lowerBound *= tuple.Ps.lowerBound;
                    prop.upperBound *= tuple.Ps.upperBound;
                }
                else                     // Biểu thức kết hợp giữa hai khoảng xác suất
                {
                    var prop1 = new ElemProb(valueOne);
                    var prop2 = new ElemProb(valueTwo);
                    switch (operaterStr)
                    {
                    case "⊗_ig": prop = new ElemProb(Math.Max(0, prop1.lowerBound + prop2.lowerBound - 1), Math.Min(prop1.upperBound, prop2.upperBound)); break;

                    case "⊗_in": prop = new ElemProb(prop1.lowerBound * prop2.lowerBound, prop1.upperBound * prop2.upperBound); break;

                    case "⊗_me": prop = new ElemProb(0, 0); break;

                    case "⊕_ig": prop = new ElemProb(Math.Max(prop1.lowerBound, prop2.lowerBound), Math.Min(1, prop1.upperBound + prop2.upperBound)); break;

                    case "⊕_in": prop = new ElemProb(prop1.lowerBound + prop2.lowerBound - (prop1.lowerBound * prop2.lowerBound), prop1.upperBound + prop2.upperBound - (prop1.upperBound * prop2.upperBound)); break;

                    case "⊕_me": prop = new ElemProb(Math.Min(1, prop1.lowerBound + prop2.lowerBound), Math.Min(1, prop1.upperBound + prop2.upperBound)); break;

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

            //maxProb = 1 > maxProb ? maxProb : 1; // check maxProb
            if (prop is null)
            {
                return(String.Empty);
            }
            return(String.Format("[{0},{1}]", prop.lowerBound, prop.upperBound));
        }