Ejemplo n.º 1
0
        public static Classificator Create(IReadOnlyList <Func <CurveBaseInfo, bool> > conditions)
        {
            conditions = conditions.Reverse().ToArray();
            ClassifyingItem chain = null;

            for (var i = 0; i < conditions.Count; i++)
            {
                var curveClass = new CurveClass()
                {
                    ClassNumber = conditions.Count - i
                };
                chain = new ClassifyingItem(chain, conditions[i], curveClass);
            }

            return(new Classificator(chain));
        }
        public CurveClass Classify(CurveBaseInfo curveInfo)
        {
            var result = new CurveClass();

            if (curveInfo.EdgeB <= Math.Pow(curveInfo.FieldOrder, 0.25))
            {
                result.ClassNumber = 1;
            }
            else if (curveInfo.EdgeB <= Math.Pow(curveInfo.FieldOrder, 0.33))
            {
                result.ClassNumber = 2;
            }
            else if (curveInfo.EdgeB <= Math.Pow(curveInfo.FieldOrder, 0.5))
            {
                result.ClassNumber = 3;
            }
            else
            {
                result.ClassNumber = 4;
            }

            return(result);
        }
        public CurveClass Classify(CurveBaseInfo curveInfo)
        {
            var result = new CurveClass();

            if (curveInfo.EdgeB <= 100)
            {
                result.ClassNumber = 1;
            }
            else if (curveInfo.EdgeB <= 1000)
            {
                result.ClassNumber = 2;
            }
            else if (curveInfo.EdgeB <= 10000)
            {
                result.ClassNumber = 3;
            }
            else
            {
                result.ClassNumber = 4;
            }

            return(ClassifyingItem.Classify(curveInfo));
        }
Ejemplo n.º 4
0
 public ClassifyingItem(ClassifyingItem next, Func <CurveBaseInfo, bool> classifyFunc, CurveClass curveClass)
 {
     _next         = next;
     _classifyFunc = classifyFunc;
     _curveClass   = curveClass;
 }
