io.virtdata.libbasics.core.stathelpers.DiscreteProbabilityBuffer Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of virtdata-lib-realer Show documentation
Show all versions of virtdata-lib-realer Show documentation
With inspiration from other libraries
package io.virtdata.libbasics.core.stathelpers;
import java.nio.ByteBuffer;
import java.util.Iterator;
public class DiscreteProbabilityBuffer implements Iterable {
private static int REFERENT_ID =0;
private static int PROBABILITY = REFERENT_ID +Integer.BYTES;
public static int RECORD_LEN = PROBABILITY +Double.BYTES;
private double cumulativeProbability = 0.0D;
private boolean isNormalized=false;
private final ByteBuffer buffer;
public DiscreteProbabilityBuffer(int entries) {
this.buffer = ByteBuffer.allocate(entries*RECORD_LEN);
}
public DiscreteProbabilityBuffer add(int i, double probability) {
cumulativeProbability+=probability;
buffer.putInt(i);
buffer.putDouble(probability);
return this;
}
/**
* Normalize the dataset, but only if the cumulative probability is not close to
* the unit probability of 1.0D, within some phi threshold. In either case,
* mark the dataset as normalized.
* @param phi A double value, preferably very small, like 0.000000001D
*/
public void normalize(double phi) {
if (Math.abs(cumulativeProbability-1.0D) iterator() {
return new Iter(buffer.duplicate());
}
public double getCumulativeProbability() {
return cumulativeProbability;
}
private static class Iter implements Iterator {
private ByteBuffer iterbuf;
public Iter(ByteBuffer iterbuf) {
this.iterbuf = iterbuf;
}
@Override
public boolean hasNext() {
return iterbuf.remaining()>0;
}
@Override
public Entry next() {
int eid = iterbuf.getInt();
double prob = iterbuf.getDouble();
return new Entry(eid,prob);
}
}
public static class Entry {
private int eventId;
private double probability;
public Entry(int eventId, double probability) {
this.eventId = eventId;
this.probability = probability;
}
public int getEventId() {
return eventId;
}
public double getProbability() {
return probability;
}
}
}