Skip to content

Commit e7d1b9c

Browse files
Merge pull request #259 from marvin-hansen/main
feat: Implement Unified Reasoning Engine for Deterministic, Probabilistic, and Contextual Causality
2 parents b17364d + 09f6f6a commit e7d1b9c

File tree

349 files changed

+4494
-3595
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

349 files changed

+4494
-3595
lines changed

deep_causality/benches/benchmarks/bench_collection.rs

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
*/
55

66
use criterion::{Criterion, criterion_group};
7-
8-
use deep_causality::traits::causable::CausableReasoning;
7+
use deep_causality::*;
98

109
use crate::benchmarks::utils_collection;
1110

@@ -14,23 +13,31 @@ use crate::benchmarks::utils_collection;
1413
// Large = 10_000
1514

1615
fn small_causality_collection_benchmark(criterion: &mut Criterion) {
17-
let (coll, data) = utils_collection::get_small_collection_and_data();
18-
criterion.bench_function("small_causality_collection", |bencher| {
19-
bencher.iter(|| coll.reason_all_causes(&data).unwrap())
16+
// The `_data` is no longer needed as we pass a single evidence object.
17+
let (coll, _data) = utils_collection::get_small_collection_and_data();
18+
// All propagation methods now take a single `&Evidence`.
19+
let evidence = Evidence::Numerical(0.99);
20+
21+
criterion.bench_function("small_causality_collection_propagation", |bencher| {
22+
bencher.iter(|| coll.evaluate_deterministic_propagation(&evidence).unwrap())
2023
});
2124
}
2225

2326
fn medium_causality_collection_benchmark(criterion: &mut Criterion) {
24-
let (coll, data) = utils_collection::get_medium_collection_and_data();
25-
criterion.bench_function("medium_causality_collection", |bencher| {
26-
bencher.iter(|| coll.reason_all_causes(&data).unwrap())
27+
let (coll, _data) = utils_collection::get_medium_collection_and_data();
28+
let evidence = Evidence::Numerical(0.99);
29+
30+
criterion.bench_function("medium_causality_collection_propagation", |bencher| {
31+
bencher.iter(|| coll.evaluate_deterministic_propagation(&evidence).unwrap())
2732
});
2833
}
2934

3035
fn large_causality_collection_benchmark(criterion: &mut Criterion) {
31-
let (coll, data) = utils_collection::get_large_collection_and_data();
32-
criterion.bench_function("large_causality_collection", |bencher| {
33-
bencher.iter(|| coll.reason_all_causes(&data).unwrap())
36+
let (coll, _data) = utils_collection::get_large_collection_and_data();
37+
let evidence = Evidence::Numerical(0.99);
38+
39+
criterion.bench_function("large_causality_collection_propagation", |bencher| {
40+
bencher.iter(|| coll.evaluate_deterministic_propagation(&evidence).unwrap())
3441
});
3542
}
3643

deep_causality/benches/benchmarks/bench_graph.rs

Lines changed: 55 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -5,111 +5,103 @@
55

66
use criterion::{Criterion, criterion_group};
77

8-
use deep_causality::prelude::*;
8+
use deep_causality::*;
99

1010
use crate::benchmarks::utils_linear_graph;
1111

1212
fn small_linear_graph_benchmark(criterion: &mut Criterion) {
13-
let (g, data) = utils_linear_graph::get_small_linear_graph_and_data();
14-
15-
criterion.bench_function("small_linear_graph_reason_all_causes", |bencher| {
16-
bencher.iter(|| g.reason_all_causes(&data, None).unwrap())
17-
});
18-
19-
let index = data.len() / 2;
20-
21-
criterion.bench_function("small_linear_graph_reason_subgraph_from_cause", |bencher| {
22-
bencher.iter(|| g.reason_subgraph_from_cause(index, &data, None).unwrap())
23-
});
24-
25-
let x = data.len() / 2;
26-
let start_index = x;
27-
let stop_index = data.len() - 1;
13+
let (g, _data) = utils_linear_graph::get_small_linear_graph_and_data();
14+
let evidence = Evidence::Numerical(0.99);
15+
let root_index = g.get_root_index().unwrap();
2816

2917
criterion.bench_function(
30-
"small_linear_graph_reason_shortest_path_between_causes",
18+
"small_linear_graph_evaluate_subgraph_from_root",
3119
|bencher| {
3220
bencher.iter(|| {
33-
g.reason_shortest_path_between_causes(start_index, stop_index, &data, None)
21+
g.evaluate_subgraph_from_cause(root_index, &evidence)
3422
.unwrap()
3523
})
3624
},
3725
);
3826

39-
let obs = 0.99;
27+
let start_index = g.number_nodes() / 2;
28+
let stop_index = g.number_nodes() - 1;
4029

41-
criterion.bench_function("small_linear_graph_reason_single_cause", |bencher| {
42-
bencher.iter(|| g.reason_single_cause(index, &[obs]).unwrap())
30+
criterion.bench_function("small_linear_graph_evaluate_shortest_path", |bencher| {
31+
bencher.iter(|| {
32+
g.evaluate_shortest_path_between_causes(start_index, stop_index, &evidence)
33+
.unwrap()
34+
})
4335
});
44-
}
4536

46-
fn medium_linear_graph_benchmark(criterion: &mut Criterion) {
47-
let (g, data) = utils_linear_graph::get_medium_linear_graph_and_data();
48-
49-
criterion.bench_function("medium_linear_graph_reason_all_causes", |bencher| {
50-
bencher.iter(|| g.reason_all_causes(&data, None).unwrap())
37+
let single_cause_index = g.number_nodes() / 2;
38+
let cause_to_eval = g.get_causaloid(single_cause_index).unwrap();
39+
criterion.bench_function("small_linear_graph_evaluate_single_cause", |bencher| {
40+
bencher.iter(|| cause_to_eval.evaluate(&evidence).unwrap())
5141
});
42+
}
5243

53-
let index = data.len() / 2;
54-
55-
criterion.bench_function(
56-
"medium_linear_graph_reason_subgraph_from_cause",
57-
|bencher| bencher.iter(|| g.reason_subgraph_from_cause(index, &data, None).unwrap()),
58-
);
59-
60-
let x = data.len() / 2;
61-
let start_index = x;
62-
let stop_index = data.len() - 1;
44+
fn medium_linear_graph_benchmark(criterion: &mut Criterion) {
45+
let (g, _data) = utils_linear_graph::get_medium_linear_graph_and_data();
46+
let evidence = Evidence::Numerical(0.99);
47+
let root_index = g.get_root_index().unwrap();
6348

6449
criterion.bench_function(
65-
"medium_linear_graph_reason_shortest_path_between_causes",
50+
"medium_linear_graph_evaluate_subgraph_from_root",
6651
|bencher| {
6752
bencher.iter(|| {
68-
g.reason_shortest_path_between_causes(start_index, stop_index, &data, None)
53+
g.evaluate_subgraph_from_cause(root_index, &evidence)
6954
.unwrap()
7055
})
7156
},
7257
);
7358

74-
let obs = 0.99;
59+
let start_index = g.number_nodes() / 2;
60+
let stop_index = g.number_nodes() - 1;
7561

76-
criterion.bench_function(
77-
"medium_linear_graph_linear_graph_reason_single_cause",
78-
|bencher| bencher.iter(|| g.reason_single_cause(index, &[obs]).unwrap()),
79-
);
80-
}
81-
82-
fn large_linear_graph_benchmark(criterion: &mut Criterion) {
83-
let (g, data) = utils_linear_graph::get_large_linear_graph_and_data();
84-
85-
criterion.bench_function("large_linear_graph_reason_all_causes", |bencher| {
86-
bencher.iter(|| g.reason_all_causes(&data, None).unwrap())
62+
criterion.bench_function("medium_linear_graph_evaluate_shortest_path", |bencher| {
63+
bencher.iter(|| {
64+
g.evaluate_shortest_path_between_causes(start_index, stop_index, &evidence)
65+
.unwrap()
66+
})
8767
});
8868

89-
let index = data.len() / 2;
90-
91-
criterion.bench_function("large_linear_graph_reason_subgraph_from_cause", |bencher| {
92-
bencher.iter(|| g.reason_subgraph_from_cause(index, &data, None).unwrap())
69+
let single_cause_index = g.number_nodes() / 2;
70+
let cause_to_eval = g.get_causaloid(single_cause_index).unwrap();
71+
criterion.bench_function("medium_linear_graph_evaluate_single_cause", |bencher| {
72+
bencher.iter(|| cause_to_eval.evaluate(&evidence).unwrap())
9373
});
74+
}
9475

95-
let x = data.len() / 2;
96-
let start_index = x;
97-
let stop_index = data.len() - 1;
76+
fn large_linear_graph_benchmark(criterion: &mut Criterion) {
77+
let (g, _data) = utils_linear_graph::get_large_linear_graph_and_data();
78+
let evidence = Evidence::Numerical(0.99);
79+
let root_index = g.get_root_index().unwrap();
9880

9981
criterion.bench_function(
100-
"large_linear_graph_reason_shortest_path_between_causes",
82+
"large_linear_graph_evaluate_subgraph_from_root",
10183
|bencher| {
10284
bencher.iter(|| {
103-
g.reason_shortest_path_between_causes(start_index, stop_index, &data, None)
85+
g.evaluate_subgraph_from_cause(root_index, &evidence)
10486
.unwrap()
10587
})
10688
},
10789
);
10890

109-
let obs = 0.99;
91+
let start_index = g.number_nodes() / 2;
92+
let stop_index = g.number_nodes() - 1;
93+
94+
criterion.bench_function("large_linear_graph_evaluate_shortest_path", |bencher| {
95+
bencher.iter(|| {
96+
g.evaluate_shortest_path_between_causes(start_index, stop_index, &evidence)
97+
.unwrap()
98+
})
99+
});
110100

111-
criterion.bench_function("large_reason_single_cause", |bencher| {
112-
bencher.iter(|| g.reason_single_cause(index, &[obs]).unwrap())
101+
let single_cause_index = g.number_nodes() / 2;
102+
let cause_to_eval = g.get_causaloid(single_cause_index).unwrap();
103+
criterion.bench_function("large_linear_graph_evaluate_single_cause", |bencher| {
104+
bencher.iter(|| cause_to_eval.evaluate(&evidence).unwrap())
113105
});
114106
}
115107

deep_causality/benches/benchmarks/bench_map.rs

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
use criterion::{Criterion, criterion_group};
77

8-
use deep_causality::traits::causable::CausableReasoning;
8+
use deep_causality::{Causable, Evidence};
99

1010
use crate::benchmarks::utils_map;
1111

@@ -15,22 +15,41 @@ use crate::benchmarks::utils_map;
1515

1616
fn small_causality_map_benchmark(criterion: &mut Criterion) {
1717
let (map, data) = utils_map::get_small_map_and_data();
18-
criterion.bench_function("small_causality_map", |bencher| {
19-
bencher.iter(|| map.reason_all_causes(&data).unwrap())
18+
criterion.bench_function("small_causality_map_independent_eval", |bencher| {
19+
bencher.iter(|| {
20+
// Iterate over the map and evaluate each causaloid with its specific data.
21+
for (key, cause) in &map {
22+
let value = data.get(key).expect("Data missing for key");
23+
let evidence = Evidence::Numerical(*value);
24+
cause.evaluate(&evidence).unwrap();
25+
}
26+
})
2027
});
2128
}
2229

2330
fn medium_causality_map_benchmark(criterion: &mut Criterion) {
2431
let (map, data) = utils_map::get_medium_map_and_data();
25-
criterion.bench_function("medium_causality_map", |bencher| {
26-
bencher.iter(|| map.reason_all_causes(&data).unwrap())
32+
criterion.bench_function("medium_causality_map_independent_eval", |bencher| {
33+
bencher.iter(|| {
34+
for (key, cause) in &map {
35+
let value = data.get(key).expect("Data missing for key");
36+
let evidence = Evidence::Numerical(*value);
37+
cause.evaluate(&evidence).unwrap();
38+
}
39+
})
2740
});
2841
}
2942

3043
fn large_causality_map_benchmark(criterion: &mut Criterion) {
3144
let (map, data) = utils_map::get_large_map_and_data();
32-
criterion.bench_function("large_causality_map", |bencher| {
33-
bencher.iter(|| map.reason_all_causes(&data).unwrap())
45+
criterion.bench_function("large_causality_map_independent_eval", |bencher| {
46+
bencher.iter(|| {
47+
for (key, cause) in &map {
48+
let value = data.get(key).expect("Data missing for key");
49+
let evidence = Evidence::Numerical(*value);
50+
cause.evaluate(&evidence).unwrap();
51+
}
52+
})
3453
});
3554
}
3655

deep_causality/benches/benchmarks/bench_multi_cause_graph.rs

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,41 +5,49 @@
55

66
use criterion::{Criterion, criterion_group};
77

8-
use deep_causality::prelude::*;
8+
use deep_causality::*;
99

1010
use crate::benchmarks::utils_linear_graph;
1111

1212
fn small_multi_layer_graph_benchmark(criterion: &mut Criterion) {
13-
let (g, data) = utils_linear_graph::get_small_multi_cause_graph_and_data();
14-
15-
criterion.bench_function("small_multi_layer_graph_reason_all_causes", |bencher| {
16-
bencher.iter(|| g.reason_all_causes(&data, None).unwrap())
13+
// The data array is no longer used; we use a single Evidence object.
14+
let (g, _data) = utils_linear_graph::get_small_multi_cause_graph_and_data();
15+
let evidence = Evidence::Numerical(0.99);
16+
17+
let root_index = g.get_root_index().expect("Graph has no root");
18+
criterion.bench_function("small_multi_layer_graph_evaluate_from_root", |bencher| {
19+
bencher.iter(|| {
20+
g.evaluate_subgraph_from_cause(root_index, &evidence)
21+
.unwrap()
22+
})
1723
});
1824

19-
let index = data.len() / 2;
20-
25+
// Start the subgraph evaluation from a non-root node.
26+
let index = 1;
2127
criterion.bench_function(
22-
"small_multi_layer_graph_reason_subgraph_from_cause",
23-
|bencher| bencher.iter(|| g.reason_subgraph_from_cause(index, &data, None).unwrap()),
28+
"small_multi_layer_graph_evaluate_subgraph_from_cause",
29+
|bencher| bencher.iter(|| g.evaluate_subgraph_from_cause(index, &evidence).unwrap()),
2430
);
2531

26-
let start_index = 0;
27-
let stop_index = 1;
28-
32+
let start_index = 1;
33+
let stop_index = 3;
2934
criterion.bench_function(
30-
"small_multi_layer_graph_reason_shortest_path_between_causes",
35+
"small_multi_layer_graph_evaluate_shortest_path",
3136
|bencher| {
3237
bencher.iter(|| {
33-
g.reason_shortest_path_between_causes(start_index, stop_index, &data, None)
38+
g.evaluate_shortest_path_between_causes(start_index, stop_index, &evidence)
3439
.unwrap()
3540
})
3641
},
3742
);
3843

39-
let obs = 0.99;
40-
41-
criterion.bench_function("small_multi_layer_graph_reason_single_cause", |bencher| {
42-
bencher.iter(|| g.reason_single_cause(index, &[obs]).unwrap())
44+
// To benchmark a single cause, we get it from the graph and call evaluate() directly.
45+
let single_cause_index = 2;
46+
let cause_to_eval = g
47+
.get_causaloid(single_cause_index)
48+
.expect("Causaloid not found");
49+
criterion.bench_function("small_multi_layer_graph_evaluate_single_cause", |bencher| {
50+
bencher.iter(|| cause_to_eval.evaluate(&evidence).unwrap())
4351
});
4452
}
4553

deep_causality/benches/benchmarks/utils_collection.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,29 @@
33
* Copyright (c) "2025" . The DeepCausality Authors and Contributors. All Rights Reserved.
44
*/
55

6-
use deep_causality::prelude::BaseCausaloidVec;
6+
use deep_causality::BaseCausaloidVec;
77

88
use crate::benchmarks::utils_shared;
99

1010
const SMALL: usize = 10;
1111
const MEDIUM: usize = 1_000;
1212
const LARGE: usize = 10_000;
1313

14-
pub fn get_small_collection_and_data() -> (BaseCausaloidVec, [f64; SMALL + 1]) {
15-
// Builds a linear graph: root -> a -> b -> c
14+
pub fn get_small_collection_and_data() -> (BaseCausaloidVec, [f64; SMALL]) {
1615
(
1716
build_causaloid_collection(SMALL),
1817
utils_shared::generate_sample_data(),
1918
)
2019
}
2120

22-
pub fn get_medium_collection_and_data() -> (BaseCausaloidVec, [f64; MEDIUM + 1]) {
23-
// Builds a linear graph: root -> a -> b -> c
21+
pub fn get_medium_collection_and_data() -> (BaseCausaloidVec, [f64; MEDIUM]) {
2422
(
2523
build_causaloid_collection(MEDIUM),
2624
utils_shared::generate_sample_data(),
2725
)
2826
}
2927

30-
pub fn get_large_collection_and_data() -> (BaseCausaloidVec, [f64; LARGE + 1]) {
31-
// Builds a linear graph: root -> a -> b -> c
28+
pub fn get_large_collection_and_data() -> (BaseCausaloidVec, [f64; LARGE]) {
3229
(
3330
build_causaloid_collection(LARGE),
3431
utils_shared::generate_sample_data(),

0 commit comments

Comments
 (0)