package edu.stanford.nlp.patterns.surface;
import edu.stanford.nlp.io.IOUtils;
import edu.stanford.nlp.patterns.Pattern;
import edu.stanford.nlp.util.ArgumentParser;
import edu.stanford.nlp.util.logging.Redwood;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by sonalg on 10/22/14.
*/
public class PatternsForEachTokenInMemory<E extends Pattern> extends PatternsForEachToken<E> {
public static ConcurrentHashMap<String, Map<Integer, Set<? extends Pattern>>> patternsForEachToken = null;
public PatternsForEachTokenInMemory(Properties props, Map<String, Map<Integer, Set<E>>> pats) {
ArgumentParser.fillOptions(this, props);
//TODO: make this atomic
if(patternsForEachToken == null)
patternsForEachToken = new ConcurrentHashMap<>();
if (pats != null)
addPatterns(pats);
}
public PatternsForEachTokenInMemory(Properties props) {
this(props, null);
}
@Override
public void addPatterns(String sentId, Map<Integer, Set<E>> patterns) {
if (!patternsForEachToken.containsKey(sentId))
patternsForEachToken.put(sentId, new ConcurrentHashMap<>());
patternsForEachToken.get(sentId).putAll(patterns);
}
@Override
public void addPatterns(Map<String, Map<Integer, Set<E>>> pats) {
for (Map.Entry<String, Map<Integer, Set<E>>> en : pats.entrySet()) {
addPatterns(en.getKey(), en.getValue());
}
}
@Override
public Map<Integer, Set<E>> getPatternsForAllTokens(String sentId) {
return (Map<Integer, Set<E>>)(patternsForEachToken.containsKey(sentId) ? patternsForEachToken.get(sentId) : Collections.emptyMap());
}
@Override
public void setupSearch() {
//nothing to do
}
// @Override
// public ConcurrentHashIndex<SurfacePattern> readPatternIndex(String dir) throws IOException, ClassNotFoundException {
// return IOUtils.readObjectFromFile(dir+"/patternshashindex.ser");
// }
//
// @Override
// public void savePatternIndex(ConcurrentHashIndex<SurfacePattern> index, String dir) throws IOException {
// if(dir != null){
// writePatternsIfInMemory(dir+"/allpatterns.ser");
// IOUtils.writeObjectToFile(index, dir+"/patternshashindex.ser");
// }
// }
@Override
public Map<String, Map<Integer, Set<E>>> getPatternsForAllTokens(Collection<String> sampledSentIds) {
Map<String, Map<Integer, Set<E>>> pats = new HashMap<>();
for(String s: sampledSentIds){
pats.put(s, getPatternsForAllTokens(s));
}
return pats;
}
@Override
public void close() {
//nothing to do
}
@Override
public void load(String allPatternsDir) {
try {
addPatterns(IOUtils.readObjectFromFile(allPatternsDir+"/allpatterns.ser"));
} catch (IOException e) {
throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
@Override
public boolean save(String dir) {
try {
IOUtils.ensureDir(new File(dir));
String f = dir+"/allpatterns.ser";
IOUtils.writeObjectToFile(this.patternsForEachToken, f);
Redwood.log(Redwood.DBG, "Saving the patterns to " + f);
} catch (IOException e) {
throw new RuntimeException(e);
}
return true;
}
@Override
public void createIndexIfUsingDBAndNotExists() {
//nothing to do
return;
}
public boolean containsSentId(String sentId) {
return this.patternsForEachToken.containsKey(sentId);
}
@Override
public int size(){
return this.patternsForEachToken.size();
};
}