/// <summary>
        /// Adds a stats object with another type of stats object. The result
        /// should be equivalent, up to the effects of numerical imprecision,
        /// as if in addition to all the values this object has seen, it has
        /// also seen the values added to the other object.
        /// </summary>
        /// <param name="s"></param>
        public void Add(SummaryStatisticsBase s)
        {
            double delta = s.Mean - Mean;
            double na    = Count;
            double nb    = s.Count;
            double nx    = na + nb;

            if (nb == 0.0)
            {
                return; // No-op.
            }
            M2            += s.M2 + delta * delta * na * nb / nx;
            Count         += s.Count;
            Mean          += delta * nb / nx;
            RawCount      += s.RawCount;
            NonzeroCount  += s.NonzeroCount;
            NonzeroWeight += s.NonzeroWeight;

            if (Max < s.Max)
            {
                Max = s.Max;
            }
            if (Min > s.Min)
            {
                Min = s.Min;
            }
        }
        public override bool Equals(object obj)
        {
            SummaryStatisticsBase s = obj as SummaryStatisticsBase;

            if (s == null)
            {
                return(false);
            }
            return(s.RawCount == RawCount && s.Count == Count &&
                   s.Mean == Mean && s.M2 == M2 && s.Min == Min &&
                   s.Max == Max && s.NonzeroCount == NonzeroCount);
        }