All Downloads are FREE. Search and download functionalities are using the official Maven repository.

marytts.cart.Node Maven / Gradle / Ivy

The newest version!
/**
 * Portions Copyright 2006 DFKI GmbH.
 * Portions Copyright 2001 Sun Microsystems, Inc.
 * Portions Copyright 1999-2001 Language Technologies Institute, 
 * Carnegie Mellon University.
 * All Rights Reserved.  Use is subject to license terms.
 * 
 * Permission is hereby granted, free of charge, to use and distribute
 * this software and its documentation without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of this work, and to
 * permit persons to whom this work is furnished to do so, subject to
 * the following conditions:
 * 
 * 1. The code must retain the above copyright notice, this list of
 *    conditions and the following disclaimer.
 * 2. Any modifications must be clearly marked as such.
 * 3. Original authors' names are not deleted.
 * 4. The authors' names are not used to endorse or promote products
 *    derived from this software without specific prior written
 *    permission.
 *
 * DFKI GMBH AND THE CONTRIBUTORS TO THIS WORK DISCLAIM ALL WARRANTIES WITH
 * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DFKI GMBH NOR THE
 * CONTRIBUTORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
 * THIS SOFTWARE.
 */
package marytts.cart;

/**
 * A node for the CART or DirectedGraph. All node types inherit from this class
 */
public abstract class Node {
	// isRoot should be set to true if this node is the root node
	protected boolean isRoot;

	// every node except the root node has a mother
	protected Node mother;

	// the index of the node in the daughters array of its mother
	protected int nodeIndex;

	/**
	 * set the mother node of this node, and remember this node's index in mother.
	 * 
	 * @param node
	 *            the mother node
	 * @param nodeIndex
	 *            the index of this node in the mother node's list of daughters
	 */
	public void setMother(Node node, int nodeIndex) {
		this.mother = node;
		this.nodeIndex = nodeIndex;
	}

	/**
	 * Get the mother node of this node
	 * 
	 * @return the mother node
	 */
	public Node getMother() {
		return mother;
	}

	/**
	 * Get the index of this node in the mother's array of daughters
	 * 
	 * @return the index
	 */
	public int getNodeIndex() {
		return nodeIndex;
	}

	/**
	 * Set isRoot to the given value
	 * 
	 * @param isRoot
	 *            the new value of isRoot
	 */
	public void setIsRoot(boolean isRoot) {
		this.isRoot = isRoot;
	}

	/**
	 * Get the setting of isRoot
	 * 
	 * @return the setting of isRoot
	 */
	public boolean isRoot() {
		return isRoot;
	}

	public boolean isDecisionNode() {
		return false;
	}

	public boolean isLeafNode() {
		return false;
	}

	public boolean isDirectedGraphNode() {
		return false;
	}

	public Node getRootNode() {
		if (isRoot) {
			assert mother == null;
			return this;
		} else {
			assert mother != null : " I am not root but I have no mother :-(";
			return mother.getRootNode();
		}
	}

	public String getDecisionPath() {
		String ancestorInfo;
		if (mother == null)
			ancestorInfo = "null";
		else if (mother.isDecisionNode()) {
			ancestorInfo = ((DecisionNode) mother).getDecisionPath(getNodeIndex());
		} else {
			ancestorInfo = mother.getDecisionPath();
		}
		return ancestorInfo + " - " + toString();
	}

	/**
	 * Count all the nodes at and below this node. A leaf will return 1; the root node will report the total number of decision
	 * and leaf nodes in the tree.
	 * 
	 * @return number of nodes
	 */
	public abstract int getNumberOfNodes();

	/**
	 * Count all the data available at and below this node. The meaning of this depends on the type of nodes; for example, when
	 * IntArrayLeafNodes are used, it is the total number of ints that are saved in all leaf nodes below the current node.
	 * 
	 * @return an int counting the data below the current node, or -1 if such a concept is not meaningful.
	 */
	public abstract int getNumberOfData();

	/**
	 * Get all the data at or below this node. The type of data returned depends on the type of nodes; for example, when
	 * IntArrayLeafNodes are used, one int[] is returned which contains all int values in all leaf nodes below the current node.
	 * 
	 * @return an object containing all data below the current node, or null if such a concept is not meaningful.
	 */
	public abstract Object getAllData();

	/**
	 * Write this node's data into the target object at pos, making sure that exactly len data are written. The type of data
	 * written depends on the type of nodes; for example, when IntArrayLeafNodes are used, target would be an int[].
	 * 
	 * @param target
	 *            the object to write to, usually an array.
	 * @param pos
	 *            the position in the target at which to start writing
	 * @param len
	 *            the amount of data items to write, usually equals getNumberOfData().
	 */
	protected abstract void fillData(Object target, int pos, int len);

	public String toString(String prefix) {
		return prefix + this.toString();
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy