
se.l4.vibe.probes.Change Maven / Gradle / Ivy
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;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy