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

com.sri.ai.util.gnuplot.GnuplotData Maven / Gradle / Ivy

/*
 * Copyright (c) 2013, SRI International
 * All rights reserved.
 * Licensed under the The BSD 3-Clause License;
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 * 
 * http://opensource.org/licenses/BSD-3-Clause
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 
 * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 * 
 * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * 
 * Neither the name of the aic-util nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package com.sri.ai.util.gnuplot;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import com.google.common.annotations.Beta;
import com.sri.ai.util.Util;
import com.sri.ai.util.base.NullaryFunction;

/**
 * A class aggregating all data for a gnuplot plot.
 * 
 * @author braz
 */
@Beta
public class GnuplotData {
	
	/** A list of string descriptions for each data series. */
	private List commandLineDescriptions;

	/** A list of File objects to be deleted at clean up. */
	private List filesToDelete = new LinkedList();

	/** Index used to name data files. */
	private int dataFileIndex = 0;

	public  GnuplotData(NullaryFunction> xSeries, List> dataSeriesList) {
		try {
			commandLineDescriptions = new LinkedList();
			for (DataSeries dataSeries : dataSeriesList) {
				commandLineDescriptions.add(getGnuplotCommandLineDescription(dataSeries, xSeries));
			}
		}
		catch (IOException e) {
			Util.fatalError("Could not generate data files for gnuplot.", e);
		}
	}

	/** @return a comma-separated string of descriptions. */
	public String getGnuplotCommandLinePlotArguments() {
		return Util.join(",", commandLineDescriptions);
	}

	/** 
	 * Get gnuplot command line description for a y-series to be plotted, including x-series data if available
	 * (that is, xSeries is not null).
	 */
	private  String getGnuplotCommandLineDescription(DataSeries dataSeries, NullaryFunction> xSeriesIteratorMaker) throws IOException {
		String titleClause = getClauseValueOrEmptyString(dataSeries.directives, "title ", "t ");
		if (titleClause.equals("")) {
			titleClause = getClauseValueOrEmptyString(dataSeries.directives, "notitle", "notitle");
		}
		
		String withClause = getClauseValueOrEmptyString(dataSeries.directives, "with ", "w ");
		
		boolean xSeriesIsAvailable = xSeriesIteratorMaker != null;
		
		Iterator xSeriesIterator = xSeriesIsAvailable? xSeriesIteratorMaker.apply() : null;
		
		String path = storeDataAndReturnPath(xSeriesIterator, dataSeries.dataIteratorMaker.apply());
		
		StringBuffer command = new StringBuffer();
		command.append("'" + path + "'");
		command.append(xSeriesIsAvailable? " using 1:2" : " using 1");
		command.append(" " + titleClause);
		command.append(" " + withClause);
		return command.toString();
	}

	private String getClauseValueOrEmptyString(List directives, String fullName, String abbreviation) {
		String clause = "";
		for (String directive : directives) {
			if (directive.startsWith(fullName) || directive.startsWith(abbreviation)) {
				clause = directive;
			}
		}
		return clause;
	}

	private  String storeDataAndReturnPath(Iterator xSeriesDataIterator, Iterator dataSeriesDataIterator) throws IOException {
		File tempFile = new File("gnuplot" + dataFileIndex++ + ".dat");
		BufferedWriter w = new BufferedWriter(new FileWriter(tempFile));
		
		if (xSeriesDataIterator != null) {
			writeDataWithXSeries(xSeriesDataIterator, dataSeriesDataIterator, w);
		}
		else {
			writeDataWithoutXSeries(dataSeriesDataIterator, w);
		}
		w.close();
		filesToDelete.add(tempFile);
		return tempFile.getPath();
	}

	private  void writeDataWithoutXSeries(Iterator dataSeriesDataIterator, BufferedWriter w) throws IOException {
		while (dataSeriesDataIterator.hasNext()) {
			Object y = dataSeriesDataIterator.next();
			w.write(y.toString());
			w.newLine();
		}
	}

	private  void writeDataWithXSeries(
			Iterator xSeriesDataIterator, Iterator dataSeriesDataIterator, BufferedWriter w) throws IOException {
		while (xSeriesDataIterator.hasNext()) {
			w.write(xSeriesDataIterator.next() + " " + dataSeriesDataIterator.next());
			w.newLine();
		}
	}

	public void cleanUp() {
//		for (File file : filesToDelete) {
//			file.deleteOnExit();
//		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy