// RWilcoxon.java
//
// Author:
// Antonio J. Nebro <antonio@lcc.uma.es>
// Juan J. Durillo <durillo@lcc.uma.es>
//
// Copyright (c) 2011 Antonio J. Nebro, Juan J. Durillo
//
// This program 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, either version 3 of the License, or
// (at your option) any later version.
//
// 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 <http://www.gnu.org/licenses/>.
package jmetal.experiments.util;
import jmetal.experiments.Experiment;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/**
* Class producing R scripts that generate latex tables including the Wilcoxon
* rank-sum test
*/
public class RWilcoxon {
/**
* @param problems
* @param prefix
* @throws java.io.FileNotFoundException
* @throws java.io.IOException
*/
public static void generateScripts(
String[] problems,
String prefix,
Experiment experiment) throws IOException {
// STEP 1. Creating R output directory
String rDirectory = "R";
rDirectory = experiment.experimentBaseDirectory_ + "/" + rDirectory;
System.out.println("R : " + rDirectory);
File rOutput;
rOutput = new File(rDirectory);
if (!rOutput.exists()) {
new File(rDirectory).mkdirs();
System.out.println("Creating " + rDirectory + " directory");
}
for (int indicator = 0; indicator < experiment.indicatorList_.length; indicator++) {
System.out.println("Indicator: " + experiment.indicatorList_[indicator]);
String rFile = rDirectory + "/" + prefix + "." + experiment.indicatorList_[indicator] + ".Wilcox.R";
String texFile = rDirectory + "/" + prefix + "." + experiment.indicatorList_[indicator] + ".Wilcox.tex";
FileWriter os = new FileWriter(rFile, false);
String output = "write(\"\", \"" + texFile + "\",append=FALSE)";
os.write(output + "\n");
// Generate function latexHeader()
String dataDirectory = experiment.experimentBaseDirectory_ + "/data";
os.write("resultDirectory<-\"" + dataDirectory + "\"" + "\n");
output = "latexHeader <- function() {" + "\n" +
" write(\"\\\\documentclass{article}\", \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\"\\\\title{StandardStudy}\", \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\"\\\\usepackage{amssymb}\", \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\"\\\\author{A.J.Nebro}\", \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\"\\\\begin{document}\", \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\"\\\\maketitle\", \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\"\\\\section{Tables}\", \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\"\\\\\", \"" + texFile + "\", append=TRUE)" + "\n" + "}" + "\n";
os.write(output + "\n");
// Write function latexTableHeader
String latexTableLabel = "";
String latexTabularAlignment = "";
String latexTableFirstLine = "";
String latexTableCaption = "";
latexTableCaption = " write(\"\\\\caption{\", \"" + texFile + "\", append=TRUE)" + "\n" +
" write(problem, \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\"." + experiment.indicatorList_[indicator] + ".}\", \"" + texFile + "\", append=TRUE)" + "\n";
latexTableLabel = " write(\"\\\\label{Table:\", \"" + texFile + "\", append=TRUE)" + "\n" +
" write(problem, \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\"." + experiment.indicatorList_[indicator] + ".}\", \"" + texFile + "\", append=TRUE)" + "\n";
latexTabularAlignment = "l";
latexTableFirstLine = "\\\\hline ";
for (int i = 1; i < experiment.algorithmNameList_.length; i++) {
latexTabularAlignment += "c";
latexTableFirstLine += " & " + experiment.algorithmNameList_[i];
} // for
//latexTableFirstLine += "\\\\\\\\\",\"" + texFile + "\", append=TRUE)" + "\n";
latexTableFirstLine += "\\\\\\\\ \"";
// Generate function latexTableHeader()
output = "latexTableHeader <- function(problem, tabularString, latexTableFirstLine) {" + "\n" +
" write(\"\\\\begin{table}\", \"" + texFile + "\", append=TRUE)" + "\n" +
latexTableCaption + "\n" +
latexTableLabel + "\n" +
" write(\"\\\\centering\", \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\"\\\\begin{scriptsize}\", \"" + texFile + "\", append=TRUE)" + "\n" +
//" write(\"\\\\begin{tabular}{" + latexTabularAlignment + "}\", \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\"\\\\begin{tabular}{\", \"" + texFile + "\", append=TRUE)" + "\n" +
" write(tabularString, \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\"}\", \"" + texFile + "\", append=TRUE)" + "\n" +
//latexTableFirstLine +
" write(latexTableFirstLine, \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\"\\\\hline \", \"" + texFile + "\", append=TRUE)" + "\n" + "}" + "\n";
os.write(output + "\n");
// Generate function latexTableTail()
output = "latexTableTail <- function() { " + "\n" +
" write(\"\\\\hline\", \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\"\\\\end{tabular}\", \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\"\\\\end{scriptsize}\", \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\"\\\\end{table}\", \"" + texFile + "\", append=TRUE)" + "\n" + "}" + "\n";
os.write(output + "\n");
// Generate function latexTail()
output = "latexTail <- function() { " + "\n" +
" write(\"\\\\end{document}\", \"" + texFile + "\", append=TRUE)" + "\n" + "}" + "\n";
os.write(output + "\n");
if ((Boolean) experiment.indicatorMinimize_.get(experiment.indicatorList_[indicator])) {// minimize by default
// Generate function printTableLine()
output = "printTableLine <- function(indicator, algorithm1, algorithm2, i, j, problem) { " + "\n" +
" file1<-paste(resultDirectory, algorithm1, sep=\"/\")" + "\n" +
" file1<-paste(file1, problem, sep=\"/\")" + "\n" +
" file1<-paste(file1, indicator, sep=\"/\")" + "\n" +
" data1<-scan(file1)" + "\n" +
" file2<-paste(resultDirectory, algorithm2, sep=\"/\")" + "\n" +
" file2<-paste(file2, problem, sep=\"/\")" + "\n" +
" file2<-paste(file2, indicator, sep=\"/\")" + "\n" +
" data2<-scan(file2)" + "\n" +
" if (i == j) {" + "\n" +
" write(\"-- \", \"" + texFile + "\", append=TRUE)" + "\n" +
" }" + "\n" +
" else if (i < j) {" + "\n" +
" if (wilcox.test(data1, data2)$p.value <= 0.05) {" + "\n" +
" if (median(data1) <= median(data2)) {" + "\n" +
" write(\"$\\\\blacktriangle$\", \"" + texFile + "\", append=TRUE)" + "\n" +
" }" + "\n" +
" else {" + "\n" +
" write(\"$\\\\triangledown$\", \"" + texFile + "\", append=TRUE) " + "\n" +
" }" + "\n" +
" }" + "\n" +
" else {" + "\n" +
" write(\"--\", \"" + texFile + "\", append=TRUE) " + "\n" +
" }" + "\n" +
" }" + "\n" +
" else {" + "\n" +
" write(\" \", \"" + texFile + "\", append=TRUE)" + "\n" +
" }" + "\n" +
"}" + "\n";
} // if
else {
// Generate function printTableLine()
output = "printTableLine <- function(indicator, algorithm1, algorithm2, i, j, problem) { " + "\n" +
" file1<-paste(resultDirectory, algorithm1, sep=\"/\")" + "\n" +
" file1<-paste(file1, problem, sep=\"/\")" + "\n" +
" file1<-paste(file1, indicator, sep=\"/\")" + "\n" +
" data1<-scan(file1)" + "\n" +
" file2<-paste(resultDirectory, algorithm2, sep=\"/\")" + "\n" +
" file2<-paste(file2, problem, sep=\"/\")" + "\n" +
" file2<-paste(file2, indicator, sep=\"/\")" + "\n" +
" data2<-scan(file2)" + "\n" +
" if (i == j) {" + "\n" +
" write(\"--\", \"" + texFile + "\", append=TRUE)" + "\n" +
" }" + "\n" +
" else if (i < j) {" + "\n" +
" if (wilcox.test(data1, data2)$p.value <= 0.05) {" + "\n" +
" if (median(data1) >= median(data2)) {" + "\n" +
" write(\"$\\\\blacktriangle$\", \"" + texFile + "\", append=TRUE)" + "\n" +
" }" + "\n" +
" else {" + "\n" +
" write(\"$\\\\triangledown$\", \"" + texFile + "\", append=TRUE) " + "\n" +
" }" + "\n" +
" }" + "\n" +
" else {" + "\n" +
" write(\"--\", \"" + texFile + "\", append=TRUE) " + "\n" +
" }" + "\n" +
" }" + "\n" +
" else {" + "\n" +
" write(\" \", \"" + texFile + "\", append=TRUE)" + "\n" +
" }" + "\n" +
"}" + "\n";
}
os.write(output + "\n");
// Start of the R script
output = "### START OF SCRIPT ";
os.write(output + "\n");
String problemList = "problemList <-c(";
String algorithmList = "algorithmList <-c(";
for (int i = 0; i < (problems.length - 1); i++) {
problemList += "\"" + problems[i] + "\", ";
}
problemList += "\"" + problems[problems.length - 1] + "\") ";
for (int i = 0; i < (experiment.algorithmNameList_.length - 1); i++) {
algorithmList += "\"" + experiment.algorithmNameList_[i] + "\", ";
}
algorithmList += "\"" + experiment.algorithmNameList_[experiment.algorithmNameList_.length - 1] + "\") ";
latexTabularAlignment = "l";
for (int i = 1; i < experiment.algorithmNameList_.length; i++) {
latexTabularAlignment += "c";
} // for
String tabularString = "tabularString <-c(" + "\""+ latexTabularAlignment + "\""+ ") " ;
String tableFirstLine = "latexTableFirstLine <-c(" + "\"" + latexTableFirstLine + ") " ;
output = "# Constants" + "\n" +
problemList + "\n" +
algorithmList + "\n" +
tabularString + "\n" +
tableFirstLine + "\n" +
"indicator<-\"" + experiment.indicatorList_[indicator] + "\"";
os.write(output + "\n");
output = "\n # Step 1. Writes the latex header" + "\n" +
"latexHeader()";
os.write(output + "\n");
// Generate tables per problem
output = "# Step 2. Problem loop " + "\n" +
"for (problem in problemList) {" + "\n" +
" latexTableHeader(problem, tabularString, latexTableFirstLine)" + "\n\n" +
" indx = 0" + "\n" +
" for (i in algorithmList) {" + "\n" +
" if (i != \"" + experiment.algorithmNameList_[experiment.algorithmNameList_.length - 1]+ "\") {" + "\n" +
" write(i , \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\" & \", \"" + texFile + "\", append=TRUE)" + "\n" +
" jndx = 0 " + "\n" +
" for (j in algorithmList) {" + "\n" +
" if (jndx != 0) {" + "\n" +
" if (indx != jndx) {" + "\n" +
" printTableLine(indicator, i, j, indx, jndx, problem)" + "\n" +
" }" + "\n" +
" else {" + "\n" +
" write(\" \", \"" + texFile + "\", append=TRUE)" + "\n" +
" }" + "\n" +
" if (j != \"" + experiment.algorithmNameList_[experiment.algorithmNameList_.length - 1] + "\") {" + "\n" +
" write(\" & \", \"" + texFile + "\", append=TRUE)" + "\n" +
" }" + "\n" +
" else {" + "\n" +
" write(\" \\\\\\\\ \", \"" + texFile + "\", append=TRUE)" + "\n" +
" }" + "\n" +
" }" + "\n" +
" jndx = jndx + 1" + "\n" +
" }" + "\n" +
" indx = indx + 1" + "\n" +
" }" + "\n" +
" }" + "\n" + "\n" +
" latexTableTail()" + "\n" +
"} # for problem" + "\n";
os.write(output + "\n");
// Generate full table
problemList = "";
for (String problem : problems) {
problemList += problem + " ";
}
// The tabular environment and the latexTableFirstLine encodings.variable must be redefined
latexTabularAlignment = "| l | ";
latexTableFirstLine = "\\\\hline \\\\multicolumn{1}{|c|}{}";
for (int i = 1; i < experiment.algorithmNameList_.length; i++) {
for (String problem : problems) {
latexTabularAlignment += "p{0.15cm} ";
//latexTabularAlignment += "c ";
} // for
latexTableFirstLine += " & \\\\multicolumn{" + problems.length + "}{c|}{" + experiment.algorithmNameList_[i]+"}";
latexTabularAlignment += " | " ;
} // for
latexTableFirstLine += " \\\\\\\\";
tabularString = "tabularString <-c(" + "\""+ latexTabularAlignment + "\""+ ") " ;
latexTableFirstLine = "latexTableFirstLine <-c(" + "\""+ latexTableFirstLine + "\""+ ") " ;
output = tabularString;
os.write(output + "\n" + "\n");
output = latexTableFirstLine ;
os.write(output + "\n" + "\n");
output = "# Step 3. Problem loop " + "\n" +
"latexTableHeader(\"" + problemList + "\", tabularString, latexTableFirstLine)" + "\n\n" +
"indx = 0" + "\n" +
"for (i in algorithmList) {" + "\n" +
" if (i != \"" + experiment.algorithmNameList_[experiment.algorithmNameList_.length - 1]+ "\") {" + "\n" +
" write(i , \"" + texFile + "\", append=TRUE)" + "\n" +
" write(\" & \", \"" + texFile + "\", append=TRUE)" + "\n" + "\n" +
" jndx = 0" + "\n" +
" for (j in algorithmList) {" + "\n" +
" for (problem in problemList) {" + "\n" +
" if (jndx != 0) {" + "\n" +
" if (i != j) {" + "\n" +
" printTableLine(indicator, i, j, indx, jndx, problem)" + "\n" +
" }" + "\n" +
" else {" + "\n" +
" write(\" \", \"" + texFile + "\", append=TRUE)" + "\n" +
" } " + "\n" +
" if (problem == \"" + problems[problems.length - 1] + "\") {" + "\n" +
" if (j == \"" + experiment.algorithmNameList_[experiment.algorithmNameList_.length - 1] + "\") {" + "\n" +
" write(\" \\\\\\\\ \", \"" + texFile + "\", append=TRUE)" + "\n" +
" } " + "\n" +
" else {" + "\n" +
" write(\" & \", \"" + texFile + "\", append=TRUE)" + "\n" +
" }" + "\n" +
" }" + "\n" +
" else {" + "\n" +
" write(\"&\", \"" + texFile + "\", append=TRUE)" + "\n" +
" }" + "\n" +
" }" + "\n" +
" }" + "\n" +
" jndx = jndx + 1" + "\n" +
" }" + "\n" +
" indx = indx + 1" + "\n" +
" }" + "\n" +
"} # for algorithm" + "\n" + "\n" +
" latexTableTail()" + "\n";
os.write(output + "\n");
// Generate end of file
output = "#Step 3. Writes the end of latex file " + "\n" +
"latexTail()" + "\n";
os.write(output + "\n");
os.close();
} // for
} // generateRBoxplotScripts
}