/*
* Created on Jun 28, 2008
* @author sunita
*/
package iitb.KernelCRF;
import iitb.CRF.Soln;
import java.io.Serializable;
import java.util.BitSet;
/**
*
* @author Sunita Sarawagi
* @since 1.3
* @version 1.3
*/
public class YSequence implements Serializable {
/**
*
*/
private static final long serialVersionUID = -108787926046669135L;
int numBits;
BitSet yseq = new BitSet();
public YSequence(int labeling[], int numLabels) {
numBits = iitb.Utils.Utils.log2Ceil(2*numLabels);//1 bit for segment marker.
for (int pos = 0; pos < labeling.length; pos++) {
int y = labeling[pos];
for (int bitPos = pos*numBits; y > 0; y = y >> 1, bitPos++) {
if ((y & 1) > 0)
yseq.set(bitPos);
}
yseq.set((pos+1)*numBits-1);
}
}
public YSequence(Soln soln, int numLabels) {
numBits = iitb.Utils.Utils.log2Ceil(2*numLabels);//1 bit for segment marker.
for (; soln != null; soln = soln.prevSoln) {
for(int pos = soln.pos;pos > soln.prevPos(); pos--) {
int y = soln.label;
for (int bitPos = pos*numBits; y > 0; y = y >> 1, bitPos++) {
if ((y & 1) > 0)
yseq.set(bitPos);
}
//assert(getY(pos)==soln.label);
//if (soln.pos-soln.prevPos()>1) {
yseq.set((soln.prevPos()+2)*numBits-1);
//}
}
}
}
@Override
public int hashCode() {
return yseq.hashCode();
}
@Override
public boolean equals(Object obj) {
return (obj == yseq) ||
((obj != null) && yseq.equals(((YSequence)obj).yseq));
}
public int getY(int j) {
int y = 0;
int bn=0;
// -1 because segmentStartMarker on one end.
for (int p = numBits*j; bn < numBits-1; p++, bn++) {
y += yseq.get(p)?(1 << bn):0;
}
return y;
}
public int[] getYArray(int n) {
int ys[] = new int[n];
for (int i = 0; i < ys.length; i++) {
ys[i] = getY(i);
}
return ys;
}
public boolean segStart(int j) {
return yseq.get(j*numBits+numBits-1);
}
@Override
public String toString() {
String str="";
int dataLen = (yseq.length()+numBits-1)/numBits;
for (int i = 0; i < dataLen; i++) {
str += (i + ":" + getY(i)+" "); //+ "?" + segStart(i)+ " ");
}
return str;
}
}