package edu.umd.hooka.alignment;
import edu.umd.hooka.Alignment;
public class RefinerFactory {
static final String GROW_DIAG_FINAL_AND = "grow-diag-final-and";
static final String INTERSECTION = "intersection";
static final String UNION = "union";
static final String GROW_DIAG_FINAL = "grow-diag-final";
static final String OCH = "och";
static abstract class Pred {
public abstract boolean eval(Alignment a, int i, int j);
}
static class Och extends Pred {
public boolean eval(Alignment a, int i, int j) {
return (!a.rookAligned(i, j) ||
a.neighborAligned(i, j) && !a.lneighborAligned(i, j));
}
}
static class Koehn extends Pred {
public boolean eval(Alignment a, int i, int j) {
return !a.doubleRookAligned(i, j) && a.neighborAligned(i, j);
}
}
static class KoehnFinal extends Pred {
public boolean eval(Alignment a, int i, int j) {
return !a.rookAligned(i, j);
}
}
static class IntersectionRefiner extends Refiner {
public Alignment refine(Alignment a1, Alignment a2) {
return Alignment.intersect(a1, a2);
}
}
static class UnionRefiner extends Refiner {
public Alignment refine(Alignment a1, Alignment a2) {
return Alignment.union(a1, a2);
}
}
static class GrowDiagFinalAndRefiner extends Refiner {
static Koehn koehn = new Koehn();
static KoehnFinal koehnFinal = new KoehnFinal();
public Alignment refine(Alignment a2, Alignment a1) {
Alignment au = Alignment.union(a1, a2);
Alignment a = Alignment.intersect(a1, a2);
grow(a, koehn, false, au);
//System.out.println(a1.toString());
grow(a, koehnFinal, true, a1);
grow(a, koehnFinal, true, a2);
return a;
}
}
static class Pair {
public Pair(int i, int j) {this.i=i; this.j=j;}
public int i;
public int j;
}
static void grow(Alignment a, Pred pred, boolean idem, Alignment pot)
{
int flen = a.getFLength();
int elen = a.getELength();
if (idem) {
for (int i=0;i<flen;i++)
for (int j=0;j<elen;j++)
if (pot.aligned(i,j) &&
!a.aligned(i, j) &&
pred.eval(a, i, j))
a.align(i, j);
} else {
java.util.ArrayList<Pair> p = new java.util.ArrayList<Pair>();
for (int i=0;i<flen;i++)
for (int j=0;j<elen;j++)
if (pot.aligned(i, j) &&
!a.aligned(i, j))
p.add(new Pair(i,j));
int plen = p.size();
Pair[] pairs = new Pair[plen]; p.toArray(pairs); p = null;
while (true) {
int cur = 0;
boolean flag = false;
for (int pi=0; pi<plen; pi++)
{
Pair pp = pairs[pi];
if (pred.eval(a, pp.i, pp.j)) {
a.align(pp.i, pp.j);
flag = true;
} else {
pairs[cur] = pp;
cur++;
}
}
plen = cur;
if (!flag)
break;
}
}
}
public static Refiner getForName(String name) throws Exception
{
if (name.equals(INTERSECTION))
return new IntersectionRefiner();
else if (name.equals(UNION))
return new UnionRefiner();
else if (name.equals(GROW_DIAG_FINAL_AND))
return new GrowDiagFinalAndRefiner();
else
throw new Exception("Unknown refinement algorithm: " + name);
}
}