Changes for Version 7.6.6
Main changes.
- Made some corrections to implementing the final FCI orientation rules in response to a review from Peter Spirtes.
- Updated the discriminating path rule to make it more efficient.
- Refactored FciOrient to always use the discriminating path rule.
- Reimplemented R8, R9, R10 in final FCI orientation rules for efficiency.
- Revised the AD Tree class implementation and incorporated it into the Chi-Square and G-Square discrete independence tests as an alternative to sample counting.
- Revised DiscreteBicScore to ignore unattested categories for variables.
- Removed several "experimental" designations for algorithms.
- Added an implementation of CellTable using AD Trees for space-savings and switched discrete ChiSquare to use it.
- Improved AdTree for efficiency and clarity.
- Improved MvpBicScore.
- Added InterruptedException to MarkovCheck and handling for it in several classes.
- Added an IDA editor to calculate IDA and IDA-like average distances of parameter values from true values.
- Added CpdagParentDistancesFromTrue class.
- I added a column to the bootstrap table to show edge properties.
- Refacted all sepset finding methods into a new class, SepsetFinder, and added several new new methods.
- Improved logging consistency across LV algorithms.
- Improved LvLite.
- Added "recursive msep" and "noncolliders only" options to MarkovCheckEditor.
- Added selection bias option to nodes in the graph editor.
- Adjusted DagToPag to account correctly for selection bias.
- Added method to produce data with selection nodes conditioned to > 0 as a new DataBox item.
- Refactored logic to find unshielded colliders and to R4 discriminating path orientations into a separate interface.
- Implemented the R0R0 methods for both test-based and DagToPag contexts.
- Added logic in R4 to handle the case of multiple discriminating paths between two nodes for the test-based implementation (using the msep path blocking method).
- Removed independence test caching for the IndTestFisherZ class, which was causing errors in places.
- Added nodewise Markov check methods.
- Did several optimizations for PAG-related functions to improve speed of interface, aiming at PAGs with 100 nodes plus 10 latent common causes, with an average degree of 10.
- Cached some types of paths in the graph class.
- Replaced some depth-first methods with breadth-first equivalents.
- For looking for latent common causes, limited length of treks (correctly) to 3.
- Introduced the PagCache class to store calculated PAGs for DAGs and DAGs for their calculated PAGs, for speed of lookup, so DagToPag only needs to be called once per DAG and that statistics that require a DAG can get one.
- Added missing Javadocs and corrected some errors.
- Made repairs to testwise deletion and optimized it.
- For the Markov check, made the ordered local Markov the default.
- Added Polynomial Basis BIC Score (PC-BIC). This adds columns for a truncated polynomial basis (x, x^2,...,x^p) to the data and adjusts the Degenerate Gaussian BIC Score (DB-BIC) to treat these per variable as an ensemble. Discrete variables are handled as in DG, so this will work for mixed data.
- Simplified, updated, and tuned the Conditional Correlation Test for general additive models.
- Added (experimental) BasisFunctionBicScore, allowing score-based algorithms to handle nonlinear models.
- Optimized KCI using the EMJL matrix library.
- Added graph saving menu items to the Search box (user request).
- Adjusted the Markov Checker interface for KCI so that new samples aren't calculated until clicking the Sample button.
- A checkbox was added in the Markov Checker interface so the user can request that the dependent distribution be calculated.
- To accommodate KCI and large searches, threading in the FAS algorithm (used by PC and FCI) was adjusted to allow the algorithm to stop properly with an interrupt signal.
Selected Minutiae.
- Made table counting classes for the chi-square and g-square tests immutable to be safe in multi-threaded environments in response to a worry discovered when moving to JDK 21.1.
- The block real matrix was replaced with MatrixUtils where used.
- Corrected pseudoinverse calculation.
- Improved fast adjacency search.
- Improved KCI implementation. (Still needs work.)
- Removed the Meek verbose flag where used.
- In MultiDimensionalIntTable and CellTable, Longs with Integers to save space.
- Added "no rows" check to ChiSquareTable for efficiency.
- Improved MnlrLilklihood and MvpLikelihood.
- In AdTree, the Subdivision class was refactored to use the Java record.
- Added validation checks to AdTree.
- Bootstrap row sampling was added to MarkovCheck and AdTree.
- Handled empty total effects in various methods.
- Corrected some edge marking logic in AbstractWorkbench.
- Refactored compareTo() method in IndependenceFact for efficiency.
- Added menu items to the Search box to save graphs in various formats.