| Crates.io | deep_causality_discovery |
| lib.rs | deep_causality_discovery |
| version | 0.3.4 |
| created_at | 2025-09-23 07:57:39.21791+00 |
| updated_at | 2026-01-22 07:37:28.430879+00 |
| description | Causality discovery DSL for the DeepCausality project. |
| homepage | https://deepcausality.com/ |
| repository | https://github.com/deepcausality/deep_causality.rs |
| max_upload_size | |
| id | 1851125 |
| size | 204,939 |
deep_causality_discovery is a Rust crate that provides a Causal Discovery Language (CDL) for the DeepCausality
project. It offers a powerful, modular, and type-safe pipeline to move from raw observational data to actionable causal
insights. By abstracting complex statistical and algorithmic steps, it enables users to define and execute causal
discovery workflows with ease, ultimately informing the construction of causal models.
The core of the CDL is a builder pattern that uses Rust's typestate pattern. This means the pipeline's state is encoded in the type system, which guarantees at compile-time that the steps are executed in a valid sequence.
The workflow consists of the following sequential stages:
CdlConfig):CDL<NoData>):load_data):clean_data, Optional):OptionNoneDataCleaner (converts NaN to None).feature_select):causal_discovery):analyze):finalize):print_results):print_results() method is called on the final CdlEffect to display
errors, warnings, or the successful analysis to the console.Add deep_causality_discovery to your Cargo.toml file:
cargo add deep_causality_discovery
Here's a basic example demonstrating how to use the CDL pipeline to discover causal relationships from a CSV file:
use deep_causality_discovery::*;
use std::{fs::File, io::Write};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 1. Prepare test data
let csv_data = "s1,s2,s3,target\n1.0,2.0,3.0,1.5\n2.0,4.1,6.0,3.6\n3.0,6.2,9.0,5.4\n4.0,8.1,12.0,7.6";
let file_path = "./test_data.csv";
let mut file = File::create(file_path)?;
file.write_all(csv_data.as_bytes())?;
let target_index = 3;
// 2. Run the CDL pipeline (Monadic Flow)
let result_effect = CdlBuilder::build()
// Load Data (implicitly creates Config)
.bind(|cdl| cdl.load_data(file_path, target_index, vec![]))
// Explicitly Clean Data (Optional but recommended)
.bind(|cdl| cdl.clean_data(OptionNoneDataCleaner))
// Feature Selection
.bind(|cdl| {
cdl.feature_select(|tensor| {
mrmr_features_selector(tensor, 3, target_index)
})
})
// Causal Discovery
.bind(|cdl| {
cdl.causal_discovery(|tensor| {
surd_states_cdl(tensor, MaxOrder::Max).map_err(Into::into)
})
})
// Analyze & Finalize
.bind(|cdl| cdl.analyze())
.bind(|cdl| cdl.finalize());
// 3. Output results
result_effect.print_results();
// 4. Cleanup
std::fs::remove_file(file_path)?;
Ok(())
}
The crate employs a comprehensive error handling strategy, defining specific error types for each stage of the CDL
pipeline (e.g., DataError, FeatureSelectError, CausalDiscoveryError). This allows for precise identification and
handling of issues, ensuring robust and reliable causal discovery workflows.
The deep_causality_discovery crate acts as a crucial bridge, transforming observational data into the foundational
elements for building executable causal models with the DeepCausality library. The insights gained from the SURD-states
algorithm directly inform the design of your CausaloidGraph and the internal logic of individual Causaloids:
CausaloidGraph: Strong unique influences suggest direct causal links (
Causaloid(Source) -> Causaloid(Target)). Significant synergistic influences indicate that multiple sources are
jointly required to cause an effect, guiding the creation of many-to-one connections.Causaloid Logic: State-dependent maps from the SURD analysis provide precise conditional logic for a
Causaloid's causal_fn, allowing you to programmatically capture how causal influences vary with system states.AggregateLogic within CausaloidCollections. For instance, strong synergy might map to
AggregateLogic::All (conjunction), while unique or redundant influences could suggest AggregateLogic::Any (
disjunction).Contributions are welcomed especially related to documentation, example code, and fixes. If unsure where to start, just open an issue and ask.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in deep_causality by you, shall be licensed under the MIT licence, without any additional terms or conditions.
This project is licensed under the MIT license.
For details about security, please read the security policy.