/*
* Author: tdanford
* Date: Dec 3, 2008
*/
package org.seqcode.ml.bayesnets;
import java.util.Iterator;
public class BNValuesIterator implements Iterator<BNValues> {
private BNVar[] vars;
private Integer[] encodedValues;
private Object[] values;
private BNValues nextValues;
public BNValuesIterator(BNVar... vars) {
this.vars = vars.clone();
encodedValues = null;
values = new Object[vars.length];
findNextValues();
}
public boolean hasNext() {
return nextValues != null;
}
private void findNextValues() {
nextValues = null;
if(encodedValues == null) {
encodedValues = new Integer[vars.length];
for(int i = 0; i < encodedValues.length; i++) {
encodedValues[i] = 0;
}
} else {
int i = encodedValues.length-1;
while(i >= 0 && encodedValues[i] == vars[i].size()-1) {
i--;
}
if(i >= 0) {
encodedValues[i] += 1;
for(int j = i + 1; j < encodedValues.length; j++) {
encodedValues[j] = 0;
}
} else {
return;
}
}
for(int i = 0; i < encodedValues.length; i++) {
values[i] = vars[i].decode(encodedValues[i]);
}
nextValues = new BNValues(vars, values);
}
public BNValues next() {
BNValues vals = nextValues;
findNextValues();
return vals;
}
public void remove() {
throw new UnsupportedOperationException("remove()");
}
}