package aima.core.probability.domain;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public abstract class AbstractFiniteDomain implements FiniteDomain {
private String toString = null;
private Map<Object, Integer> valueToIdx = new HashMap<Object, Integer>();
private Map<Integer, Object> idxToValue = new HashMap<Integer, Object>();
public AbstractFiniteDomain() {
}
//
// START-Domain
@Override
public boolean isFinite() {
return true;
}
@Override
public boolean isInfinite() {
return false;
}
@Override
public abstract int size();
@Override
public abstract boolean isOrdered();
// END-Domain
//
//
// START-FiniteDomain
@Override
public abstract Set<? extends Object> getPossibleValues();
@Override
public int getOffset(Object value) {
Integer idx = valueToIdx.get(value);
if (null == idx) {
throw new IllegalArgumentException("Value [" + value
+ "] is not a possible value of this domain.");
}
return idx.intValue();
}
@Override
public Object getValueAt(int offset) {
return idxToValue.get(offset);
}
// END-FiniteDomain
//
@Override
public String toString() {
if (null == toString) {
toString = getPossibleValues().toString();
}
return toString;
}
//
// PROTECTED METHODS
//
protected void indexPossibleValues(Set<? extends Object> possibleValues) {
int idx = 0;
for (Object value : possibleValues) {
valueToIdx.put(value, idx);
idxToValue.put(idx, value);
idx++;
}
}
}