public ChannelGradient(string[] BlenderNames, float[] Targets, float[] Limits) { float O = 0; for (int i = 0; i < Limits.Length; ++i) { ChannelGradientSegment S = new ChannelGradientSegment(BlenderNames[i], O, Limits[i] - O, Targets[i], Targets[i + 1]); _Segments.Add(Limits[i] - O, S); O += Limits[i]; } }
public void Add(T Value, double Weight) { if (!_Elements.Contains(Value)) { _Elements.Add(Value); _Selector.Add(Weight, Value); } }
public SingleGenerator(string Source, List <Operator <T> > Operators, Dictionary <string, Generator <T> > Generators) { string[] g = Source.Split('|'); foreach (string G in g) { string[] d = G.Split('@'); if (d.Length == 2) { double w = Convert.ToDouble(d[0], System.Globalization.CultureInfo.InvariantCulture); _Generators.Add(w, new SumGenerator <T>(d[1], Operators, Generators)); } else { _Generators.Add(1, new SumGenerator <T>(G, Operators, Generators)); } } }
public PrintRule(ParseBlock Block, List <Operator <T> > Operators, Dictionary <string, Generator <T> > Generators) { string[] def = Block.String.Split(new string[] { "=>" }, StringSplitOptions.None); _Match = new MatchRule <T>(def[0], Operators, Generators); string[] ops = def[1].Split(':'); for (int i = 0; i < ops.Length; ++i) { if (ops[i].Contains('*')) { string[] d = ops[i].Split('*'); _Options.Add(Convert.ToDouble(d[0], System.Globalization.CultureInfo.InvariantCulture), d[1].Trim()); } else { _Options.Add(1, ops[i].Trim()); } } }
public FlagData(ParseBlock Block) { Block.AddParser <FlagTemplate>("flag-template", i => new FlagTemplate(i)); Block.AddParser <GraphNode <Vector2f[]> >("node", i => new GraphNode <Vector2f[]>(Cardamom.Interface.ClassLibrary.Instance.ParseVector2fs(i.String))); foreach (FlagTemplate template in Block.BreakToArray <FlagTemplate>()) { _Templates.Add(template.Frequency, template); } }
public IEnumerable <Formation> Generate(Random Random, FormationParameters Parameters) { WeightedVector <FormationTemplate> choices = new WeightedVector <FormationTemplate>(); foreach (var template in Subtemplates.Where(i => i.Matches(Parameters))) { choices.Add(1 / template.GetExpectedValue(Parameters), template); } if (choices.Length > 0) { return(choices[Random.NextDouble()].Generate(Random, Parameters)); } return(Enumerable.Empty <Formation>()); }
/// <summary> /// LAMBDA算法固定窄巷模糊度 /// 当然,还有其他固定方法,比如取整固定 /// </summary> /// <param name="rovReceiverInfo"></param> /// <param name="refReceeiverInfo"></param> /// <param name="adjustment"></param> /// <param name="fixedWindLaneAmbiCycles"></param> /// <param name="fixedIonFreeAmbiCycles"></param> /// <returns></returns> private bool tryFixNarrowLaneAmbiguityByLAMBDA(EpochInformation rovReceiverInfo, EpochInformation refReceeiverInfo, AdjustResultMatrix adjustment, Vector fixedWindLaneAmbiCycles, ref WeightedVector fixedIonFreeAmbiCycles) { List <string> ambiParamNames = fixedWindLaneAmbiCycles.ParamNames; WeightedVector estIonFreeAmbiVector = adjustment.Estimated.GetWeightedVector(ambiParamNames); double f1 = GnssConst.GPS_L1_FREQ; double f2 = GnssConst.GPS_L2_FREQ; IVector narrowLaneAmbiguity = (estIonFreeAmbiVector.Multiply((f1 + f2) / f1)).Minus(fixedWindLaneAmbiCycles.Multiply(f2 / (f1 - f2))); IMatrix narrowLaneAmbiguityCovariance = estIonFreeAmbiVector.InverseWeight.Multiply((f1 + f2) / f1).Multiply((f1 + f2) / f1); WeightedVector floatNLAmbiCycles = new WeightedVector(narrowLaneAmbiguity, narrowLaneAmbiguityCovariance); floatNLAmbiCycles.ParamNames = estIonFreeAmbiVector.ParamNames; //尝试固定模糊度 //按照权逆阵排序,大的在后面,如果失败后,则删除之 var orderedFloatNLAmbiCycles = floatNLAmbiCycles.GetCovaOrdered(); //模糊度直接用lambda算法进行固定,部分模糊度固定策略 double MaxRatioOfLambda = 3.0; var fixedIntNLAmbiCycles = Gnsser.LambdaAmbiguitySearcher.GetAmbiguity(orderedFloatNLAmbiCycles, MaxRatioOfLambda); if (fixedIntNLAmbiCycles.Count < 1) { return(false); } // 关键问题:模糊度固定是否正确?? //允许整数与浮点数的最大偏差,如 浮点数为 0.1 而整数为 1,则认为失败。 double maxDifferOfIntAndFloatAmbi = 0.35; List <string> failedParams = new List <string>(); foreach (var name in fixedIntNLAmbiCycles.ParamNames) { if (Math.Abs(fixedIntNLAmbiCycles[name] - orderedFloatNLAmbiCycles[name]) > maxDifferOfIntAndFloatAmbi) { double tmp = Math.Abs(fixedIntNLAmbiCycles[name] - orderedFloatNLAmbiCycles[name]); failedParams.Add(name); } } fixedIntNLAmbiCycles.Remove(failedParams); if (fixedIntNLAmbiCycles.Count < 1) { return(false); } //根据固定的宽巷和窄巷模糊度确定无电离层模糊度 foreach (var name in fixedIntNLAmbiCycles.ParamNames) { double fixedIntIonFree = fixedIntNLAmbiCycles[name] * f1 / (f1 + f2) + fixedWindLaneAmbiCycles[name] * f1 * f2 / ((f1 - f2) * (f1 + f2)); if (!fixedIonFreeAmbiCycles.ParamNames.Contains(name)) { fixedIonFreeAmbiCycles.Add(fixedIntIonFree, name); } else { int index = fixedIonFreeAmbiCycles.ParamNames.IndexOf(name); double oldFixedValue = fixedIonFreeAmbiCycles.Data[index]; if (oldFixedValue != fixedIntIonFree) { fixedIonFreeAmbiCycles[index] = fixedIntIonFree; } } } return(true); }
/// <summary> /// 逐历元进行双差模糊度固定和更新 /// 目前只考虑算GPS的 /// </summary> /// <param name="rovReceiverInfo"></param> /// <param name="refReceeiverInfo"></param> /// <param name="adjustment"></param> /// <param name="currentBasePrn"></param> /// <returns></returns> public WeightedVector Process(EpochInformation rovReceiverInfo, EpochInformation refReceeiverInfo, AdjustResultMatrix adjustment, SatelliteNumber currentBasePrn) { double Interval = rovReceiverInfo.ObsInfo.Interval; if (Interval == 0) { MinArcGap = 31.1; } else { MinArcGap = Interval + 1.1; } this.CurrentBasePrn = currentBasePrn; //如何模糊度子集维数小于4,则该历元所有模糊度采用实数解,参考论文 //如果基准星发生变化,用于存储固定模糊度的字典应全部清空 if (currentBasePrn != LastBasePrn || rovReceiverInfo[currentBasePrn].IsUnstable == true || refReceeiverInfo[currentBasePrn].IsUnstable == true) { DoubleDifferWideLaneAmbiCyclesDic = new SortedDictionary <string, DDWideLineAmbiCycles>(); FixIonFreeAmbiCyclesInfo = new Vector(); LastBasePrn = currentBasePrn; } //存储基准星 LastBasePrn = currentBasePrn; WeightedVector fixIonFreeAmbiCycles = new WeightedVector(); if (FixIonFreeAmbiCyclesInfo.Count > 0) //对曾经已经固定过的双差模糊度,如果当前双差卫星状态没有发生变化,则直接传递过来。 { for (int i = 0; i < rovReceiverInfo.EnabledPrns.Count; i++) { SatelliteNumber item = rovReceiverInfo.EnabledPrns[i]; if (item != currentBasePrn) { string paramName = item.ToString() + "-" + CurrentBasePrn + Gnsser.ParamNames.PhaseLengthSuffix; if (FixIonFreeAmbiCyclesInfo.ParamNames.Contains(paramName)) { if (rovReceiverInfo[item].IsUnstable == true || rovReceiverInfo[currentBasePrn].IsUnstable == true || refReceeiverInfo[item].IsUnstable == true || refReceeiverInfo[currentBasePrn].IsUnstable == true) { continue; } else { int index = FixIonFreeAmbiCyclesInfo.ParamNames.IndexOf(paramName); fixIonFreeAmbiCycles.Add(FixIonFreeAmbiCyclesInfo.Data[index], FixIonFreeAmbiCyclesInfo.ParamNames[index]); } } } } } if (!rovReceiverInfo.SatelliteTypes.Contains(SatelliteType.G) || !refReceeiverInfo.SatelliteTypes.Contains(SatelliteType.G)) { FixIonFreeAmbiCyclesInfo = fixIonFreeAmbiCycles; if (fixIonFreeAmbiCycles.Count > minFixedAmbiCount) { return(fixIonFreeAmbiCycles); } else { return(null); } } Vector fixedIntWideLineAmbiCycles = null; if (!tryFixWideLaneAmbguity(rovReceiverInfo, refReceeiverInfo, out fixedIntWideLineAmbiCycles)) { //宽巷固定失败 FixIonFreeAmbiCyclesInfo = fixIonFreeAmbiCycles; if (fixIonFreeAmbiCycles.Count > minFixedAmbiCount) { return(fixIonFreeAmbiCycles); } else { return(null); } } //如何模糊度子集维数小于4,则该历元所有模糊度采用实数解 if (fixedIntWideLineAmbiCycles.Count < minFixedAmbiCount)//1 { FixIonFreeAmbiCyclesInfo = fixIonFreeAmbiCycles; if (fixIonFreeAmbiCycles.Count > minFixedAmbiCount) { return(fixIonFreeAmbiCycles); } else { return(null); } } //fix narrow-lane ambiguity //AR mode: PPP_AR // stat = fxi_amb_NL_ROUND(rovReceiverInfo, Adjustment, sat1, sat2, NW, m); //AR mode: PPP_AR ILS if (!tryFixNarrowLaneAmbiguityByLAMBDA(rovReceiverInfo, refReceeiverInfo, adjustment, fixedIntWideLineAmbiCycles, ref fixIonFreeAmbiCycles)) { //窄巷固定失败 FixIonFreeAmbiCyclesInfo = fixIonFreeAmbiCycles; if (fixIonFreeAmbiCycles.Count > minFixedAmbiCount) { return(fixIonFreeAmbiCycles); } else { return(null); } } //存储已经固定成功的模糊度 if (fixIonFreeAmbiCycles.Count > FixIonFreeAmbiCyclesInfo.Count) { string ssss = "hahahahaha"; } FixIonFreeAmbiCyclesInfo = fixIonFreeAmbiCycles; //for (int i = 0; i < fixIonFreeAmbiCycles.Count; i++) //{ // var newParam = fixIonFreeAmbiCycles.ParamNames[i]; // var newFixedValue = fixIonFreeAmbiCycles.Data[i]; // if (!FixIonFreeAmbiCyclesInfo.ParamNames.Contains(newParam)) // { FixIonFreeAmbiCyclesInfo.Add(newFixedValue, newParam); } // else // { // int index = FixIonFreeAmbiCyclesInfo.ParamNames.IndexOf(newParam); // double oldFixedValue = FixIonFreeAmbiCyclesInfo.Data[index]; // if (oldFixedValue != newFixedValue) // { // FixIonFreeAmbiCyclesInfo[index] = newFixedValue; // } // } //} if (fixIonFreeAmbiCycles.Count > minFixedAmbiCount) { return(fixIonFreeAmbiCycles); } else { return(null); } }