private void calculateEstimatedRankContributions(XElement element, string value, XElement rankcontrib, int n)
        {
            RankLog      ranklog    = RankLog.CreateRankLogFromXml(value);
            RankLogStage finalStage = ranklog.FinalRankStage;

            XElement result = new XElement("result");

            result.Add(new XAttribute("pos", n));

            foreach (var feature in finalStage.Features)
            {
                result.Add(new XAttribute(feature.Name, feature.EstimatedRankContribution()));
            }

            // add external boost. "Rank" returned with results - "rank_after" from the last stage in RankXML
            XElement rank = element.Element("Rank");

            double finalRank     = double.Parse(rank.Value);
            double externalBoost = rank != null ? (Math.Round(finalRank - finalStage.RankAfter, 4)) : 0.0;
            double threshold     = 1.0E-4;

            if (Math.Abs(externalBoost) < threshold)
            {
                externalBoost = 0;
            }

            result.Add(new XAttribute("ExternalBoost", externalBoost));
            result.Add(new XElement("Rank", Math.Round(finalRank, 3)));

            rankcontrib.Add(result);
        }
        protected override void AddItemProperty(PSObject item, string key, object value)
        {
            if (key.Equals("RankDetail", StringComparison.InvariantCultureIgnoreCase))
            {
                var rlog = RankLog.CreateRankLogFromXml((string)value);

                RankLogStage stage = rlog.FinalRankStage;

                foreach (var feature in stage.Features)
                {
                    item.Properties.Add(
                        new PSVariableProperty(
                            new PSVariable(feature.Name, feature.EstimatedRankContribution())));
                }
            }
            else
            {
                base.AddItemProperty(item, key, value);
            }
        }