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

marytts.cart.io.WagonCARTWriter Maven / Gradle / Ivy

The newest version!
/**
 * Copyright 2006 DFKI GmbH.
 * All Rights Reserved.  Use is subject to license terms.
 *
 * This file is part of MARY TTS.
 *
 * MARY TTS is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, version 3 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see .
 *
 */
package marytts.cart.io;

import java.io.BufferedOutputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;

import marytts.cart.CART;
import marytts.cart.DecisionNode;
import marytts.cart.Node;
import marytts.cart.LeafNode.FeatureVectorLeafNode;
import marytts.cart.LeafNode.FloatLeafNode;
import marytts.cart.LeafNode.IntAndFloatArrayLeafNode;
import marytts.cart.LeafNode.IntArrayLeafNode;
import marytts.features.FeatureVector;
import marytts.util.data.MaryHeader;

/**
 * IO functions for CARTs in WagonCART format
 * 
 * @author Anna Hunecke, Marc Schröder, Marcela Charfuelan
 */
public class WagonCARTWriter {

	/**
	 * Dump the CARTs in the cart map to destinationDir/CARTS.bin
	 * 
	 * @param cart
	 *            tree
	 * @param destFile
	 *            the destination file
	 * @throws IOException
	 *             IOException
	 */
	public void dumpWagonCART(CART cart, String destFile) throws IOException {
		System.out.println("Dumping CART to " + destFile + " ...");

		// Open the destination file (cart.bin) and output the header
		DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(destFile)));
		// create new CART-header and write it to output file
		MaryHeader hdr = new MaryHeader(MaryHeader.CARTS);
		hdr.writeTo(out);

		// write number of nodes
		out.writeInt(cart.getNumNodes());
		String name = "";
		// dump name and CART
		out.writeUTF(name);
		// dump CART
		dumpBinary(cart, out);

		// finish
		out.close();
		System.out.println(" ... done\n");
	}

	/**
	 * Debug output to a text file
	 * 
	 * @param cart
	 *            the cart tree
	 * @param pw
	 *            the print writer of the text file
	 * @throws IOException
	 *             IOException
	 */
	public void toTextOut(CART cart, PrintWriter pw) throws IOException {
		try {
			toWagonFormat(cart.getRootNode(), null, "", pw);
			pw.flush();
			pw.close();
		} catch (IOException ioe) {
			IOException newIOE = new IOException("Error dumping CART to standard output");
			newIOE.initCause(ioe);
			throw newIOE;
		}
	}

	/**
	 * Dumps this CART to the output stream in WagonFormat.
	 * 
	 * @param os
	 *            the output stream
	 * @param cart
	 *            the cart tree
	 * 
	 * @throws IOException
	 *             if an error occurs during output
	 */
	public void dumpBinary(CART cart, DataOutput os) throws IOException {
		try {
			toWagonFormat(cart.getRootNode(), (DataOutputStream) os, null, null);
		} catch (IOException ioe) {
			IOException newIOE = new IOException("Error dumping CART to output stream");
			newIOE.initCause(ioe);
			throw newIOE;
		}
	}

	private void toWagonFormat(Node node, DataOutputStream out, String extension, PrintWriter pw) throws IOException {

		if (node instanceof DecisionNode)
			toWagonFormat(((DecisionNode) node), out, extension, pw);

		else if (node instanceof FeatureVectorLeafNode)
			toWagonFormat(((FeatureVectorLeafNode) node), out, extension, pw);

		else if (node instanceof FloatLeafNode)
			toWagonFormat(((FloatLeafNode) node), out, extension, pw);

		// As StringAndFloatLeafNode is just a convenience wrapper around IntAndFloatArrayLeafNode,
		// there is no need to distinguish them in IO.
		else if (node instanceof IntAndFloatArrayLeafNode)
			toWagonFormat(((IntAndFloatArrayLeafNode) node), out, extension, pw);

		else if (node instanceof IntArrayLeafNode)
			toWagonFormat(((IntArrayLeafNode) node), out, extension, pw);

	}

	/**
	 * Writes the Cart to the given DataOut in Wagon Format
	 * 
	 * @param out
	 *            the outputStream
	 * @param extension
	 *            the extension that is added to the last daughter
	 */
	private void toWagonFormat(DecisionNode node, DataOutputStream out, String extension, PrintWriter pw) throws IOException {
		if (out != null) {
			// dump to output stream
			// two open brackets + definition of node
			writeStringToOutput("((" + node.getNodeDefinition() + ")", out);
		} else {
			// dump to Standard out
			// two open brackets + definition of node
			// System.out.println("(("+getNodeDefinition());
		}
		if (pw != null) {
			// dump to print writer
			// two open brackets + definition of node
			pw.println("((" + node.getNodeDefinition() + ")");
		}
		// add the daughters
		for (int i = 0; i < node.getNumberOfDaugthers(); i++) {

			if (node.getDaughter(i) == null) {
				String nullDaughter = "";

				if (i + 1 != node.getNumberOfDaugthers()) {
					nullDaughter = "((() 0))";

				} else {
					// extension must be added to last daughter
					if (extension != null) {
						nullDaughter = "((() 0)))" + extension;

					} else {
						// we are in the root node, add a closing bracket
						nullDaughter = "((() 0)))";
					}
				}

				if (out != null) {
					// dump to output stream
					writeStringToOutput(nullDaughter, out);
				} else {
					// dump to Standard out
					// System.out.println(nullDaughter);
				}
				if (pw != null) {
					pw.println(" " + nullDaughter);
				}
			} else {
				if (i + 1 != node.getNumberOfDaugthers()) {

					toWagonFormat(node.getDaughter(i), out, "", pw);
					// daughters[i].toWagonFormat(out, "", pw);
				} else {

					// extension must be added to last daughter
					if (extension != null) {
						toWagonFormat(node.getDaughter(i), out, ")" + extension, pw);
						// daughters[i].toWagonFormat(out, ")" + extension, pw);
					} else {
						// we are in the root node, add a closing bracket
						toWagonFormat(node.getDaughter(i), out, ")", pw);
						// daughters[i].toWagonFormat(out, ")", pw);
					}
				}
			}
		}
	}

	/**
	 * Writes the Cart to the given DataOut in Wagon Format
	 * 
	 * @param out
	 *            the outputStream
	 * @param extension
	 *            the extension that is added to the last daughter
	 */
	private void toWagonFormat(FeatureVectorLeafNode node, DataOutputStream out, String extension, PrintWriter pw)
			throws IOException {
		StringBuilder sb = new StringBuilder();
		FeatureVector fv[] = node.getFeatureVectors();

		// open three brackets
		sb.append("(((");
		// make sure that we have a feature vector array
		// this is done when calling getFeatureVectors().
		// if (growable &&
		// (featureVectors == null
		// || featureVectors.length == 0)){
		// featureVectors = (FeatureVector[])
		// featureVectorList.toArray(
		// new FeatureVector[featureVectorList.size()]);
		// }
		// for each index, write the index and then a pseudo float
		for (int i = 0; i < fv.length; i++) {
			sb.append("(" + fv[i].getUnitIndex() + " 0)");
			if (i + 1 != fv.length) {
				sb.append(" ");
			}
		}
		// write the ending
		sb.append(") 0))" + extension);
		// dump the whole stuff
		if (out != null) {
			// write to output stream

			writeStringToOutput(sb.toString(), out);
		} else {
			// write to Standard out
			// System.out.println(sb.toString());
		}
		if (pw != null) {
			// dump to printwriter
			pw.println(sb.toString());
		}
	}

	/**
	 * Writes the Cart to the given DataOut in Wagon Format
	 * 
	 * @param out
	 *            the outputStream
	 * @param extension
	 *            the extension that is added to the last daughter
	 */
	private void toWagonFormat(FloatLeafNode node, DataOutputStream out, String extension, PrintWriter pw) throws IOException {
		String s = "((" + node.getStDeviation() // stddev
				+ " " + node.getMean() // mean
				+ "))";
		// dump the whole stuff
		if (out != null) {
			// write to output stream

			writeStringToOutput(s, out);
		} else {
			// write to Standard out
			// System.out.println(sb.toString());
		}
		if (pw != null) {
			// dump to printwriter
			pw.println(s);
		}
	}

	/**
	 * Writes the Cart to the given DataOut in Wagon Format
	 * 
	 * @param out
	 *            the outputStream
	 * @param extension
	 *            the extension that is added to the last daughter
	 */
	private void toWagonFormat(IntAndFloatArrayLeafNode node, DataOutputStream out, String extension, PrintWriter pw)
			throws IOException {
		StringBuilder sb = new StringBuilder();
		int data[] = node.getIntData();
		float floats[] = node.getFloatData();

		// open three brackets
		sb.append("(((");
		// for each index, write the index and then its float
		for (int i = 0; i < data.length; i++) {
			sb.append("(" + data[i] + " " + floats[i] + ")");
			if (i + 1 != data.length) {
				sb.append(" ");
			}
		}
		// write the ending
		sb.append(") 0))" + extension);
		// dump the whole stuff
		if (out != null) {
			// write to output stream

			writeStringToOutput(sb.toString(), out);
		} else {
			// write to Standard out
			// System.out.println(sb.toString());
		}
		if (pw != null) {
			// dump to printwriter
			pw.println(sb.toString());
		}
	}

	/**
	 * Writes the Cart to the given DataOut in Wagon Format
	 * 
	 * @param out
	 *            the outputStream
	 * @param extension
	 *            the extension that is added to the last daughter
	 */
	private void toWagonFormat(IntArrayLeafNode node, DataOutputStream out, String extension, PrintWriter pw) throws IOException {
		StringBuilder sb = new StringBuilder();
		int data[] = node.getIntData();

		// open three brackets
		sb.append("(((");
		// for each index, write the index and then a pseudo float
		for (int i = 0; i < data.length; i++) {
			sb.append("(" + data[i] + " 0)");
			if (i + 1 != data.length) {
				sb.append(" ");
			}
		}
		// write the ending
		sb.append(") 0))" + extension);
		// dump the whole stuff
		if (out != null) {
			// write to output stream

			writeStringToOutput(sb.toString(), out);
		} else {
			// write to Standard out
			// System.out.println(sb.toString());
		}
		if (pw != null) {
			// dump to printwriter
			pw.println(sb.toString());
		}
	}

	/**
	 * Write the given String to the given data output (Replacement for writeUTF)
	 * 
	 * @param str
	 *            the String
	 * @param out
	 *            the data output
	 */
	private static void writeStringToOutput(String str, DataOutput out) throws IOException {
		out.writeInt(str.length());
		out.writeChars(str);
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy