All Downloads are FREE. Search and download functionalities are using the official Maven repository.

se.l4.vibe.probes.Change Maven / Gradle / Ivy

There is a newer version: 0.4.0
Show newest version
package se.l4.vibe.probes;

import se.l4.vibe.probes.Sampler.Entry;

/**
 * Probes for detecting changes to the sampled values of a 
 * {@link Sampler time series}.
 * 
 * @author Andreas Holstenson
 *
 */
public class Change
{
	private Change()
	{
	}
	
	/**
	 * Create a probe that will return the numeric change for the given series.
	 * 
	 * @param series
	 * @return
	 */
	public static  Probe forSampler(Sampler series)
	{
		return new ChangeProbe(series, ValueReaders.same());
	}
	
	/**
	 * Create a probe that will return the numeric change for the given series.
	 * 
	 * @param series
	 * @return
	 */
	public static  Probe forSampler(Sampler series, ValueReader reader)
	{
		return new ChangeProbe(series, reader);
	}
	
	/**
	 * Create a probe that will return the change as a fraction for the given 
	 * series.
	 * 
	 * @param series
	 * @return
	 */
	public static  Probe asFraction(Sampler series)
	{
		return new ChangeAsFractionProbe(series, ValueReaders.same());
	}
	
	/**
	 * Create a probe that will return the change as a fraction for the given 
	 * series.
	 * 
	 * @param series
	 * @return
	 */
	public static  Probe asFraction(Sampler series, ValueReader reader)
	{
		return new ChangeAsFractionProbe(series, reader);
	}
	
	private static class ChangeProbe
		implements Probe
	{
		private double lastValue;
		private double value;
		
		public ChangeProbe(Sampler series, final ValueReader reader)
		{
			lastValue = Double.NaN;
			
			series.addListener(new SampleListener()
			{
				@Override
				public void sampleAcquired(SampledProbe probe, Entry entry)
				{
					double current = reader.read(entry.getValue()).doubleValue();
					value = current - lastValue;
					lastValue = current;
				}
			});
		}

		@Override
		public Number read()
		{
			return value;
		}
	}
	
	private static class ChangeAsFractionProbe
		implements Probe
	{
		private double lastValue;
		private double value;
		
		public ChangeAsFractionProbe(Sampler series, final ValueReader reader)
		{
			lastValue = Double.NaN;
			
			series.addListener(new SampleListener()
			{
				@Override
				public void sampleAcquired(SampledProbe probe, Entry entry)
				{
					double current = reader.read(entry.getValue()).doubleValue();
					value = current == lastValue 
						? 0 
						: (current - lastValue) / lastValue;
					
					lastValue = current;
				}
			});
		}
	
		@Override
		public Double read()
		{
			return value;
		}
	}
}