edu.cmu.tetrad.algcomparison.algorithm.external.ExternalAlgorithmPcalgGes Maven / Gradle / Ivy
package edu.cmu.tetrad.algcomparison.algorithm.external;
import edu.cmu.tetrad.algcomparison.algorithm.ExternalAlgorithm;
import edu.cmu.tetrad.data.DataModel;
import edu.cmu.tetrad.data.DataType;
import edu.cmu.tetrad.graph.EdgeListGraph;
import edu.cmu.tetrad.graph.Graph;
import edu.cmu.tetrad.graph.GraphNode;
import edu.cmu.tetrad.graph.Node;
import edu.cmu.tetrad.util.Parameters;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* An API to allow results from external algorithms to be included in a report through the algrorithm comparison tool.
* This one is for matrix generated by PC in pcalg. See below. This script can generate the files in R.
*
* library("MASS"); library("pcalg");
*
* path<-"/Users/user/tetrad/comparison-final"; simulation<-1;
*
* subdir<-"pc.solve.confl.TRUE"; dir.create(paste(path, "/save/", simulation, "/", subdir, sep=""));
*
* for (i in 1:10) { data<-read.table(paste(path, "/save/", simulation, "/data/data.", i, ".txt", sep=""),
* header=TRUE) n<-nrow(data) C<-cor(data) v<-names(data) suffStat<-list(C = C, n=n)
* pc.fit<-pc(suffStat=suffStat, indepTest=gaussCItest, alpha=0.001, labels=v, solve.conf=TRUE) A<-as(pc.fit,
* "amat") name<-paste(path, "/save/", simulation, "/", subdir, "/graph.", i, ".txt", sep="") print(name)
* write.matrix(A, file=name, sep="\t") }
*
* @author josephramsey
*/
public class ExternalAlgorithmPcalgGes extends ExternalAlgorithm {
private static final long serialVersionUID = 23L;
private final String extDir;
private final String shortDescription;
public ExternalAlgorithmPcalgGes(String extDir) {
this.extDir = extDir;
this.shortDescription = new File(extDir).getName().replace("_", " ");
}
public ExternalAlgorithmPcalgGes(String extDir, String shortDecription) {
this.extDir = extDir;
this.shortDescription = shortDecription;
}
/**
* Reads in the relevant graph from the file (see above) and returns it.
*/
public Graph search(DataModel dataSet, Parameters parameters) {
int index = getIndex(dataSet);
File nodes = new File(this.path, "/results/" + this.extDir + "/" + (this.simIndex + 1) + "/nodes." + index + ".txt");
System.out.println(nodes.getAbsolutePath());
List vars = new ArrayList<>();
try {
BufferedReader r = new BufferedReader(new FileReader(nodes));
String name;
while ((name = r.readLine()) != null) {
GraphNode node = new GraphNode(name.trim());
vars.add(node);
}
} catch (Exception e) {
e.printStackTrace();
}
File inEdges = new File(this.path, "/results/" + this.extDir + "/" + (this.simIndex + 1) + "/in.edges." + index + ".txt");
try {
BufferedReader r = new BufferedReader(new FileReader(inEdges));
String line;
Graph graph = new EdgeListGraph(vars);
for (Node var : vars) {
line = r.readLine();
String[] tokens = line.split(",");
for (String token : tokens) {
String trim = token.trim();
if (trim.isEmpty()) continue;
int j = Integer.parseInt(trim) - 1;
Node v2 = vars.get(j);
if (!graph.isAdjacentTo(v2, var)) {
graph.addDirectedEdge(v2, var);
} else {
graph.removeEdge(v2, var);
graph.addUndirectedEdge(v2, var);
}
}
}
return graph;
} catch (Exception e) {
e.printStackTrace();
}
throw new IllegalArgumentException("Could not parse graph.");
}
/**
* Returns the CPDAG of the supplied DAG.
*/
public Graph getComparisonGraph(Graph graph) {
return new EdgeListGraph(graph);
}
public String getDescription() {
if (this.shortDescription == null) {
return "Load data from " + this.path + "/" + this.extDir;
} else {
return this.shortDescription;
}
}
@Override
public DataType getDataType() {
return DataType.Continuous;
}
@Override
public long getElapsedTime(DataModel dataSet, Parameters parameters) {
int index = getIndex(dataSet);
File file = new File(this.path, "/elapsed/" + this.extDir + "/" + (this.simIndex + 1) + "/graph." + index + ".txt");
try {
BufferedReader r = new BufferedReader(new FileReader(file));
String l = r.readLine(); // Skip the first line.
return Long.parseLong(l);
} catch (IOException e) {
return -99;
}
}
}