// Path: src/main/java/net/tradelib/functors/StdDev.java
// public class StdDev {
//    private EvictingQueue<Double> eq;
//    private double mean;
//    private double var;
//    private int count;
//    private int n;
//    private double dn; // N as a double
//    
//    public StdDev(int n) {
//       this.mean = 0.0;
//       this.var = 0.0;
//       this.count = 0;
//       this.n = n;
//       this.dn = n;
//       this.eq = EvictingQueue.create(this.n);
//    }
//    
//    public int getLength() { return n; }
//    public int getCount() { return count; }
//    
//    public double add(double value)
//    {
//       // The number of elements including the one added
//       ++count;
//       if(count > n) {
//          double oldMean = mean;
//          mean += (value - eq.peek()) / dn;
//          var += (value - mean + eq.peek() - oldMean)*(value - eq.peek()) / (dn - 1.0);
//       } else if(count == n) {
//          double newMean = mean + (value - mean) / dn;
//          double newVar = var + (value - mean) * (value - newMean); 
// 
//          mean = newMean;
//          var = newVar / (dn - 1.0);
//       } else if(count > 1) {
//          double dd = value - mean;
//          double newMean = mean + dd / count;
//          double newVar = var + dd * (value - newMean);
// 
//          mean = newMean;
//          var = newVar;
//       } else {
//          mean = value;
//          var = 0.0;
//       }
// 
//       // Add the value to the buffer
//       eq.add(value);
//       
//       return stdDev();
//    }
// 
//    public double sma() { return count >= n ? mean : Double.NaN; }
//    public double var() { return count >= n ? var : Double.NaN; }
//    public double stdDev() { return count >= n ? Math.sqrt(var) : Double.NaN; }
// }


import static org.junit.Assert.*;
import net.tradelib.functors.StdDev;
import org.junit.Test;
// Copyright 2015 by Ivan Popivanov
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package net.tradelib.functors;



public class StdDevTest {

   @Test
   public void test() {
      String [] inputs = {"124.41","125.34","125.68","125.92","127.32","129.32","131.65","131.39","129.65","131.07",
                          "131.82","131.82","132.82","134.91","133.19","134.96","133.4","132.92","134.77","134.36"};
      String [] expectedSma = {null,null,null,null,null,null,null,null,null,"128.175","128.916","129.564","130.278",
                               "131.177","131.764","132.328","132.503","132.656","133.168","133.497"};
      String [] expectedStdDev = {null,null,null,null,null,null,null,null,null,"2.75949","2.627907","2.440388",
                                  "2.211524","2.065559","1.637371","1.67296","1.685639","1.642269","1.377799","1.202858"};
      
// Path: src/main/java/net/tradelib/functors/StdDev.java
// public class StdDev {
//    private EvictingQueue<Double> eq;
//    private double mean;
//    private double var;
//    private int count;
//    private int n;
//    private double dn; // N as a double
//    
//    public StdDev(int n) {
//       this.mean = 0.0;
//       this.var = 0.0;
//       this.count = 0;
//       this.n = n;
//       this.dn = n;
//       this.eq = EvictingQueue.create(this.n);
//    }
//    
//    public int getLength() { return n; }
//    public int getCount() { return count; }
//    
//    public double add(double value)
//    {
//       // The number of elements including the one added
//       ++count;
//       if(count > n) {
//          double oldMean = mean;
//          mean += (value - eq.peek()) / dn;
//          var += (value - mean + eq.peek() - oldMean)*(value - eq.peek()) / (dn - 1.0);
//       } else if(count == n) {
//          double newMean = mean + (value - mean) / dn;
//          double newVar = var + (value - mean) * (value - newMean); 
// 
//          mean = newMean;
//          var = newVar / (dn - 1.0);
//       } else if(count > 1) {
//          double dd = value - mean;
//          double newMean = mean + dd / count;
//          double newVar = var + dd * (value - newMean);
// 
//          mean = newMean;
//          var = newVar;
//       } else {
//          mean = value;
//          var = 0.0;
//       }
// 
//       // Add the value to the buffer
//       eq.add(value);
//       
//       return stdDev();
//    }
// 
//    public double sma() { return count >= n ? mean : Double.NaN; }
//    public double var() { return count >= n ? var : Double.NaN; }
//    public double stdDev() { return count >= n ? Math.sqrt(var) : Double.NaN; }
// }


// Path: src/test/java/net/tradelib/functors/StdDevTest.java
import static org.junit.Assert.*;
import net.tradelib.functors.StdDev;
import org.junit.Test;

// Copyright 2015 by Ivan Popivanov
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package net.tradelib.functors;



public class StdDevTest {

   @Test
   public void test() {
      String [] inputs = {"124.41","125.34","125.68","125.92","127.32","129.32","131.65","131.39","129.65","131.07",
                          "131.82","131.82","132.82","134.91","133.19","134.96","133.4","132.92","134.77","134.36"};
      String [] expectedSma = {null,null,null,null,null,null,null,null,null,"128.175","128.916","129.564","130.278",
                               "131.177","131.764","132.328","132.503","132.656","133.168","133.497"};
      String [] expectedStdDev = {null,null,null,null,null,null,null,null,null,"2.75949","2.627907","2.440388",
                                  "2.211524","2.065559","1.637371","1.67296","1.685639","1.642269","1.377799","1.202858"};
      
      StdDev sd = new StdDev(10);