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)); }
public ClassifyingItem(ClassifyingItem next, Func <CurveBaseInfo, bool> classifyFunc, CurveClass curveClass) { _next = next; _classifyFunc = classifyFunc; _curveClass = curveClass; }
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; } }
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)); } }