package joshua.discriminative.variational_decoder;
import java.io.BufferedReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import joshua.corpus.vocab.SymbolTable;
import joshua.decoder.ff.FeatureFunction;
import joshua.decoder.ff.WordPenaltyFF;
import joshua.discriminative.FileUtilityOld;
import joshua.discriminative.feature_related.feature_function.BaselineComboFF;
import joshua.discriminative.feature_related.feature_function.FeatureTemplateBasedFF;
import joshua.discriminative.feature_related.feature_function.EdgeTblBasedBaselineFF;
import joshua.discriminative.feature_related.feature_template.FeatureTemplate;
import joshua.discriminative.feature_related.feature_template.NgramFT;
/* anything that is configurable should go here
* */
public class VariationalDecoderConfiguration {
//options for variational decoder
static int stateID = 0;
static int baselineLMOrder = 3;
static double insideoutsideScalingFactor=1.0;
static int ngramStateID =0;
//end
private static final Logger logger = Logger.getLogger(VariationalDecoderConfiguration.class.getName());
public static void readConfigFile(String configFile) {
BufferedReader configReader = FileUtilityOld.getReadFileStream(configFile);
String line;
while ((line = FileUtilityOld.readLineLzf(configReader)) != null) {
//line = line.trim().toLowerCase();
line = line.trim();
if (line.matches("^\\s*\\#.*$") || line.matches("^\\s*$")) {
continue;
}
if (line.indexOf("=") != -1) { // parameters
String[] fds = line.split("\\s*=\\s*");
if (fds.length != 2) {
if (logger.isLoggable(Level.SEVERE)) logger.severe(
"Wrong config line: " + line);
System.exit(1);
}
if (0 == fds[0].compareTo("baseline_lm_order")) {
baselineLMOrder = new Integer(fds[1].trim());
if (logger.isLoggable(Level.FINEST)) logger.finest(String.format("baseline_lm_order: %s", baselineLMOrder));
} else if (0 == fds[0].compareTo("insideoutside_scaling_factor")) {
insideoutsideScalingFactor = new Double(fds[1].trim());
if (logger.isLoggable(Level.FINEST)) logger.finest(String.format("lm insideoutside_scaling_factor: %s", insideoutsideScalingFactor));
}else if (0 == fds[0].compareTo("baseline_lm_feat_id")) {
ngramStateID = new Integer(fds[1].trim());
if (logger.isLoggable(Level.FINEST)) logger.finest(String.format("baseline_lm_feat_id: %s", ngramStateID));
}else {
if (logger.isLoggable(Level.SEVERE)) logger.severe(
"Wrong config line: " + line);
System.exit(1);
}
}else{//models
//do nothing
}
}
FileUtilityOld.closeReadFile(configReader);
}
public static void initializeModels(String configFile, SymbolTable symbolTbl, List<FeatureFunction> featFunctions,
HashMap<VariationalNgramApproximator, FeatureTemplateBasedFF> approximatorMap) {
BufferedReader configReader = FileUtilityOld.getReadFileStream(configFile);
String line;
while ((line = FileUtilityOld.readLineLzf(configReader)) != null) {
//line = line.trim().toLowerCase();
line = line.trim();
if (line.matches("^\\s*\\#.*$") || line.matches("^\\s*$")) {
continue;
}
if (line.indexOf("=") != -1) { // parameters
//do nothing
}else{//models
String[] fds = line.split("\\s+");
if (fds[0].compareTo("vbaseline") == 0 && fds.length == 2) {
//baseline feature
double baselineWeight = new Double(fds[1].trim());
FeatureFunction ff = new EdgeTblBasedBaselineFF(ngramStateID+1+featFunctions.size(), baselineWeight);
featFunctions.add(ff);
logger.info(String.format("Baseline feature wiht weight: " + baselineWeight));
}else if (fds[0].compareTo("vbaselinecombo") == 0 && fds.length > 2) {
//baseline combo features: vbaselinecombo list-of-baseline-features (each one should be " pos_id||inter-weight ") weight
double weight = new Double(fds[fds.length-1].trim());
List<Integer> positions = new ArrayList<Integer>();
List<Double> interWeights = new ArrayList<Double>();
for(int i=1; i<fds.length-1; i++){
String[] tems = fds[i].split("\\|{2}");
int pos = new Integer(tems[0]);
double interWeight = new Double(tems[1]);
positions.add(pos);
interWeights.add(interWeight);
}
System.out.println("baseline combo model");
FeatureFunction ff = new BaselineComboFF(ngramStateID+1+featFunctions.size(), weight, positions, interWeights);
featFunctions.add(ff);
logger.info( String.format("Baseline combo model with weight: " + weight));
}else if(fds[0].compareTo("vconstituent") == 0 && fds.length == 2) {
/*
double constituentWeight = new Double(fds[1].trim());
HashMap<HyperEdge,Double> tbl = new HashMap<HyperEdge,Double>();
FeatureFunction ff = new BaselineFF(baselineLMFeatID+1+featFunctions.size(), constituentWeight, tbl);
FeatureTemplate ft = new FeatureTemplateConstituent();
VariationalLMApproximator rmodel = new VariationalLMApproximator(ff, ft, tbl);
featFunctions.add(ff);
approximatorMap.add(rmodel);
logger.info( String.format("constituent model with weight: " + constituentWeight));
*/
logger.severe("Wrong config line: " + line);
System.exit(1);
} else if(fds[0].compareTo("vlm")==0 && fds.length == 3){
int vlmOrder = new Integer(fds[1].trim());
if(vlmOrder> baselineLMOrder){
System.out.println("varatioanl_ngram_order is greater than baseline_lm_order; must be wrong");
System.exit(1);
}
double weight = new Double(fds[2].trim());
FeatureTemplate ft = new NgramFT(symbolTbl, true , ngramStateID, baselineLMOrder, vlmOrder, vlmOrder);
FeatureTemplateBasedFF ff = new FeatureTemplateBasedFF(ngramStateID+1+featFunctions.size(), weight, ft);
VariationalNgramApproximator rmodel = new VariationalNgramApproximator(symbolTbl, ft, 1.0, vlmOrder);
featFunctions.add(ff);
approximatorMap.put(rmodel, ff);
logger.info( String.format("vlm feature with weight: " + weight));
}else if(fds[0].compareTo("word_penalty_weight") == 0 && fds.length == 2) {
double weight = new Double(fds[1].trim());
System.out.println("word penalty feature");
FeatureFunction ff = new WordPenaltyFF(ngramStateID+1+featFunctions.size(), weight);
featFunctions.add(ff);
logger.info( String.format("word penalty feature with weight: " + weight));
}else{
if (logger.isLoggable(Level.SEVERE))
logger.severe( "Wrong config line: " + line);
System.exit(1);
}
}
}
FileUtilityOld.closeReadFile(configReader);
}
}