package is2.data;
import java.util.BitSet;
public class Parse implements Comparable<Parse> {
public short[] heads;
public short[] labels;
public double f1;
public Parse() {
}
public Parse(int i) {
heads = new short[i];
labels = new short[i];
}
/**
* @param heads2
* @param types2
* @param p_new
*/
public Parse(short[] heads2, short[] types2, float p_new) {
this.heads = new short[heads2.length];
this.labels = new short[types2.length];
// this.heads=heads2;
// this.labels=types2;
System.arraycopy(heads2, 0, heads, 0, heads.length);
System.arraycopy(types2, 0, labels, 0, labels.length);
f1 = p_new;
}
/**
* @param heads2
* @param types2
* @param p_new
*/
public Parse(String parse, float p_new) {
// this(parse.length()/2);
signature2parse(parse);
f1 = p_new;
}
public void signature2parse(String parse) {
int p = 0;
heads = new short[parse.length() / 2];
labels = new short[heads.length];
// DB.println("pl "+parse.length());
for (int k = 0; k < heads.length; k++) {
heads[k] = (short) parse.charAt(p++);
labels[k] = (short) parse.charAt(p++);
}
}
@Override
public Parse clone() {
Parse p = new Parse();
p.heads = new short[heads.length];
p.labels = new short[labels.length];
System.arraycopy(heads, 0, p.heads, 0, heads.length);
System.arraycopy(labels, 0, p.labels, 0, labels.length);
p.f1 = f1;
return p;
}
/**
* Check if it is a tree
*
* @return
*/
public boolean checkTree() {
BitSet set = new BitSet(heads.length);
set.set(0);
return checkTree(set, 0);
}
/**
* @param set
* @return
*/
private boolean checkTree(BitSet set, int h) {
//System.out.print(" h "+h);
for (int i = 0; i < heads.length; i++) {
if (heads[i] == h) {
// System.out.print(" "+i);
if (!set.get(i)) {
checkTree(set, i);
}
set.set(i);
}
}
for (int i = 0; i < heads.length; i++) {
if (!set.get(i)) {
return false;
}
}
return true;
}
@Override
public String toString() {
StringBuilder b = new StringBuilder();
for (int k = 0; k < this.heads.length; k++) {
b.append(k).append(" ").append(heads[k]).append(" ").append(this.labels[k]).append("\n");
}
return b.toString();
}
/*
* (non-Javadoc) @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override
public int compareTo(Parse o) {
if (f1 == o.f1) {
return this.signature().compareTo(o.signature());
}
return f1 < o.f1 ? 1 : f1 == o.f1 ? 0 : -1;
}
/**
* @return the signature of a parse
*/
public String signature() {
StringBuilder b = new StringBuilder(heads.length * 2);
for (int k = 0; k < heads.length; k++) {
b.append((char) heads[k]).append((char) labels[k]);
}
return b.toString();
}
/**
* @return the signature of a parse
*/
public StringBuilder signatureSB() {
StringBuilder b = new StringBuilder(heads.length * 2);
for (int k = 0; k < heads.length; k++) {
b.append((char) heads[k]).append((char) labels[k]);
}
return b;
}
}