package edu.stanford.nlp.semparse.open.model.candidate;
import java.util.*;
import edu.stanford.nlp.semparse.open.model.feature.FeatureExtractor;
import edu.stanford.nlp.semparse.open.model.tree.KNode;
public class TreePatternAndRange extends TreePattern {
/**
* The selected nodes are originalRecordNodes[i] where rangeStart <= i < rangeEnd
*/
public final int amountCutStart, amountCutEnd, rangeStart, rangeEnd;
public TreePatternAndRange(KNode rootNode, Collection<PathEntry> recordPath, Collection<KNode> originalRecordNodes,
int amountCutStart, int amountCutEnd) {
super(rootNode, recordPath, originalRecordNodes);
if (amountCutStart < 0 || amountCutEnd < 0 || amountCutStart + amountCutEnd > originalRecordNodes.size())
throw new IndexOutOfBoundsException("Invalid range: " +
"cutStart = " + amountCutStart + ", cutEnd = " + amountCutEnd + ", n = " + originalRecordNodes.size());
this.amountCutStart = amountCutStart;
this.amountCutEnd = amountCutEnd;
this.rangeStart = amountCutStart;
this.rangeEnd = originalRecordNodes.size() - amountCutEnd;
}
public TreePatternAndRange(TreePattern treePattern, int amountCutStart, int amountCutEnd) {
this(treePattern.rootNode, treePattern.recordPath, treePattern.recordNodes, amountCutStart, amountCutEnd);
}
@Override
public String toString() {
return new StringBuilder().append(PathUtils.getXPathString(recordPath))
.append(" [").append(rangeStart).append(":").append(rangeEnd).append("]").toString();
}
@Override
public List<KNode> getNodes() {
return recordNodes.subList(rangeStart, rangeEnd);
}
/* It works, but is painfully slow. */
@Deprecated
public static List<Candidate> generateCutRangeCandidates(Candidate candidate) {
List<Candidate> candidates = new ArrayList<>();
// Remove a few stuff from both sides
int n = candidate.numEntities();
for (int i = 0; i < Math.min(5, n - CandidateGenerator.opts.minNumCandidateEntity); i++) {
CandidateGroup group = new CandidateGroup(candidate.ex, candidate.group.selectedNodes.subList(1, n));
candidates.add(group.addCandidate(new TreePatternAndRange(candidate.pattern, i, 0)));
}
for (int i = 1; i < Math.min(10, n - CandidateGenerator.opts.minNumCandidateEntity); i++) {
CandidateGroup group = new CandidateGroup(candidate.ex, candidate.group.selectedNodes.subList(0, n-i));
candidates.add(group.addCandidate(new TreePatternAndRange(candidate.pattern, 0, i)));
}
for (Candidate cutRangeCandidate : candidates) {
FeatureExtractor.featureExtractor.extract(cutRangeCandidate);
FeatureExtractor.featureExtractor.extract(cutRangeCandidate.group);
}
return candidates;
}
/**
* Generate cut-range groups from the given group without actually adding any candidate.
* Only suitable for experiments only.
*/
public static List<CandidateGroup> generateDummyCutRangeCandidateGroups(CandidateGroup group) {
List<CandidateGroup> candidateGroups = new ArrayList<>();
// Remove a few stuff from both sides
int n = group.numEntities();
for (int i = 0; i < Math.min(5, n - CandidateGenerator.opts.minNumCandidateEntity); i++) {
candidateGroups.add(new CandidateGroup(group.ex, group.selectedNodes.subList(1, n)));
}
for (int i = 1; i < Math.min(10, n - CandidateGenerator.opts.minNumCandidateEntity); i++) {
candidateGroups.add(new CandidateGroup(group.ex, group.selectedNodes.subList(0, n-i)));
}
return candidateGroups;
}
}