code: package resa.optimize;
  
  import java.util.Objects;
  
  /**
   * Created by Tom.fu on 16/4/2014.
   */
  public class CntMeanVar {
      private long count = 0;
      private double sum = 0;
      private double squareSum = 0;
  
      ///Add one measured valued
      void addOneNumber(double num) {
          count++;
          sum += num;
          squareSum += (num * num);
      }
  
      ///Add aggregated measure values in one window
      void addAggWin(int aggCount, double aggSum, double aggSquareSum) {
          count += aggCount;
          sum += aggSum;
          squareSum += aggSquareSum;
      }
  
      void addCMV(CntMeanVar cmv) {
          ///cmv should not be null here
          Objects.requireNonNull(cmv);
          count += cmv.count;
          sum += cmv.sum;
          squareSum += cmv.squareSum;
      }
  
      void clear() {
          count = 0;
          sum = 0;
          squareSum = 0;
      }
  
      long getCount() {
          return count;
      }
  
      double getSum() {
          return sum;
      }
  
      double getAvg() {
          return count == 0 ? 0.0 : sum / (double) count;
      }
  
      double getAvg2() {
          return count == 0 ? 0.0 : squareSum / (double) count;
      }
  
      double getVar() {
          double avg = getAvg();
          return getAvg2() - avg * avg;
      }
  
      ///Square coefficient of variation (Scv), scv(X) = Var(X) / [E(X)*E(X)];
      double getScv() {
          return count == 0 ? 0.0 : (getAvg2() / (getAvg() * getAvg()) - 1.0);
      }
  
      String toCMVString() {
          return "Count: " + getCount()
                  + String.format(", sum: %.2f", getSum())
                  + String.format(", avg: %.5f", getAvg())
                  + String.format(", var: %.5f", getVar())
                  + String.format(", scv: %.5f", getScv());
      }
  
      String toCMVStringShort() {
          return "cnt:" + getCount()
                  + String.format(",avg:%.2f", getAvg())
                  + String.format(",scv:%.2f", getScv());
      }
  }
  