unshieldedTriples) {
@@ -2891,7 +2891,7 @@ public static boolean isCorrectBidirectedEdge(Edge edge, Graph trueGraph) {
}
/**
- * Repairs a faulty PAG (Partially Directed Acyclic Graph).
+ * Guarantees a legal PAG by repairing deviations of a graph from a legal PAG (partial ancestral graph).
*
* Two types of repairs are attempted. First, if there is an edge x <-> y with a path x ~~> y, then the
* unshielded colldiers into x are removed and the graph is rebuilt.
@@ -2909,10 +2909,11 @@ public static boolean isCorrectBidirectedEdge(Edge edge, Graph trueGraph) {
* @param unshieldedColliders the set of unshielded colliders to be updated
* @param checkCyclicity indicates whether or not to check for cyclicity
* @param verbose indicates whether or not to print verbose output
+ * @return the repaired PAG
* @throws IllegalArgumentException if the estimated PAG contains a directed cycle
*/
- public static Graph repairFaultyPag(Graph pag, FciOrient fciOrient, Knowledge knowledge,
- Set unshieldedColliders, boolean checkCyclicity, boolean verbose) {
+ public static Graph guaranteePag(Graph pag, FciOrient fciOrient, Knowledge knowledge,
+ Set unshieldedColliders, boolean checkCyclicity, boolean verbose) {
if (verbose) {
TetradLogger.getInstance().log("Repairing faulty PAG...");
}
@@ -3397,6 +3398,16 @@ private static void dsepFollowPath2(Node a, Node x, Node y, Set dsep, Set<
path.remove(a);
}
+ /**
+ * Removes almost cycles from a graph.
+ *
+ * @param unshieldedColliders a set of unshielded colliders
+ * @param fciOrient the FciOrient object
+ * @param pag the graph
+ * @param knowledge the knowledge base
+ * @param verbose a flag indicating whether to log verbose output
+ * @return true if any change was made to the graph, false otherwise
+ */
public static boolean removeAlmostCycles2(Set unshieldedColliders, FciOrient fciOrient,
Graph pag, Knowledge knowledge, boolean verbose) {
if (verbose) {
@@ -3516,6 +3527,16 @@ public static boolean removeAlmostCycles2(Set unshieldedColliders, FciOr
return anyChange;
}
+ /**
+ * Removes cycles from the given graph using the Fast Causal Inference (FCI) algorithm.
+ *
+ * @param unshieldedColliders the set of unshielded colliders.
+ * @param fciOrient the FciOrient object used for orientation
+ * @param pag the graph to remove cycles from
+ * @param knowledge the knowledge base used by the FCI algorithm
+ * @param verbose a flag indicating whether to log verbose information
+ * @return true if any cycles were removed, false otherwise
+ */
public static boolean removeCycles(Set unshieldedColliders, FciOrient fciOrient,
Graph pag, Knowledge knowledge, boolean verbose) {
if (verbose) {
@@ -3678,10 +3699,11 @@ public static boolean triple(Graph graph, Node a, Node b, Node c) {
/**
* Determines if the collider is allowed.
*
- * @param pag The Graph representing the PAG.
- * @param x The Node object representing the first node.
- * @param b The Node object representing the second node.
- * @param y The Node object representing the third node.
+ * @param pag The Graph representing the PAG.
+ * @param x The Node object representing the first node.
+ * @param b The Node object representing the second node.
+ * @param y The Node object representing the third node.
+ * @param knowledge The Knowledge object.
* @return true if the collider is allowed, false otherwise.
*/
public static boolean colliderAllowed(Graph pag, Node x, Node b, Node y, Knowledge knowledge) {
@@ -3694,6 +3716,8 @@ public static boolean colliderAllowed(Graph pag, Node x, Node b, Node y, Knowled
* @param fciOrient The FciOrient object used for orienting the edges.
* @param pag The Graph representing the PAG.
* @param best The list of Node objects representing the best nodes.
+ * @param knowledge The Knowledge object.
+ * @param verbose A boolean value indicating whether verbose output should be printed.
*/
public static void doRequiredOrientations(FciOrient fciOrient, Graph pag, List best, Knowledge knowledge, boolean verbose) {
if (verbose) {
diff --git a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/BFci.java b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/BFci.java
index 91cc05ff1d..4a21d4746c 100644
--- a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/BFci.java
+++ b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/BFci.java
@@ -133,9 +133,9 @@ public final class BFci implements IGraphSearch {
*/
private boolean verbose;
/**
- * Whether to repair a faulty PAG.
+ * Whether to guarantee the output is a PAG by repairing a faulty PAG.
*/
- private boolean repairFaultyPag;
+ private boolean guaranteePag;
/**
* Whether to leave out the final orientation step.
*/
@@ -222,8 +222,8 @@ public Graph search() {
GraphUtils.replaceNodes(graph, this.independenceTest.getVariables());
- if (repairFaultyPag) {
- graph = GraphUtils.repairFaultyPag(graph, fciOrient, knowledge, unshieldedTriples, false, verbose);
+ if (guaranteePag) {
+ graph = GraphUtils.guaranteePag(graph, fciOrient, knowledge, unshieldedTriples, false, verbose);
}
return graph;
@@ -346,12 +346,12 @@ public void setNumThreads(int numThreads) {
}
/**
- * Sets whether to repair a faulty PAG.
+ * Sets whether to guarantee the output is a PAG by repairing a faulty PAG.
*
- * @param repairFaultyPag True if a faulty PAG should be repaired, false otherwise.
+ * @param guaranteePag True if a faulty PAG should be repaired, false otherwise.
*/
- public void setRepairFaultyPag(boolean repairFaultyPag) {
- this.repairFaultyPag = repairFaultyPag;
+ public void setGuaranteePag(boolean guaranteePag) {
+ this.guaranteePag = guaranteePag;
}
/**
diff --git a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/Fci.java b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/Fci.java
index 08e84e80ec..57ce491c8f 100644
--- a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/Fci.java
+++ b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/Fci.java
@@ -125,9 +125,9 @@ public final class Fci implements IGraphSearch {
*/
private boolean doDiscriminatingPathColliderRule = true;
/**
- * Whether the PAG should be repaired.
+ * Whether the output should be guaranteed to be a PAG.
*/
- private boolean repairFaultyPag;
+ private boolean guaranteePag;
/**
* Whether the final orientation step should be left out.
*/
@@ -268,8 +268,8 @@ public Graph search() {
fciOrient.finalOrientation(graph);
}
- if (repairFaultyPag) {
- graph = GraphUtils.repairFaultyPag(graph, fciOrient, knowledge, unshieldedTriples, false, verbose);
+ if (guaranteePag) {
+ graph = GraphUtils.guaranteePag(graph, fciOrient, knowledge, unshieldedTriples, false, verbose);
}
long stop = MillisecondTimes.timeMillis();
@@ -421,12 +421,12 @@ public void setDoDiscriminatingPathColliderRule(boolean doDiscriminatingPathColl
}
/**
- * Sets whether the PAG should be repaired if faulty.
+ * Sets whether to guarantee the output is a PAG by repairing a faulty PAG.
*
- * @param repairFaultyPag True, if so.
+ * @param guaranteePag True, if so.
*/
- public void setRepairFaultyPag(boolean repairFaultyPag) {
- this.repairFaultyPag = repairFaultyPag;
+ public void setGuaranteePag(boolean guaranteePag) {
+ this.guaranteePag = guaranteePag;
}
/**
diff --git a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/FciMax.java b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/FciMax.java
index 1b06e50719..35380d755a 100644
--- a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/FciMax.java
+++ b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/FciMax.java
@@ -25,8 +25,8 @@
import edu.cmu.tetrad.graph.*;
import edu.cmu.tetrad.search.test.IndependenceResult;
import edu.cmu.tetrad.search.utils.FciOrient;
-import edu.cmu.tetrad.search.utils.R0R4StrategyTestBased;
import edu.cmu.tetrad.search.utils.PcCommon;
+import edu.cmu.tetrad.search.utils.R0R4StrategyTestBased;
import edu.cmu.tetrad.search.utils.SepsetMap;
import edu.cmu.tetrad.util.ChoiceGenerator;
import edu.cmu.tetrad.util.MillisecondTimes;
@@ -128,7 +128,7 @@ public final class FciMax implements IGraphSearch {
* Whether the final orientation step should be left out.
*/
private boolean ablationLeaveOutFinalOrientation = false;
- private boolean repairFaultyPag;
+ private boolean guaranteePag;
/**
* Constructor.
@@ -197,8 +197,8 @@ public Graph search() {
fciOrient.finalOrientation(graph);
}
- if (repairFaultyPag) {
- graph = GraphUtils.repairFaultyPag(graph, fciOrient, knowledge, unshieldedColldiders, false, verbose);
+ if (guaranteePag) {
+ graph = GraphUtils.guaranteePag(graph, fciOrient, knowledge, unshieldedColldiders, false, verbose);
}
long stop = MillisecondTimes.timeMillis();
@@ -344,7 +344,7 @@ public void setDoDiscriminatingPathTailRule(boolean doDiscriminatingPathTailRule
/**
* Adds colliders to the given graph.
*
- * @param graph The graph to which colliders should be added.
+ * @param graph The graph to which colliders should be added.
* @param unshieldedColliders
*/
private void addColliders(Graph graph, Set unshieldedColliders) {
@@ -497,8 +497,13 @@ public void setLeaveOutFinalOrientation(boolean ablationLeaveOutFinalOrientation
this.ablationLeaveOutFinalOrientation = ablationLeaveOutFinalOrientation;
}
- public void setRepairFaultyPag(boolean repairFaultyPag) {
- this.repairFaultyPag = repairFaultyPag;
+ /**
+ * Sets whether to guarantee a PAG.
+ *
+ * @param guaranteePag true to guarantee a PAG, false otherwise.
+ */
+ public void setGuaranteePag(boolean guaranteePag) {
+ this.guaranteePag = guaranteePag;
}
}
diff --git a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/GFci.java b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/GFci.java
index 2e1182f56b..92cf0d1eab 100644
--- a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/GFci.java
+++ b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/GFci.java
@@ -122,9 +122,9 @@ public final class GFci implements IGraphSearch {
*/
private boolean doDiscriminatingPathColliderRule = true;
/**
- * Whether to repair faulty PAGs.
+ * Whether to guarantee the output is a PAG by repairing a faulty PAG.
*/
- private boolean repairFaultyPag = false;
+ private boolean guaranteePag = false;
/**
* Whether to leave out the final orientation step in the ablation study.
*/
@@ -218,8 +218,8 @@ public Graph search() {
fciOrient.finalOrientation(graph);
}
- if (repairFaultyPag) {
- graph = GraphUtils.repairFaultyPag(graph, fciOrient, knowledge, unshieldedTriples, false, verbose);
+ if (guaranteePag) {
+ graph = GraphUtils.guaranteePag(graph, fciOrient, knowledge, unshieldedTriples, false, verbose);
}
return graph;
@@ -345,12 +345,12 @@ public void setNumThreads(int numThreads) {
/**
- * Sets the flag indicating whether to repair faulty PAG.
+ * Sets the flag indicating whether to guarantee the output is a legal PAG.
*
- * @param repairFaultyPag A boolean value indicating whether to repair faulty PAG.
+ * @param guaranteePag A boolean value indicating whether to guarantee the output is a legal PAG.
*/
- public void setRepairFaultyPag(boolean repairFaultyPag) {
- this.repairFaultyPag = repairFaultyPag;
+ public void setGuaranteePag(boolean guaranteePag) {
+ this.guaranteePag = guaranteePag;
}
/**
diff --git a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/GraspFci.java b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/GraspFci.java
index d3c502c71a..fa5ea04385 100644
--- a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/GraspFci.java
+++ b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/GraspFci.java
@@ -132,9 +132,9 @@ public final class GraspFci implements IGraphSearch {
*/
private boolean verbose = false;
/**
- * The flag for whether to repair a faulty PAG.
+ * The flag for whether to guarantee the output is a legal PAG.
*/
- private boolean repairFaultyPag = false;
+ private boolean guaranteePag = false;
/**
* Whether to leave out the final orientation step.
*/
@@ -227,8 +227,8 @@ public Graph search() {
fciOrient.finalOrientation(pag);
}
- if (repairFaultyPag) {
- pag = GraphUtils.repairFaultyPag(pag, fciOrient, knowledge, unshieldedTriples, false, verbose);
+ if (guaranteePag) {
+ pag = GraphUtils.guaranteePag(pag, fciOrient, knowledge, unshieldedTriples, false, verbose);
}
GraphUtils.replaceNodes(pag, this.independenceTest.getVariables());
@@ -378,12 +378,12 @@ public void setDepth(int depth) {
}
/**
- * Sets the flag for whether to repair a faulty PAG.
+ * Sets the flag for whether to guarantee the output is a legal PAG.
*
- * @param repairFaultyPag True, if so.
+ * @param guaranteePag True, if so.
*/
- public void setRepairFaultyPag(boolean repairFaultyPag) {
- this.repairFaultyPag = repairFaultyPag;
+ public void setGuaranteePag(boolean guaranteePag) {
+ this.guaranteePag = guaranteePag;
}
/**
diff --git a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/LvLite.java b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/LvLite.java
index c38d57f579..2cc8e67d6e 100644
--- a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/LvLite.java
+++ b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/LvLite.java
@@ -62,9 +62,9 @@ public final class LvLite implements IGraphSearch {
*/
private START_WITH startWith = START_WITH.BOSS;
/**
- * Flag indicating whether to repair a faulty PAG.
+ * Flag indicating the output should be guaranteed to be a PAG.
*/
- private boolean repairFaultyPag = false;
+ private boolean guaranteePag = false;
/**
* The number of starts for GRaSP.
*/
@@ -368,8 +368,8 @@ public Graph search() {
TetradLogger.getInstance().log("Finished implied orientation.");
}
- if (repairFaultyPag) {
- pag = GraphUtils.repairFaultyPag(pag, fciOrient, knowledge, unshieldedColliders, false, verbose);
+ if (guaranteePag) {
+ pag = GraphUtils.guaranteePag(pag, fciOrient, knowledge, unshieldedColliders, false, verbose);
}
if (verbose) {
@@ -461,12 +461,12 @@ public void setRecursionDepth(int recursionDepth) {
}
/**
- * Sets whether to repair a faulty PAG.
+ * Sets whether to guarantee a PAG output by repairing a faulty PAG.
*
- * @param repairFaultyPag true if a faulty PAGs should be repaired, false otherwise
+ * @param guaranteePag true if a faulty PAGs should be repaired, false otherwise
*/
- public void setRepairFaultyPag(boolean repairFaultyPag) {
- this.repairFaultyPag = repairFaultyPag;
+ public void setGuaranteePag(boolean guaranteePag) {
+ this.guaranteePag = guaranteePag;
}
/**
diff --git a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/SpFci.java b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/SpFci.java
index bb9250cabd..d145df542c 100644
--- a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/SpFci.java
+++ b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/SpFci.java
@@ -105,9 +105,9 @@ public final class SpFci implements IGraphSearch {
*/
private boolean verbose;
/**
- * True iff the search should repair a faulty PAG.
+ * True iff the search should guarantee a PAG output.
*/
- private boolean repairFaultyPag = false;
+ private boolean guaranteePag = false;
/**
* The method to use for finding sepsets, 1 = greedy, 2 = min-p., 3 = max-p, default min-p.
*/
@@ -182,8 +182,8 @@ public Graph search() {
GraphUtils.replaceNodes(graph, this.independenceTest.getVariables());
- if (repairFaultyPag) {
- graph = GraphUtils.repairFaultyPag(graph, fciOrient, knowledge, unshieldedTriples, false, verbose);
+ if (guaranteePag) {
+ graph = GraphUtils.guaranteePag(graph, fciOrient, knowledge, unshieldedTriples, false, verbose);
}
return graph;
@@ -308,12 +308,12 @@ public void setDepth(int depth) {
}
/**
- * Sets whether the search should repair a faulty PAG.
+ * Sets whether the search should guarantee the output is a legal PAG.
*
- * @param repairFaultyPag True, if so.
+ * @param guaranteePag True, if so.
*/
- public void setRepairFaultyPag(boolean repairFaultyPag) {
- this.repairFaultyPag = repairFaultyPag;
+ public void setGuaranteePag(boolean guaranteePag) {
+ this.guaranteePag = guaranteePag;
}
/**
diff --git a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/SvarFci.java b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/SvarFci.java
index cd9b6276b4..37544c66d0 100644
--- a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/SvarFci.java
+++ b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/SvarFci.java
@@ -96,7 +96,7 @@ public final class SvarFci implements IGraphSearch {
* Represents whether to resolve almost cyclic paths during the search.
*/
private boolean resolveAlmostCyclicPaths;
- private boolean repairFaultyPag;
+ private boolean guaranteePag;
/**
* Constructs a new FCI search for the given independence test and background knowledge.
@@ -212,8 +212,8 @@ public Graph search(IFas fas) {
fciOrient.ruleR0(this.graph, unshieldedTriples);
fciOrient.finalOrientation(this.graph);
- if (repairFaultyPag) {
- this.graph = GraphUtils.repairFaultyPag(this.graph, fciOrient, knowledge, unshieldedTriples, false, verbose);
+ if (guaranteePag) {
+ this.graph = GraphUtils.guaranteePag(this.graph, fciOrient, knowledge, unshieldedTriples, false, verbose);
}
if (resolveAlmostCyclicPaths) {
@@ -514,8 +514,15 @@ public void setResolveAlmostCyclicPaths(boolean resolveAlmostCyclicPaths) {
this.resolveAlmostCyclicPaths = resolveAlmostCyclicPaths;
}
- public void setRepairFaultyPag(boolean repairFaultyPag) {
- this.repairFaultyPag = repairFaultyPag;
+ /**
+ * Sets whether a guaranteed partial ancestral graph (PAG) should be built during the search. When set to true, the
+ * search algorithm will construct a PAG even if it cannot guarantee its correctness. When set to false, the search
+ * algorithm may return a PAG that is not fully connected or has other inconsistencies.
+ *
+ * @param guaranteePag true to guarantee the construction of a PAG, false otherwise
+ */
+ public void setGuaranteePag(boolean guaranteePag) {
+ this.guaranteePag = guaranteePag;
}
}
diff --git a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/utils/FciOrient.java b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/utils/FciOrient.java
index 23caaa5ba5..d826b4389a 100644
--- a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/utils/FciOrient.java
+++ b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/utils/FciOrient.java
@@ -246,7 +246,7 @@ public void setCompleteRuleSetUsed(boolean completeRuleSetUsed) {
* Orients unshielded colliders in the graph. (FCI Step C, Zhang's step F3, rule R0.)
*
* @param graph The graph to orient.
- * @param unshieldedTriples
+ * @param unshieldedTriples The set of unshielded triples oriented by R0. This set is updated with new triples.
*/
public void ruleR0(Graph graph, Set unshieldedTriples) {
graph.reorientAllWith(Endpoint.CIRCLE);
diff --git a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/utils/PcCommon.java b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/utils/PcCommon.java
index 5627660048..76232b6981 100644
--- a/tetrad-lib/src/main/java/edu/cmu/tetrad/search/utils/PcCommon.java
+++ b/tetrad-lib/src/main/java/edu/cmu/tetrad/search/utils/PcCommon.java
@@ -352,8 +352,14 @@ public Graph search(List nodes) {
this.graph = GraphUtils.replaceNodes(this.graph, nodes);
if (guaranteeCpdag) {
- GraphTransforms.dagFromCpdag(this.graph, true);
- graph = GraphTransforms.dagToCpdag(this.graph);
+ MeekRules meekRules = new MeekRules();
+ meekRules.setKnowledge(this.knowledge);
+ meekRules.setVerbose(verbose);
+ meekRules.setMeekPreventCycles(true);
+ meekRules.orientImplied(this.graph);
+
+// GraphTransforms.dagFromCpdag(this.graph, true);
+// graph = GraphTransforms.dagToCpdag(this.graph);
} else {
MeekRules meekRules = new MeekRules();
meekRules.setKnowledge(this.knowledge);
diff --git a/tetrad-lib/src/main/java/edu/cmu/tetrad/util/Params.java b/tetrad-lib/src/main/java/edu/cmu/tetrad/util/Params.java
index 9f26229f99..a9817c49a7 100644
--- a/tetrad-lib/src/main/java/edu/cmu/tetrad/util/Params.java
+++ b/tetrad-lib/src/main/java/edu/cmu/tetrad/util/Params.java
@@ -904,9 +904,9 @@ public final class Params {
*/
public static final String MAX_SCORE_DROP = "maxScoreDrop";
/**
- * Constant REPAIR_FAULTY_PAG="repairFaultyPag"
+ * Constant GUARANTEE_PAG="guaranteePag"
*/
- public static final String REPAIR_FAULTY_PAG = "repairFaultyPag";
+ public static final String GUARANTEE_PAG = "guaranteePag";
/**
* Constant REMOVE_ALMOST_CYCLES="removeAlmostCycles"
*/
diff --git a/tetrad-lib/src/main/resources/docs/manual/index.html b/tetrad-lib/src/main/resources/docs/manual/index.html
index 65f934f710..91afb22a02 100755
--- a/tetrad-lib/src/main/resources/docs/manual/index.html
+++ b/tetrad-lib/src/main/resources/docs/manual/index.html
@@ -3130,24 +3130,70 @@ Parameters
GRaSP.
+ The LV-Lite Algorithm
+
+ Description
+
+
+
LV-Lite starts with BOSS or GRaSP and get a valid order and a DAG/CPDAG. It sets the initial state of the
+ estimted PAG to this CPDAG and orients as o-o and then copy all of the unshielded colliders from the CPDAG
+ to the PAG. It then performs a testing modified from the step in GFCI that is more efficient. In GFCI, an
+ edge x *-* y is removed from the graph is there is a subset S of adj(x) \ {y} or adj(y) \ {x} such that x
+ _||_ y | S. For LV-Lite we instead search outward from x for a set S using a novel procedure that blocks all
+ existing paths in the estimated PAG either unconditionally or conditionally. Bounds may be placed on the
+ lengths of the blocked paths to consider and the depth (maximum |S|). We also allow bounds on the time
+ spent on any testing step. As edges are removed in this way, any additional colliders are oriented given
+ these sepsets S. We then run the final FCI orientation rules, where for the discriminating path rule we use
+ the same "out of x" sepset finding idea. We optionally allow the user to request that a legal PAG be
+ returned using a novel procedure; this guarantee has been extended to all latent variable algorithms in
+ Tetrad that return partial ancestral graphs (PAGs).
+
+
+
LV-Lite, along with BFCI, can produce highly accurate models in simulation. LV-Lite, in particular, is highly
+ scalable. A paper describing BFCI and LV-Lite in more detail is planned. We make both BFCI and LV-Lite
+ non-experimental for this version since requests have been made to use them.
+
+
+
Note: If one wants to analyze time series data using this algorithm, one may set the time lag parameter to a
+ value greater than 0, which will automatically apply the time lag transform. The same goes for any algorithm
+ that has this parameter available in the interface.
+
+
+
+ Input Assumptions
+
+ Same as for FCI.
+
+ Output Format
+
+ Same as for FCI.
+
+ Parameters
+
+ Uses all of the parameters of FCI (see Spirtes et al., 1993) and
+ GRaSP.
+
The BFCI Algorithm
Description
Uses BOSS in place of FGES for the initial step in the GFCI algorithm. This tends to produce a accurate PAG
- than GFCI
- as a result, for the latent variables case. This is a simple substitution; the reference for GFCI is
- here:
+ than GFCI as a result, for the latent variables case. This is a simple substitution; the reference for GFCI
+ is here:
J.M. Ogarrio and P. Spirtes and J. Ramsey, "A Hybrid Causal Search Algorithm for Latent Variable Models,"
- JMLR 2016.
- Here, BOSS has been substituted for FGES.
+ JMLR 2016. Here, BOSS has been substituted for FGES.
For BOSS only a score is needed, but there are steps in GFCI that require a test, so for this method, both a
- test and
- a score need to be given.
+ test and a score need to be given. The reference for BOSS is:
+
Andrews, B., Ramsey, J., Sanchez Romero, R., Camchong, J., & Kummerfeld, E. (2023). Fast scalable and
+ accurate discovery of dags using the best order score search and grow shrink trees. Advances in Neural
+ Information Processing Systems, 36, 63945-63956.
This class is configured to respect knowledge of forbidden and required edges, including knowledge of
- temporal
- tiers.
+ temporal tiers.
+
LV-Lite, along with BFCI, can produce highly accurate models in simulation. LV-Lite, in particular, is highly
+ scalable. A paper describing BFCI and LV-Lite in more detail is planned. We make both BFCI and LV-Lite
+ non-experimental for this version since requests have been made to use them.
+
Note: If one wants to analyze time series data using this algorithm,
one may set the time lag parameter to a value greater than 0, which
@@ -4748,7 +4794,7 @@
Zhang-Shen Bound Score
id="removeEffectNodes_long_desc">True if effect nodes should be removed from possible causes
Default Value: True
+ id="removeEffectNodes_default_value">true
Lower
Bound:
Upper Bound: coefLow
- Short Description:
- Yes if the output should guarantee a CPDAG
+ Guarantee that the output is a legal CPDAG
Long Description:
It is possible due to unfaithfulness for the Meek rules to output a
non-CPDAG; this parameter guarantees a CPDAG if set to 'Yes'.
Default Value: true
+ id="guaranteeCpdag_default_value">false
Lower Bound:
Upper Bound: ia
class="parameter_description_list">
Short Description:
- The method to use for finding sepsets, 1 = Greedy, 2 = Min-p, 3 = Max-p (default).
+ The method to use for finding sepsets, 1 = Greedy, 2 = Min-p, 3 = Max-p (default).
+
Long Description:
- The method to use for finding sepsets, 1 = Greedy, 2 = Min-p, 3 = Max-p (default).
+ The method to use for finding sepsets, 1 = Greedy, 2 = Min-p, 3 = Max-p (default).
+
Default Value: 3
Lower Bound: ia
repairFaultyPag
+ id="guaranteePag">guaranteePag
- Short Description:
- Yes if repairs should be made to a faulty PAG
+ id="guaranteePag_short_desc">
+ Guarantee that the output is a legal PAG
- Long Description:
+ id="guaranteePag_long_desc">
Repairs errors in PAGs due to almost cyclic paths or non-maximalities.
+ This comes with a certain risk; errors in PAGs indicate that the PAG
+ assumptions were not met; the user may wish to consider why before
+ selecting this option.
- Default Value: False
+ id="guaranteePag_default_value">false
Lower Bound:
+ id="guaranteePag_lower_bound">
Upper
Bound:
+ id="guaranteePag_upper_bound">
Value
Type: Boolean
+ id="guaranteePag_value_type">Boolean
ia
rebuilds the PAG.
Default Value: False
+ id="removeAlmostCycles_default_value">false
Lower Bound:
Upper
@@ -6702,7 +6753,7 @@ ia
If true, the final orientation step of the algorithm is not performed.
Default Value: False
+ id="ablationLeaveOutFinalOrientation_default_value">false
Lower Bound:
Upper
@@ -7788,7 +7839,7 @@ useBes
id="useBes_long_desc">This algorithm can use the backward equivalence search
from the GES algorithm as one of its steps.
Default Value: False
+ id="useBes_default_value">false
Lower Bound:
Upper Bound: unshieldedTriples = new HashSet<>();
+
FciOrient fciOrientation = new FciOrient(R0R4StrategyTestBased.defaultConfiguration(graph, knowledge));
fciOrientation.orient(_graph, unshieldedTriples);
diff --git a/tetrad-lib/src/test/java/edu/cmu/tetrad/test/TestPc.java b/tetrad-lib/src/test/java/edu/cmu/tetrad/test/TestPc.java
index 9ceb1eef02..5ca1916f9a 100644
--- a/tetrad-lib/src/test/java/edu/cmu/tetrad/test/TestPc.java
+++ b/tetrad-lib/src/test/java/edu/cmu/tetrad/test/TestPc.java
@@ -127,9 +127,9 @@ public void testCites() {
"\n" +
"Graph Edges:\n" +
"1. ABILITY --> CITES\n" +
- "2. ABILITY --- GPQ\n" +
- "3. ABILITY --- PREPROD\n" +
- "4. GPQ --- QFJ\n" +
+ "2. ABILITY --> GPQ\n" +
+ "3. ABILITY --> PREPROD\n" +
+ "4. GPQ --> QFJ\n" +
"5. PREPROD --> CITES\n" +
"6. PUBS --> CITES\n" +
"7. QFJ --> CITES\n" +