package edu.stanford.nlp.sempre.tables.alter;
import java.util.*;
public class PureSubsetChooser implements SubsetChooser {
private final int numAlteredTables, numRetainedTables;
private final boolean alsoTrySmallerSubsets;
public PureSubsetChooser(int numAlteredTables, int numRetainedTables, boolean alsoTrySmallerSubsets) {
this.numAlteredTables = numAlteredTables;
this.numRetainedTables = numRetainedTables;
this.alsoTrySmallerSubsets = alsoTrySmallerSubsets;
}
@Override
public Subset chooseSubset(String id, DenotationData denotationData) {
return chooseSubset(id, denotationData, Collections.emptyList());
}
@Override
public Subset chooseSubset(String id, DenotationData denotationData, Collection<Integer> forbiddenTables) {
if (this.numRetainedTables == 0 || !denotationData.isAnnotated()) return null;
Iterator<List<Integer>> itr;
if (alsoTrySmallerSubsets)
itr = new Subset.SubsetSizeAtMostKIterator(numAlteredTables, numRetainedTables);
else
itr = new Subset.SubsetSizeKIterator(numAlteredTables, numRetainedTables);
while (itr.hasNext()) {
List<Integer> graphIndices = itr.next();
if (!Subset.areDisjoint(graphIndices, forbiddenTables)) continue;
int numGroupsMixingWithAnnotated = 0;
for (int i : denotationData.getRepresentativeIndices()) {
boolean match = true;
for (int j : graphIndices) {
if (!denotationData.getDenotation(i, j).equals(denotationData.getAnnotatedDenotation(j))) {
match = false;
break;
}
}
if (match) numGroupsMixingWithAnnotated++;
}
if (numGroupsMixingWithAnnotated == 1) {
graphIndices.add(0, 0);
return new Subset(id, graphIndices, -graphIndices.size());
}
}
return null;
}
}