public List<TargetSideTranslation> getTranslations(final int[] src, final int startPos, final int endPos) {
final long offsetForNgram = map.getOffsetForNgramInModel(src, startPos, endPos);
if (offsetForNgram < 0) return Collections.emptyList();
final TargetTranslationsValues scratch = new PhraseTableValueContainer.TargetTranslationsValues();
map.getValues().getFromOffset(offsetForNgram, endPos - startPos - 1, scratch);
final List<TargetSideTranslation> ret = new ArrayList<TargetSideTranslation>();
for (int i = 0; i < scratch.targetTranslationOffsets.length; ++i) {
final FeaturePhraseTableValues features = new PhraseTableValueContainer.FeaturePhraseTableValues(null);
final long currOffset = scratch.targetTranslationOffsets[i];
final int currOrder = scratch.targetTranslationOrders[i];
map.getValues().getFromOffset(currOffset, currOrder, features);
if (features.features == null) {
Logger.warn("Should probably fix");
continue;
}
final TargetSideTranslation tr = new TargetSideTranslation();
tr.features = Arrays.copyOf(features.features, features.features.length);
int sepIndex = 0;
final int[] srcAndTrg = map.getNgramForOffset(currOffset, currOrder);
for (; sepIndex < srcAndTrg.length; ++sepIndex) {
if (srcAndTrg[sepIndex] == ((PhraseTableValueContainer) map.getValues()).getSeparatorWord()) {
break;
}
}
tr.trgWords = Arrays.copyOfRange(srcAndTrg, sepIndex + 1, srcAndTrg.length);
assert tr.trgWords.length > 0;
ret.add(tr);
}
return ret;
}