public List <int> GetBestFactors(int dilutionTimes, bool isMRD = false) { if (dilutionTimes == 1) { return new List <int>() { 1 } } ; if (Configurations.Instance.IsGradualPipetting) { return(GetGradualFactors(dilutionTimes)); } //400's factors FactorFinder finder = new FactorFinder(); FactorInfo rootFactor = new FactorInfo(dilutionTimes); List <FactorInfo> childrenFactor = new List <FactorInfo>(); List <FactorInfo> finalFactors = new List <FactorInfo>(); childrenFactor = finder.GetFactors(rootFactor, possibleFactors, finalFactors); List <FactorInfo> thisStepFactorInfos = new List <FactorInfo>(); for (int i = 1; i < Configurations.Instance.DilutionWells; i++) //4 or 6 steps { thisStepFactorInfos = new List <FactorInfo>(); RemoveDuplicated(finalFactors); if (finalFactors.Count != 0) { break; } foreach (var childFactor in childrenFactor) { thisStepFactorInfos.AddRange(finder.GetFactors(childFactor, possibleFactors, finalFactors)); } childrenFactor = RemoveDuplicated(thisStepFactorInfos); if (thisStepFactorInfos.Count == 0) { break; } } finalFactors.AddRange(thisStepFactorInfos); //add last step; if (finalFactors.Count == 0) { throw new Exception("Cannot find factors for dilution times: " + dilutionTimes.ToString()); } int minSum = finalFactors.Min(x => x.factors.Sum()); var best = finalFactors.Where(x => x.factors.Sum() == minSum).First(); //if(isMRD) //{ // int maxSum = finalFactors.Max(x => x.factors.Sum()); // best = finalFactors.Where(x => x.factors.Sum() == maxSum).First(); //} return(best.factors.OrderByDescending(x => x).ToList()); }
private void CheckValidity(List <DilutionInfo> dilutionInfos) { var normalDilutions = dilutionInfos.Where(x => x.type == SampleType.Norm).ToList(); if (normalDilutions.Exists(x => x.dilutionTimes <= 0)) { throw new Exception("稀释倍数必须大于0!"); } //if(dilutionInfos.Exists(x=>x.type == SampleType.MatrixBlank && x.dilutionTimes != 0)) // throw new Exception("MatrixBlank 稀释倍数必须为0!"); if (dilutionInfos.Exists(x => x.dilutionTimes > 6250000)) { throw new Exception("稀释倍数必须不大于6.25M!"); } foreach (var dilutionInfo in dilutionInfos) { if (dilutionInfo.orgVolume * dilutionInfo.dilutionTimes < Configurations.Instance.DilutionVolume) { throw new Exception(string.Format("分析号为:{0}的样品体积太少,无法稀释到{1}", dilutionInfo.analysisNo, Configurations.Instance.DilutionVolume)); } } FactorFinder factorFinder = new FactorFinder(); var validTimes = factorFinder.GetValidDilutionTimes(); foreach (var dilutionInfo in dilutionInfos) { if (!validTimes.Exists(x => x == dilutionInfo.dilutionTimes)) { throw new Exception(string.Format("分析号:{0}样品的稀释倍数:{1}非法!", dilutionInfo.analysisNo, dilutionInfo.dilutionTimes)); } } }