// Path: core/src/main/java/com/caseystella/analytics/DataPoint.java
// public class DataPoint {
//     private long timestamp;
//     private double value;
//     private Map<String, String> metadata;
//     private String source;
// 
//     public DataPoint() {
// 
//     }
// 
//     public DataPoint(long timestamp, double value, Map<String, String> metadata, String source) {
//         this.timestamp = timestamp;
//         this.value = value;
//         this.metadata = metadata;
//         this.source = source;
//     }
// 
//     public String getSource() {
//         return source;
//     }
// 
//     public void setSource(String source) {
//         this.source = source;
//     }
// 
// 
// 
//     public long getTimestamp() {
//         return timestamp;
//     }
// 
//     public void setTimestamp(long timestamp) {
//         this.timestamp = timestamp;
//     }
// 
//     public double getValue() {
//         return value;
//     }
// 
//     public void setValue(double value) {
//         this.value = value;
//     }
// 
//     public Map<String, String> getMetadata() {
//         return metadata;
//     }
// 
//     public void setMetadata(Map<String, String> metadata) {
//         this.metadata = metadata;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         DataPoint dataPoint = (DataPoint) o;
// 
//         if (getTimestamp() != dataPoint.getTimestamp()) return false;
//         if (Double.compare(dataPoint.getValue(), getValue()) != 0) return false;
//         if (getMetadata() != null ? !getMetadata().equals(dataPoint.getMetadata()) : dataPoint.getMetadata() != null)
//             return false;
//         return source != null ? source.equals(dataPoint.source) : dataPoint.source == null;
// 
//     }
// 
//     @Override
//     public int hashCode() {
//         int result;
//         long temp;
//         result = (int) (getTimestamp() ^ (getTimestamp() >>> 32));
//         temp = Double.doubleToLongBits(getValue());
//         result = 31 * result + (int) (temp ^ (temp >>> 32));
//         result = 31 * result + (getMetadata() != null ? getMetadata().hashCode() : 0);
//         result = 31 * result + (source != null ? source.hashCode() : 0);
//         return result;
//     }
//     @Override
//     public String toString() {
//         return "(" +
//                 "timestamp=" + timestamp +
//                 ", value=" + value +
//                 ", metadata=" + metadata +
//                 ", source=" + source+
//                 ')';
//     }
// 
// }
// 
// Path: core/src/main/java/com/caseystella/analytics/distribution/scaling/ScalingFunctions.java
// public enum ScalingFunctions implements ScalingFunction {
//     NONE(new ScalingFunction() {
// 
//         @Override
//         public double scale(double val, GlobalStatistics stats) {
//             return val;
//         }
//     })
//    ,SHIFT_TO_POSITIVE(new DefaultScalingFunctions.ShiftToPositive())
// 
//     ,SQUEEZE_TO_UNIT( new DefaultScalingFunctions.SqueezeToUnit())
// 
//     ,FIXED_MEAN_UNIT_VARIANCE(new DefaultScalingFunctions.FixedMeanUnitVariance())
//     ,ZERO_MEAN_UNIT_VARIANCE(new DefaultScalingFunctions.ZeroMeanUnitVariance())
//     ;
//     private ScalingFunction _func;
//     ScalingFunctions(ScalingFunction func) {
//         _func = func;
//     }
// 
//     @Override
//     public double scale(double val, GlobalStatistics globalStatistics) {
//         return _func.scale(val, globalStatistics);
//     }
// }


import com.caseystella.analytics.DataPoint;
import com.caseystella.analytics.distribution.scaling.ScalingFunctions;
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
import org.junit.Assert;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
package com.caseystella.analytics.distribution;



public class DistributionTest {
    @Test
    public void testQuantiles() {
        Random r = new Random(0);
        List<DataPoint> points = new ArrayList<>();
        DescriptiveStatistics stats = new DescriptiveStatistics();
        Distribution distribution = null;
        for(int i = 0; i < 100;++i) {
            double val = r.nextDouble()*1000;
// Path: core/src/main/java/com/caseystella/analytics/DataPoint.java
// public class DataPoint {
//     private long timestamp;
//     private double value;
//     private Map<String, String> metadata;
//     private String source;
// 
//     public DataPoint() {
// 
//     }
// 
//     public DataPoint(long timestamp, double value, Map<String, String> metadata, String source) {
//         this.timestamp = timestamp;
//         this.value = value;
//         this.metadata = metadata;
//         this.source = source;
//     }
// 
//     public String getSource() {
//         return source;
//     }
// 
//     public void setSource(String source) {
//         this.source = source;
//     }
// 
// 
// 
//     public long getTimestamp() {
//         return timestamp;
//     }
// 
//     public void setTimestamp(long timestamp) {
//         this.timestamp = timestamp;
//     }
// 
//     public double getValue() {
//         return value;
//     }
// 
//     public void setValue(double value) {
//         this.value = value;
//     }
// 
//     public Map<String, String> getMetadata() {
//         return metadata;
//     }
// 
//     public void setMetadata(Map<String, String> metadata) {
//         this.metadata = metadata;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         DataPoint dataPoint = (DataPoint) o;
// 
//         if (getTimestamp() != dataPoint.getTimestamp()) return false;
//         if (Double.compare(dataPoint.getValue(), getValue()) != 0) return false;
//         if (getMetadata() != null ? !getMetadata().equals(dataPoint.getMetadata()) : dataPoint.getMetadata() != null)
//             return false;
//         return source != null ? source.equals(dataPoint.source) : dataPoint.source == null;
// 
//     }
// 
//     @Override
//     public int hashCode() {
//         int result;
//         long temp;
//         result = (int) (getTimestamp() ^ (getTimestamp() >>> 32));
//         temp = Double.doubleToLongBits(getValue());
//         result = 31 * result + (int) (temp ^ (temp >>> 32));
//         result = 31 * result + (getMetadata() != null ? getMetadata().hashCode() : 0);
//         result = 31 * result + (source != null ? source.hashCode() : 0);
//         return result;
//     }
//     @Override
//     public String toString() {
//         return "(" +
//                 "timestamp=" + timestamp +
//                 ", value=" + value +
//                 ", metadata=" + metadata +
//                 ", source=" + source+
//                 ')';
//     }
// 
// }
// 
// Path: core/src/main/java/com/caseystella/analytics/distribution/scaling/ScalingFunctions.java
// public enum ScalingFunctions implements ScalingFunction {
//     NONE(new ScalingFunction() {
// 
//         @Override
//         public double scale(double val, GlobalStatistics stats) {
//             return val;
//         }
//     })
//    ,SHIFT_TO_POSITIVE(new DefaultScalingFunctions.ShiftToPositive())
// 
//     ,SQUEEZE_TO_UNIT( new DefaultScalingFunctions.SqueezeToUnit())
// 
//     ,FIXED_MEAN_UNIT_VARIANCE(new DefaultScalingFunctions.FixedMeanUnitVariance())
//     ,ZERO_MEAN_UNIT_VARIANCE(new DefaultScalingFunctions.ZeroMeanUnitVariance())
//     ;
//     private ScalingFunction _func;
//     ScalingFunctions(ScalingFunction func) {
//         _func = func;
//     }
// 
//     @Override
//     public double scale(double val, GlobalStatistics globalStatistics) {
//         return _func.scale(val, globalStatistics);
//     }
// }


// Path: core/src/test/java/com/caseystella/analytics/distribution/DistributionTest.java
import com.caseystella.analytics.DataPoint;
import com.caseystella.analytics.distribution.scaling.ScalingFunctions;
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
import org.junit.Assert;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

package com.caseystella.analytics.distribution;



public class DistributionTest {
    @Test
    public void testQuantiles() {
        Random r = new Random(0);
        List<DataPoint> points = new ArrayList<>();
        DescriptiveStatistics stats = new DescriptiveStatistics();
        Distribution distribution = null;
        for(int i = 0; i < 100;++i) {
            double val = r.nextDouble()*1000;
            DataPoint dp = (new DataPoint(i, val, null, "foo"));