ParallelRearrange.java
2.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package is2.parser;
import is2.data.DataFES;
import java.util.ArrayList;
import java.util.concurrent.Callable;
/**
* @author Dr. Bernd Bohnet, 30.08.2009
*
* This class implements a parallel edge rearrangement for non-projective parsing;
* The linear method was first suggest by Rayn McDonald et. al. 2005.
*/
final public class ParallelRearrange implements Callable<Object> {
// new parent child combination to explore
final static class PA {
final float p;
final short ch, pa;
public float max;
public short wh;
public short nPar;
public short nType;
public PA(float p2, short ch2, short pa2) { p=p2; ch=ch2;pa=pa2;}
}
// list of parent child combinations
static ArrayList<PA> parents = new ArrayList<PA>();
static ArrayList<PA> order = new ArrayList<PA>();
// best new parent child combination, found so far
public float max;
// some data from the dependency tree
//private EdgesC edges;
private short[] pos;
private DataFES x;
private boolean[][] isChild ;
public short[] heads,types;
// child, new parent, new label
public short wh,nPar,nType;
/**
* Initialize the parallel rearrange thread
*
* @param isChild2 is a child
* @param edgesC the part-of-speech edge mapping
* @param pos the part-of-speech
* @param x the data
* @param s the heads
* @param ts the types
*/
public ParallelRearrange(boolean[][] isChild2,short[] pos, DataFES x, short[] s, short[] ts) {
heads =new short[s.length];
System.arraycopy(s, 0, heads, 0, s.length);
types =new short[ts.length];
System.arraycopy(ts, 0, types, 0, ts.length);
isChild=isChild2;
//edges = edgesC;
this.pos =pos;
this.x=x;
}
@Override
public Object call() {
// check the list of new possible parents and children for a better combination
while(true) {
PA px = getPA();
if (px==null) break;
float max=0;
short pa =px.pa, ch =px.ch;
if(ch == pa || pa == heads[ch] || isChild[ch][pa]) continue;
short oldP = heads[ch], oldT = types[ch];
heads[ch]=pa;
short[] labels = Edges.get(pos[pa], pos[ch]);
for(int l=0;l<labels.length;l++) {
types[ch]=labels[l];
float p_new = Extractor.encode3(pos, heads, types, x);
if(max < p_new-px.p ) {
max = p_new-px.p; wh = ch; nPar = pa; nType = labels[l] ;
px.max=max;
px.wh=ch;
px.nPar = pa;
px.nType =labels[l];
}
}
heads[ch]= oldP; types[ch]=oldT;
}
return null;
}
/**
* Add a child-parent combination which are latter explored for rearrangement
*
* @param p2
* @param ch2
* @param pa
*/
static public void add(float p2, short ch2, short pa) {
PA px = new PA(p2,ch2,pa);
parents.add(px);
order.add(px);
}
static private PA getPA() {
synchronized (parents) {
if (parents.size()==0) return null;
return parents.remove(parents.size()-1);
}
}
}