Exemple #1
0
        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];
            }
        }
Exemple #2
0
 public void Add(T Value, double Weight)
 {
     if (!_Elements.Contains(Value))
     {
         _Elements.Add(Value);
         _Selector.Add(Weight, Value);
     }
 }
Exemple #3
0
 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));
         }
     }
 }
Exemple #4
0
 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());
         }
     }
 }
Exemple #5
0
        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);
            }
        }
Exemple #6
0
        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>());
        }
Exemple #7
0
        /// <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);
        }
Exemple #8
0
        /// <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);
            }
        }