/** * Runs PC starting with a commplete graph over the given list of nodes, using the given * independence test and knowledge and returns the resultant graph. The returned graph will be a * pattern if the independence information is consistent with the hypothesis that there are no * latent common causes. It may, however, contain cycles or bidirected edges if this assumption is * not born out, either due to the actual presence of latent common causes, or due to statistical * errors in conditional independence judgments. * * <p>All of the given nodes must be in the domain of the given conditional independence test. */ public Graph search(List<Node> nodes) { this.logger.log("info", "Starting PC algorithm"); this.logger.log("info", "Independence test = " + getIndependenceTest() + "."); // this.logger.log("info", "Variables " + independenceTest.getVariables()); long startTime = System.currentTimeMillis(); if (getIndependenceTest() == null) { throw new NullPointerException(); } List allNodes = getIndependenceTest().getVariables(); if (!allNodes.containsAll(nodes)) { throw new IllegalArgumentException( "All of the given nodes must " + "be in the domain of the independence test provided."); } graph = new EdgeListGraph(nodes); IFas fas = new FasStableConcurrent(initialGraph, getIndependenceTest()); fas.setKnowledge(getKnowledge()); fas.setDepth(getDepth()); fas.setVerbose(verbose); graph = fas.search(); sepsets = fas.getSepsets(); SearchGraphUtils.pcOrientbk(knowledge, graph, nodes); // SearchGraphUtils.orientCollidersUsingSepsets(this.sepsets, knowledge, graph, // initialGraph, verbose); // SearchGraphUtils.orientCollidersUsingSepsets(this.sepsets, knowledge, graph, verbose); // SearchGraphUtils.orientColeelidersLocally(knowledge, graph, independenceTest, depth); SearchGraphUtils.orientCollidersUsingSepsets(this.sepsets, knowledge, graph, verbose); MeekRules rules = new MeekRules(); rules.setAggressivelyPreventCycles(this.aggressivelyPreventCycles); rules.setKnowledge(knowledge); rules.orientImplied(graph); this.logger.log("graph", "\nReturning this graph: " + graph); this.elapsedTime = System.currentTimeMillis() - startTime; this.logger.log("info", "Elapsed time = " + (elapsedTime) / 1000. + " s"); this.logger.log("info", "Finishing PC Algorithm."); this.logger.flush(); return graph; }
public ImpliedOrientation getMeekRules() { MeekRules meekRules = new MeekRules(); meekRules.setAggressivelyPreventCycles(this.isAggressivelyPreventCycles()); meekRules.setKnowledge(getParams().getKnowledge()); return meekRules; }