package edu.berkeley.nlp.lm.map;
import java.util.AbstractMap;
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import edu.berkeley.nlp.lm.WordIndexer;
import edu.berkeley.nlp.lm.util.Logger;
/**
* Wraps an NgramMap as a Java Map, but only ngrams of a particular order. This
* collection is read-only. It is also uses a lot inefficient boxing and
* unboxing.
*
* @author adampauls
*
* @param <W>
* @param <V>
*/
public class NgramsForOrderMapWrapper<W, V> extends AbstractMap<List<W>, V>
{
private final NgramMap<V> map;
private final int ngramOrder;
private final WordIndexer<W> wordIndexer;
private final NgramsForOrderIterableWrapper<W, V> iterableWrapper;
/**
*
* @param map
* @param ngramOrder
* 0-based, i.e. 0 means unigrams
*/
public NgramsForOrderMapWrapper(final NgramMap<V> map, final WordIndexer<W> wordIndexer, final int ngramOrder) {
this.map = map;
this.ngramOrder = ngramOrder;
this.wordIndexer = wordIndexer;
iterableWrapper = new NgramsForOrderIterableWrapper<W, V>(map, wordIndexer, ngramOrder);
}
@Override
public V get(final Object arg0) {
if (!(arg0 instanceof List)) return null;
@SuppressWarnings("unchecked")
final List<W> l = (List<W>) arg0;
if (l.size() != ngramOrder + 1) return null;
final int[] ngram = WordIndexer.StaticMethods.toArray(wordIndexer, l);
return getForArray(ngram);
}
@Override
public boolean containsKey(final Object key) {
return get(key) != null;
}
@Override
public Set<java.util.Map.Entry<List<W>, V>> entrySet() {
return new AbstractSet<java.util.Map.Entry<List<W>, V>>()
{
@Override
public Iterator<java.util.Map.Entry<List<W>, V>> iterator() {
return iterableWrapper.iterator();
}
@Override
public int size() {
final long size = iterableWrapper.size();
if (size > Integer.MAX_VALUE)
Logger.warn(NgramsForOrderMapWrapper.class.getSimpleName() + " doesn't like maps with size greater than Integer.MAX_VALUE");
return (int) size;
}
};
}
/**
* @param scratch
* @param ngram
*/
private V getForArray(final int[] ngram) {
return map.get(ngram, 0, ngram.length);
// long probContext = 0L;
// int probContextOrder = -1;
// final V scratch = map.getValues().getScratchValue();
// final NgramMap<V> localMap = map;
// final int endPos_ = ngram.length;
// final int startPos_ = 0;
// localMap.
// for (int i = endPos_ - 1; i >= startPos_; --i) {
// probContext = localMap.getValueAndOffset(probContext, probContextOrder, ngram[i], scratch);
// if (probContext < 0) return null;
// probContextOrder++;
// }
// return scratch;
}
}