Package joshua.discriminative.training.oracle

Source Code of joshua.discriminative.training.oracle.FilgerHypergraph$Span

package joshua.discriminative.training.oracle;

import java.util.ArrayList;
import java.util.HashMap;

import joshua.decoder.ff.tm.Rule;
import joshua.decoder.hypergraph.HGNode;
import joshua.decoder.hypergraph.HyperEdge;
import joshua.decoder.hypergraph.HyperGraph;


/**Given a hypergraph and a string, generate a new hypergraph
* that contains only derivations that lead to the string*/
public class FilgerHypergraph {
 
  HashMap<HGNode, Boolean> processedNodesTbl = new HashMap<HGNode, Boolean>();
 
  HashMap<HGNode, Boolean> onNodesTbl = new HashMap<HGNode, Boolean>();
  HashMap<HyperEdge, Boolean> onEdgesTbl = new HashMap<HyperEdge, Boolean>();
 
  HashMap<HGNode, ArrayList<Span>> matchSpansTbl = new HashMap<HGNode, ArrayList<Span>>();
 
 
  /**for each unique substring in the sentence,
   * associate it with a list of possible spans in the sentence*/
  HashMap<String, ArrayList<Span>> senteceSubstringsTbl = new HashMap<String, ArrayList<Span>>();
 
  protected  void operationHypergraph(HyperGraph hg){   
 
    processedNodesTbl.clear();
    operationNode(hg.goalNode);
  }
 
 
  private boolean operationNode(HGNode it){
   
    if(processedNodesTbl.containsKey(it)){
      return onNodesTbl.containsKey(it) ? true : false;
    }
    processedNodesTbl.put(it, true);
   
    boolean onNode = false;
   
    //=== recursive call on each hyperedge
    for(HyperEdge dt : it.hyperedges){
      boolean onEdge = operationHyperedge(dt);
     
      if(onEdge == true)//a node is on if any of his incoming edge is on
        onNode = true;
    }
   
    //=== node-specific operation
    if(onNode)
      onNodesTbl.put(it, true);
   
    return onNode;
  }
 
 
  private boolean operationHyperedge(HyperEdge dt){
     
    //=== recursive call on each ant node
    if(dt.getAntNodes() != null){
      for(HGNode ant_it : dt.getAntNodes()){
        if( operationNode(ant_it) )//if any ant node is off, then the edge is off
          return false;
      }
    }
   
   
    //=== hyperedge-specific operation       
    if ( matchTargetString(dt) == false )
      return false;
   
    //== survive
    onEdgesTbl.put(dt, true);
    return true;   
  }
 
 
 
 
  /**assuming all the ant nodes are on,
   * now we see if the application of the rule matches a larger span
   * */
  private boolean matchTargetString(HyperEdge dt){
   
    Rule rl = dt.getRule();
    if(rl!=null){
     
      return false;
    }
   
    //== survive
    return true;
  }
 
 
 
  //========== Span class ==========
  private class Span{
    int startPos;
    int endPos;
  }

}
TOP

Related Classes of joshua.discriminative.training.oracle.FilgerHypergraph$Span

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.