package org.maltparser.core.syntaxgraph.node;
import java.util.Set;
import java.util.SortedSet;
import org.maltparser.core.exception.MaltChainedException;
import org.maltparser.core.symbol.SymbolTable;
import org.maltparser.core.syntaxgraph.LabelSet;
import org.maltparser.core.syntaxgraph.edge.Edge;
public interface DependencyNode extends ComparableNode {
/**
* Returns <i>true</i> if the node has at most one head, otherwise <i>false</i>.
*
* @return <i>true</i> if the node has at most one head, otherwise <i>false</i>.
*/
public boolean hasAtMostOneHead();
/**
* Returns <i>true</i> if the node has one or more head(s), otherwise <i>false</i>.
*
* @return <i>true</i> if the node has one or more head(s), otherwise <i>false</i>.
*/
public boolean hasHead();
public Set<DependencyNode> getHeads() throws MaltChainedException;
public Set<Edge> getHeadEdges() throws MaltChainedException;
/**
* Returns the head dependency node if it exists, otherwise <i>null</i>. If there exists more
* than one head the first head is returned according to the linear order of the terminals
* or the root if it is one of the heads.
*
* @return the head dependency node if it exists, otherwise <i>null</i>.
* @throws MaltChainedException
*/
public DependencyNode getHead() throws MaltChainedException;
/**
* Returns the edge between the head and the node if it exists, otherwise <i>null</i>. If there exists more
* than one head edge the first head edge is returned according to the linear order of the terminals
* or the root if it is one of the heads.
*
* @return the edge between the head and the node if it exists, otherwise <i>null</i>.
* @throws MaltChainedException
*/
public Edge getHeadEdge() throws MaltChainedException;
public boolean hasAncestorInside(int left, int right) throws MaltChainedException;
public void addHeadEdgeLabel(SymbolTable table, String symbol) throws MaltChainedException;
public void addHeadEdgeLabel(SymbolTable table, int code) throws MaltChainedException;
public void addHeadEdgeLabel(LabelSet labelSet) throws MaltChainedException;
public boolean hasHeadEdgeLabel(SymbolTable table) throws MaltChainedException;
public String getHeadEdgeLabelSymbol(SymbolTable table) throws MaltChainedException;
public int getHeadEdgeLabelCode(SymbolTable table) throws MaltChainedException;
public boolean isHeadEdgeLabeled() throws MaltChainedException;
public int nHeadEdgeLabels() throws MaltChainedException;
public Set<SymbolTable> getHeadEdgeLabelTypes() throws MaltChainedException;
public LabelSet getHeadEdgeLabelSet() throws MaltChainedException;
public DependencyNode getAncestor() throws MaltChainedException;
public DependencyNode getProperAncestor() throws MaltChainedException;
public boolean hasDependent();
/**
* Returns <i>true</i> if the node has one or more left dependents, otherwise <i>false</i>.
*
* @return <i>true</i> if the node has one or more left dependents, otherwise <i>false</i>.
*/
public boolean hasLeftDependent();
/**
* Returns the left dependent at the position <i>index</i>, where <i>index==0</i> equals the left most dependent.
*
* @param index the index
* @return the left dependent at the position <i>index</i>, where <i>index==0</i> equals the left most dependent
*/
public DependencyNode getLeftDependent(int index);
/**
* Return the number of left dependents
*
* @return the number of left dependents
*/
public int getLeftDependentCount();
/**
* Returns a sorted set of left dependents.
*
* @return a sorted set of left dependents.
*/
public SortedSet<DependencyNode> getLeftDependents();
/**
* Returns the left sibling if it exists, otherwise <code>null</code>
*
* @return the left sibling if it exists, otherwise <code>null</code>
*/
public DependencyNode getLeftSibling() throws MaltChainedException;
/**
* Returns the left sibling at the same side of head as the node it self. If not found <code>null</code is returned
*
* @return the left sibling at the same side of head as the node it self. If not found <code>null</code is returned
*/
public DependencyNode getSameSideLeftSibling() throws MaltChainedException;
/**
* Returns the closest left dependent to the node it self, if not found <code>null</code> is returned.
*
* @return the closest left dependent to the node it self, if not found <code>null</code> is returned.
*/
public DependencyNode getClosestLeftDependent();
public DependencyNode getLeftmostDependent();
public DependencyNode getRightDependent(int index);
/**
* Return the number of right dependents
*
* @return the number of right dependents
*/
public int getRightDependentCount();
/**
* Returns a sorted set of right dependents.
*
* @return a sorted set of right dependents.
*/
public SortedSet<DependencyNode> getRightDependents();
/**
* Returns the right sibling if it exists, otherwise <code>null</code>
*
* @return the right sibling if it exists, otherwise <code>null</code>
*/
public DependencyNode getRightSibling() throws MaltChainedException;
/**
* Returns the right sibling at the same side of head as the node it self. If not found <code>null</code is returned
*
* @return the right sibling at the same side of head as the node it self. If not found <code>null</code is returned
*/
public DependencyNode getSameSideRightSibling() throws MaltChainedException;
/**
* Returns the closest right dependent to the node it self, if not found <code>null</code> is returned.
*
* @return the closest right dependent to the node it self, if not found <code>null</code> is returned.
*/
public DependencyNode getClosestRightDependent();
public DependencyNode getRightmostDependent();
public boolean hasRightDependent();
/**
* Returns <i>true</i> if the head edge is projective, otherwise <i>false</i>. Undefined if the node has
* more than one head.
*
* @return <i>true</i> if the head edge is projective, otherwise <i>false</i>.
* @throws MaltChainedException
*/
public boolean isProjective() throws MaltChainedException;
/**
* Returns the depth of the node. The root node has the depth 0.
* @return the depth of the node.
* @throws MaltChainedException
*/
public int getDependencyNodeDepth() throws MaltChainedException;
public int getRank();
public void setRank(int r);
public DependencyNode findComponent();
public DependencyNode getComponent();
public void setComponent(DependencyNode x);
}