package edu.umd.hooka;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
public class AlignmentPosteriorGrid {
Array2D posteriors;
int elen = 0;
int flen = 0;
public void write(DataOutput out) throws IOException {
throw new IOException("foo");
}
public void readFiles(DataInput in) throws IOException {
throw new IOException("foo");
}
public AlignmentPosteriorGrid(PhrasePair pp) {
elen = pp.getE().getWords().length + 1; // room for NULL
flen = pp.getF().getWords().length;
posteriors = new Array2D(elen * flen);
posteriors.resize(flen, elen);
}
public float getAlignmentPointPosterior(int f, int e) {
return posteriors.get(f, e);
}
public void setAlignmentPointPosterior(int f, int e, float p) {
posteriors.set(f, e, p);
}
public Alignment alignPosteriorThreshold(float t) {
Alignment res = new Alignment(flen, elen-1);
for (int i =1; i<elen; ++i) {
for (int j=0; j<flen; ++j) {
if (getAlignmentPointPosterior(j, i) > t)
res.align(j, i-1);
}
}
return res;
}
public String toString() {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < posteriors.getSize2(); i++) {
for (int j = 0; j < posteriors.getSize1(); j++) {
float p = posteriors.get(j, i);
if (p > 0.0f) {
double lp = Math.log(p);
int c = 10000;
if (lp <= -10.0) c /= 10;
if (lp <= -100.0) c /= 10;
if (lp <= -1000.0) c /= 10;
if (lp <= -10000.0) c /= 10;
int ip = (int)(lp * c);
float llp = ((float)ip)/(float)c;
sb.append(llp);
} else { sb.append("-inf"); }
sb.append('\t');
}
sb.append("\n");
}
return sb.toString();
}
}