package joshua.discriminative.feature_related.feature_function; import java.util.HashMap; import java.util.HashSet; import java.util.logging.Logger; import joshua.decoder.ff.DefaultStatelessFF; import joshua.decoder.ff.tm.Rule; import joshua.decoder.hypergraph.HGNode; import joshua.decoder.hypergraph.HyperEdge; import joshua.decoder.hypergraph.HyperGraph; public class EdgeTblBasedBaselineFF extends DefaultStatelessFF { private static Logger logger = Logger.getLogger(EdgeTblBasedBaselineFF.class.getName()); private HashMap<HyperEdge, Double> hyperEdgeBaselineLogPTbl = new HashMap<HyperEdge, Double>() ; private HashSet<HGNode> processedNodesTtbl = new HashSet<HGNode>(); /*hyperEdgeBaselineLogPTbl should contain **logP**; not cost * */ public EdgeTblBasedBaselineFF(final int featID, final double weight) { super(weight, -1, featID);//TODO: owner } public double estimateLogP(Rule rule, int sentID) { logger.severe("unimplement function"); System.exit(1); return 0; } @Override public double transitionLogP(HyperEdge edge, int spanStart, int spanEnd, int sentID){ return hyperEdgeBaselineLogPTbl.get(edge); } @Override public double finalTransitionLogP(HyperEdge edge, int spanStart, int spanEnd, int sentID){ return hyperEdgeBaselineLogPTbl.get(edge); } // ========================================== public HashMap<HyperEdge, Double> collectTransitionLogPs(HyperGraph hg){ hyperEdgeBaselineLogPTbl.clear(); processedNodesTtbl.clear(); collectTransitionCosts(hg.goalNode); processedNodesTtbl.clear(); return hyperEdgeBaselineLogPTbl; } // item: recursively call my children deductions, change pointer for best_deduction, and remember changed_cost private void collectTransitionCosts(HGNode it ){ if(processedNodesTtbl.contains(it)) return; processedNodesTtbl.add(it); for(HyperEdge dt : it.hyperedges){ collectTransitionCosts(it, dt); } } // adjust best_cost, and recursively call my ant items //parent_changed_cost;//deduction-idenpendent parent item cost private void collectTransitionCosts(HGNode parentNode, HyperEdge dt){ hyperEdgeBaselineLogPTbl.put(dt, dt.getTransitionLogP(false));//get baseline score if(dt.getAntNodes()!=null){ for(HGNode antNode : dt.getAntNodes()){ collectTransitionCosts(antNode); } } } }