package joshua.discriminative.training.risk_annealer.hypergraph; import java.io.BufferedReader; import java.util.logging.Logger; import joshua.corpus.vocab.SymbolTable; import joshua.decoder.hypergraph.DiskHyperGraph; import joshua.decoder.hypergraph.HyperGraph; import joshua.discriminative.FileUtilityOld; /**provide HG and reference * */ public class HyperGraphFactory { private SymbolTable symbolTbl; private int ngramStateID; private DiskHyperGraph diskHG = null; private String diskHGFilePrefix; private String[] referenceFiles; private BufferedReader[] refFileReaders; boolean readReferences = true; /** Logger for this class. */ private static final Logger logger = Logger.getLogger(HyperGraphFactory.class.getName()); public HyperGraphFactory(String diskHGFilePrefix, String[] referenceFiles, int ngramStateID, SymbolTable symbolTbl, boolean readReferences){ this.diskHGFilePrefix = diskHGFilePrefix; this.ngramStateID = ngramStateID; this.symbolTbl = symbolTbl; this.referenceFiles = referenceFiles; this.readReferences = readReferences; } public void startLoop(){ initDiskReading(); } public void endLoop(){ finalizeDiskReading(); } public HGAndReferences nextHG(){ return new HGAndReferences(readOneHGFromDisk(), readReferencesFromDisk() ); } private String[] readReferencesFromDisk(){ if(this.readReferences){ String[] referenceSentences = new String[refFileReaders.length]; for(int i=0; i<refFileReaders.length; i++) referenceSentences[i]= FileUtilityOld.readLineLzf(refFileReaders[i]); return referenceSentences; }else return null; } private void initDiskReading(){ logger.info("initialize reading hypergraphss.............."); diskHG = new DiskHyperGraph(symbolTbl, ngramStateID, true, null); //have model costs stored diskHG.initRead(diskHGFilePrefix+".hg.items", diskHGFilePrefix+".hg.rules", null); //=== references files, they are needed only when we want annote the hypergraph with risk if(this.readReferences){ refFileReaders = new BufferedReader[referenceFiles.length]; for(int i=0; i<referenceFiles.length; i++) refFileReaders[i] = FileUtilityOld.getReadFileStream(referenceFiles[i],"UTF-8"); } } private void finalizeDiskReading(){ logger.info("finalize reading hypergraphss.............."); diskHG.closeReaders(); //=== references files if(this.readReferences){ for(int i=0; i<referenceFiles.length; i++){ FileUtilityOld.closeReadFile(refFileReaders[i]); } } } private HyperGraph readOneHGFromDisk(){ //=== disk hypergraph return diskHG.readHyperGraph(); } }