Ejemplo n.º 5
0
        public static MetalTemperatureClass MultiMetalTemperatureCaculate(List <PValue> valueList, double LimitHH, double LimitH, double LimitRP, double LimitOO, double LimitRN, double LimitL, double LimitLL)
        {
            try
            {
                List <MetalTemperatureClass> returnClass = new List <MetalTemperatureClass>();

                MetalTemperatureClass newClass = new MetalTemperatureClass();
                int l = 1;
                List <CurveClass> ccList = new List <CurveClass>();
                foreach (PValue childItem in valueList)
                {
                    CurveClass cc = new CurveClass();
                    cc.x = l;
                    cc.y = childItem.Value;
                    ccList.Add(cc);
                    l++;
                }
                double Min     = ccList[0].y;
                double MinN    = 1;
                double Max     = ccList[0].y;
                double MaxN    = 1;
                double Sum     = 0;
                double HHG     = 0;
                double HHHB    = 0;
                double HRPB    = 0;
                double RP0B    = 0;
                double RM0B    = 0;
                double RMLB    = 0;
                double LLLB    = 0;
                double LLL     = 0;
                double RPRMB   = 0;
                double HLB     = 0;
                double HHHLLLB = 0;
                double HHLLGL  = 0;
                double HG      = 0;
                double LL      = 0;

                foreach (CurveClass childItem in ccList)
                {
                    if (Min > childItem.y)
                    {
                        Min  = childItem.y;
                        MinN = childItem.x;
                    }
                    if (Max < childItem.y)
                    {
                        Max  = childItem.y;
                        MaxN = childItem.x;
                    }
                    Sum += childItem.y;

                    if (childItem.y > LimitHH)
                    {
                        HHG++;
                    }
                    if (childItem.y > LimitH)
                    {
                        HG++;
                    }
                    if (childItem.y <= LimitHH && childItem.y > LimitH)
                    {
                        HHHB++;
                    }
                    if (childItem.y <= LimitH && childItem.y > LimitRP)
                    {
                        HRPB++;
                    }
                    if (childItem.y <= LimitRP && childItem.y > LimitOO)
                    {
                        RP0B++;
                    }
                    if (childItem.y <= LimitOO && childItem.y > LimitRN)
                    {
                        RM0B++;
                    }
                    if (childItem.y <= LimitRN && childItem.y > LimitL)
                    {
                        RMLB++;
                    }
                    if (childItem.y <= LimitL && childItem.y > LimitLL)
                    {
                        LLLB++;
                    }
                    if (childItem.y <= LimitL)
                    {
                        LL++;
                    }
                    if (childItem.y <= LimitLL)
                    {
                        LLL++;
                    }
                }
                RPRMB         = RP0B + RM0B;
                HLB           = HRPB + RP0B + RM0B + RMLB;
                HHHLLLB       = HHHB + LLLB;
                HHLLGL        = HHG + LLL;
                newClass.Min  = Min.ToString();
                newClass.MinN = MinN.ToString();
                newClass.Max  = Max.ToString();
                newClass.MaxN = MaxN.ToString();
                double Avg = Math.Round(Sum / (double)(ccList.Count), 3);
                newClass.Avg = Avg.ToString();
                double xi   = Math.Abs(Avg - ccList[0].y);
                double AvgN = 1;

                double[] xList = new double[ccList.Count];
                double[] yList = new double[ccList.Count];
                int      n     = 0;
                foreach (CurveClass childItem in ccList)
                {
                    xList[n] = childItem.x;
                    yList[n] = childItem.y;
                    if (xi > Math.Abs(Avg - childItem.y))
                    {
                        xi   = Math.Abs(Avg - childItem.y);
                        AvgN = childItem.x;
                    }
                    n++;
                }
                double dMaxB  = ccList[1].y - ccList[0].y;
                double dMaxBN = 1;
                for (int i = 1; i < ccList.Count - 1; i++)
                {
                    if (dMaxB < ccList[i].y - ccList[i - 1].y)
                    {
                        dMaxB  = ccList[i].y - ccList[i - 1].y;
                        dMaxBN = ccList[i - 1].x;
                    }
                }
                newClass.AvgN   = AvgN.ToString();
                newClass.dX     = (Max - Min).ToString();
                newClass.dXNR   = Math.Round((MaxN - MinN) / (double)(ccList.Count), 3).ToString();
                newClass.dMaxB  = AvgN.ToString();
                newClass.dMaxBN = AvgN.ToString();
                newClass.sigma  = AlgorithmHelper.StandardDeviationSolve(ccList).ToString();
                double lk = 0;
                double lb = 0;
                AlgorithmHelper.LinearRegressionSolve(ccList, ref lk, ref lb);
                newClass.lk = lk.ToString();
                newClass.lb = lb.ToString();
                List <double> lY = new List <double>();
                List <double> lX = new List <double>();
                foreach (CurveClass lcItem in ccList)
                {
                    lY.Add(lcItem.y);
                    lX.Add(lcItem.x);
                }
                List <double> lYTest = new List <double>();
                foreach (double fdItem in lX)
                {
                    lYTest.Add(lk * fdItem + lb);
                }
                double lR = GoodnessOfFit.RSquared(lY, lYTest);
                newClass.lr = lR.ToString();
                double[] res = Fit.Polynomial(xList, yList, 2);
                newClass.qa = Math.Round(res[2], 3).ToString();
                newClass.qb = Math.Round(res[1], 3).ToString();
                newClass.qc = Math.Round(res[0], 3).ToString();
                List <double> qYTest = new List <double>();
                foreach (double qdItem in xList)
                {
                    qYTest.Add(res[2] * Math.Pow(qdItem, 2) + res[1] * qdItem + res[0]);
                }
                double qR = GoodnessOfFit.RSquared(yList, qYTest);
                newClass.qr = qR.ToString();
                double Bulge  = (ccList[1].y - ccList[0].y) * 2;
                double BulgeN = 1;
                double Cave   = (ccList[1].y - ccList[0].y) * 2;
                double CaveN  = 1;
                for (int i = 1; i < ccList.Count - 1; i++)
                {
                    double b = 0;
                    if (i == ccList.Count - 1)
                    {
                        b = (ccList[i].y - ccList[i - 1].y) * 2;
                    }
                    else
                    {
                        b = ccList[i].y * 2 - ccList[i - 1].y - ccList[i + 1].y;
                    }
                    if (Bulge < b)
                    {
                        Bulge  = b;
                        BulgeN = ccList[i].x;
                    }
                    if (Cave > b)
                    {
                        Cave  = b;
                        CaveN = ccList[i].x;
                    }
                }
                newClass.Bulge   = Bulge.ToString();
                newClass.BulgeN  = BulgeN.ToString();
                newClass.Cave    = Cave.ToString();
                newClass.CaveN   = CaveN.ToString();
                newClass.HHG     = Math.Round(HHG / (double)(ccList.Count), 3).ToString();
                newClass.HHHB    = Math.Round(HHHB / (double)(ccList.Count), 3).ToString();
                newClass.HRPB    = Math.Round(HRPB / (double)(ccList.Count), 3).ToString();
                newClass.RP0B    = Math.Round(RP0B / (double)(ccList.Count), 3).ToString();
                newClass.RM0B    = Math.Round(RM0B / (double)(ccList.Count), 3).ToString();
                newClass.RMLB    = Math.Round(RMLB / (double)(ccList.Count), 3).ToString();
                newClass.LLLB    = Math.Round(LLLB / (double)(ccList.Count), 3).ToString();
                newClass.LLL     = Math.Round(LLL / (double)(ccList.Count), 3).ToString();
                newClass.RPRMB   = Math.Round(RPRMB / (double)(ccList.Count), 3).ToString();
                newClass.HLB     = Math.Round(HLB / (double)(ccList.Count), 3).ToString();
                newClass.HHHLLLB = Math.Round(HHHLLLB / (double)(ccList.Count), 3).ToString();
                newClass.HHLLGL  = Math.Round(HHLLGL / (double)(ccList.Count), 3).ToString();
                newClass.HG      = Math.Round(HG / (double)(ccList.Count), 3).ToString();
                newClass.LL      = Math.Round(LL / (double)(ccList.Count), 3).ToString();
                //returnClass.Add(newClass);

                return(newClass);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Ejemplo n.º 6
0
        public static Results Calcu(List <PValue>[] inputs, CalcuInfo calcuinfo)
        {
            //公用变量
            bool   _errorFlag   = false;
            string _errorInfo   = "";
            bool   _warningFlag = false;
            string _warningInfo = "";
            bool   _fatalFlag   = false;
            string _fatalInfo   = "";

            int i;

            //0输出初始化:该算法如果没有有效输入值(inputs为null)或者输入值得有效值为null,给出的计算结果。值为0,计算标志位为StatusConst.InputIsNull
            List <PValue>[] results = new List <PValue> [1];
            for (i = 0; i < results.Length; i++)
            {
                results[i] = new List <PValue>();
            }

            try
            {
                //读取参数

                string   mode;
                string[] paras = calcuinfo.fparas.Split(';');
                mode = paras[0];
                double    equSigma     = 0;
                int       equSigmaMaxP = 0;
                int       equSigmaMinP = 0;
                ArrayList equSigmaList = new ArrayList();
                if (mode == "S")
                {
                    int l = 1;
                    List <CurveClass> MessageInList = new List <CurveClass>();
                    int point = 1;
                    foreach (List <PValue> item in inputs)
                    {
                        List <CurveClass> childList = new List <CurveClass>();
                        int childL = 1;
                        foreach (PValue childItem in item)
                        {
                            CurveClass cClass = new CurveClass();
                            cClass.x = l;
                            cClass.y = childItem.Value;
                            MessageInList.Add(cClass);
                            CurveClass childClass = new CurveClass();
                            childClass.x = childL++;
                            childClass.y = childItem.Value;
                            childList.Add(childClass);
                            l++;
                        }
                        equSigmaList.Add(new DictionaryEntry(point++, AlgorithmHelper.StandardDeviationSolve(childList)));
                    }
                    equSigma     = AlgorithmHelper.StandardDeviationSolve(MessageInList);
                    equSigmaMaxP = Convert.ToInt32(((DictionaryEntry)equSigmaList[0]).Key);
                    equSigmaMinP = Convert.ToInt32(((DictionaryEntry)equSigmaList[0]).Key);
                    double equSigmaMax = Convert.ToDouble(((DictionaryEntry)equSigmaList[0]).Value);
                    double equSigmaMin = Convert.ToDouble(((DictionaryEntry)equSigmaList[0]).Value);
                    foreach (var item in equSigmaList)
                    {
                        if (equSigmaMax < Convert.ToDouble(((DictionaryEntry)item).Value))
                        {
                            equSigmaMax  = Convert.ToDouble(((DictionaryEntry)item).Value);
                            equSigmaMaxP = Convert.ToInt32(((DictionaryEntry)item).Key);
                        }
                        if (equSigmaMin > Convert.ToDouble(((DictionaryEntry)item).Value))
                        {
                            equSigmaMin  = Convert.ToDouble(((DictionaryEntry)item).Value);
                            equSigmaMinP = Convert.ToInt32(((DictionaryEntry)item).Key);
                        }
                    }
                }
                else
                {
                    double     maxSigma         = inputs[0][0].Value;
                    List <int> equSigmaMaxPList = new List <int>();
                    List <int> equSigmaMinPList = new List <int>();
                    foreach (List <PValue> item in inputs)
                    {
                        equSigmaMaxPList.Add(Convert.ToInt32(item[1].Value));
                        equSigmaMinPList.Add(Convert.ToInt32(item[2].Value));
                        foreach (PValue childItem in item)
                        {
                            if (maxSigma < childItem.Value)
                            {
                                maxSigma = childItem.Value;
                            }
                        }
                    }
                    equSigma     = maxSigma * 0.75;
                    equSigmaMaxP = equSigmaMaxPList.GroupBy(x => x).OrderBy(y => y.Count()).First().Key;
                    equSigmaMinP = equSigmaMinPList.GroupBy(x => x).OrderBy(y => y.Count()).First().Key;
                }
                results[0].Add(new PValue(equSigma, calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[0].Add(new PValue(equSigmaMaxP, calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[0].Add(new PValue(equSigmaMinP, calcuinfo.fstarttime, calcuinfo.fendtime, 0));

                return(new Results(results, _errorFlag, _errorInfo, _warningFlag, _warningInfo, _fatalFlag, _fatalInfo));
            }
            catch (Exception ex)
            {
                //计算中出任何错误,则需要记录log
                //LogHelper.Write(LogType.Error, "计算模块错误!");
                //记录计算模块的名称、当前标签、起始时间、结束时间
                //string moduleInfo = string.Format("——计算模块的名称是:{0},当前计算源标签是:{1},计算起始时间是:{2},计算结束时间是:{3}。", calcuInfo.fmodulename, calcuInfo.sourcetagname, calcuinfo.fstarttime.ToString(), calcuinfo.fendtime.ToString());
                //LogHelper.Write(LogType.Error, moduleInfo);
                //计算引擎报错具体信息
                //string errInfo = string.Format("——具体报错信息:{0}。", ex.ToString());
                //LogHelper.Write(LogType.Error, errInfo);
                //返回null供计算引擎处理
                _fatalFlag = true;
                _fatalInfo = ex.ToString();
                return(new Results(results, _errorFlag, _errorInfo, _warningFlag, _warningInfo, _fatalFlag, _fatalInfo));
            }
        }