Skip to content

Commit abea5c3

Browse files
Merge pull request #276 from marvin-hansen/main
feat(deep_causality): Unified Evidence and PropagatingEffect into a single type.
2 parents 7e5dad7 + a569017 commit abea5c3

Some content is hidden

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

55 files changed

+914
-757
lines changed

Cargo.lock

Lines changed: 6 additions & 48 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

MODULE.bazel

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module(name = "deep_causality")
77
bazel_dep(name = "aspect_bazel_lib", version = "2.16.0")
88
bazel_dep(name = "bazel_skylib", version = "1.7.1")
99
bazel_dep(name = "platforms", version = "0.0.11")
10-
bazel_dep(name = "rules_rust", version = "0.62.0")
10+
bazel_dep(name = "rules_rust", version = "0.63.0")
1111

1212
###############################################################################
1313
# Rust toolchain

deep_causality/benches/benchmarks/bench_collection.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ fn small_causality_collection_benchmark(criterion: &mut Criterion) {
1616
// The `_data` is no longer needed as we pass a single evidence object.
1717
let (coll, _data) = utils_collection::get_small_collection_and_data();
1818
// All propagation methods now take a single `&Evidence`.
19-
let evidence = Evidence::Numerical(0.99);
19+
let evidence = PropagatingEffect::Numerical(0.99);
2020

2121
criterion.bench_function("small_causality_collection_propagation", |bencher| {
2222
bencher.iter(|| coll.evaluate_deterministic_propagation(&evidence).unwrap())
@@ -25,7 +25,7 @@ fn small_causality_collection_benchmark(criterion: &mut Criterion) {
2525

2626
fn medium_causality_collection_benchmark(criterion: &mut Criterion) {
2727
let (coll, _data) = utils_collection::get_medium_collection_and_data();
28-
let evidence = Evidence::Numerical(0.99);
28+
let evidence = PropagatingEffect::Numerical(0.99);
2929

3030
criterion.bench_function("medium_causality_collection_propagation", |bencher| {
3131
bencher.iter(|| coll.evaluate_deterministic_propagation(&evidence).unwrap())
@@ -34,7 +34,7 @@ fn medium_causality_collection_benchmark(criterion: &mut Criterion) {
3434

3535
fn large_causality_collection_benchmark(criterion: &mut Criterion) {
3636
let (coll, _data) = utils_collection::get_large_collection_and_data();
37-
let evidence = Evidence::Numerical(0.99);
37+
let evidence = PropagatingEffect::Numerical(0.99);
3838

3939
criterion.bench_function("large_causality_collection_propagation", |bencher| {
4040
bencher.iter(|| coll.evaluate_deterministic_propagation(&evidence).unwrap())

deep_causality/benches/benchmarks/bench_graph.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const LARGE: usize = 10_000;
1515

1616
fn small_linear_graph_benchmark(criterion: &mut Criterion) {
1717
let g = utils_linear_graph::build_linear_graph(SMALL);
18-
let evidence = Evidence::Numerical(0.99);
18+
let evidence = PropagatingEffect::Numerical(0.99);
1919
let root_index = g.get_root_index().unwrap();
2020

2121
criterion.bench_function(
@@ -52,7 +52,7 @@ fn small_linear_graph_benchmark(criterion: &mut Criterion) {
5252

5353
fn medium_linear_graph_benchmark(criterion: &mut Criterion) {
5454
let g = utils_linear_graph::build_linear_graph(MEDIUM);
55-
let evidence = Evidence::Numerical(0.99);
55+
let evidence = PropagatingEffect::Numerical(0.99);
5656
let root_index = g.get_root_index().unwrap();
5757

5858
criterion.bench_function(
@@ -89,7 +89,7 @@ fn medium_linear_graph_benchmark(criterion: &mut Criterion) {
8989

9090
fn large_linear_graph_benchmark(criterion: &mut Criterion) {
9191
let g = utils_linear_graph::build_linear_graph(LARGE);
92-
let evidence = Evidence::Numerical(0.99);
92+
let evidence = PropagatingEffect::Numerical(0.99);
9393
let root_index = g.get_root_index().unwrap();
9494

9595
criterion.bench_function(

deep_causality/benches/benchmarks/bench_map.rs

Lines changed: 4 additions & 4 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::{Causable, Evidence};
8+
use deep_causality::{Causable, PropagatingEffect};
99

1010
use crate::benchmarks::utils_map;
1111

@@ -20,7 +20,7 @@ fn small_causality_map_benchmark(criterion: &mut Criterion) {
2020
// Iterate over the map and evaluate each causaloid with its specific data.
2121
for (key, cause) in &map {
2222
let value = data.get(key).expect("Data missing for key");
23-
let evidence = Evidence::Numerical(*value);
23+
let evidence = PropagatingEffect::Numerical(*value);
2424
cause.evaluate(&evidence).unwrap();
2525
}
2626
})
@@ -33,7 +33,7 @@ fn medium_causality_map_benchmark(criterion: &mut Criterion) {
3333
bencher.iter(|| {
3434
for (key, cause) in &map {
3535
let value = data.get(key).expect("Data missing for key");
36-
let evidence = Evidence::Numerical(*value);
36+
let evidence = PropagatingEffect::Numerical(*value);
3737
cause.evaluate(&evidence).unwrap();
3838
}
3939
})
@@ -46,7 +46,7 @@ fn large_causality_map_benchmark(criterion: &mut Criterion) {
4646
bencher.iter(|| {
4747
for (key, cause) in &map {
4848
let value = data.get(key).expect("Data missing for key");
49-
let evidence = Evidence::Numerical(*value);
49+
let evidence = PropagatingEffect::Numerical(*value);
5050
cause.evaluate(&evidence).unwrap();
5151
}
5252
})

deep_causality/benches/benchmarks/bench_multi_cause_graph.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::benchmarks::utils_linear_graph;
1212
fn small_multi_layer_graph_benchmark(criterion: &mut Criterion) {
1313
// The data array is no longer used; we use a single Evidence object.
1414
let (g, _data) = utils_linear_graph::get_small_multi_cause_graph_and_data();
15-
let evidence = Evidence::Numerical(0.99);
15+
let evidence = PropagatingEffect::Numerical(0.99);
1616

1717
let root_index = g.get_root_index().expect("Graph has no root");
1818
criterion.bench_function("small_multi_layer_graph_evaluate_from_root", |bencher| {

deep_causality/benches/benchmarks/utils_shared.rs

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

66
use deep_causality::errors::CausalityError;
77
use deep_causality::{
8-
BaseCausaloid, Causaloid, Evidence, IdentificationValue, NumericalValue, PropagatingEffect,
8+
BaseCausaloid, Causaloid, IdentificationValue, NumericalValue, PropagatingEffect,
99
};
1010

1111
pub fn get_test_causaloid() -> BaseCausaloid {
1212
let id: IdentificationValue = 1;
1313
let description = "tests whether data exceeds threshold of 0.55";
1414

15-
fn causal_fn(evidence: &Evidence) -> Result<PropagatingEffect, CausalityError> {
15+
fn causal_fn(evidence: &PropagatingEffect) -> Result<PropagatingEffect, CausalityError> {
1616
let obs = match evidence {
17-
Evidence::Numerical(val) => *val,
17+
PropagatingEffect::Numerical(val) => *val,
1818
_ => return Err(CausalityError("Expected Numerical evidence.".into())),
1919
};
2020

deep_causality/src/lib.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,6 @@ pub use crate::types::model_types::model::Model;
140140
pub use crate::types::model_types::observation::Observation;
141141
// Reasoning types
142142
pub use crate::types::reasoning_types::propagating_effect::PropagatingEffect;
143-
pub use crate::types::reasoning_types::reasoning_mode::ReasoningMode;
144-
pub use crate::types::reasoning_types::unified_evidence::Evidence;
145143
//
146144
//Symbolic types
147145
pub use crate::types::symbolic_types::symbolic_representation::SymbolicRepresentation;

deep_causality/src/traits/causable/causable_reasoning.rs

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

6-
use crate::{Causable, CausalityError, Evidence, NumericalValue, PropagatingEffect};
6+
use crate::{Causable, CausalityError, NumericalValue, PropagatingEffect};
77

88
/// Provides default implementations for reasoning over collections of `Causable` items.
99
///
@@ -42,16 +42,16 @@ where
4242
/// to `Deterministic(false)`, the chain evaluation stops and returns that effect.
4343
///
4444
/// # Arguments
45-
/// * `evidence` - A single `Evidence` object (e.g., a Map or Graph) that all causes will use.
45+
/// * `effect` - A single `PropagatingEffect` object (e.g., a Map or Graph) that all causes will use.
4646
///
4747
/// # Errors
4848
/// Returns a `CausalityError` if any cause in the chain produces a non-deterministic effect.
4949
fn evaluate_deterministic_propagation(
5050
&self,
51-
evidence: &Evidence,
51+
effect: &PropagatingEffect,
5252
) -> Result<PropagatingEffect, CausalityError> {
5353
for cause in self.get_all_items() {
54-
let effect = cause.evaluate(evidence)?;
54+
let effect = cause.evaluate(effect)?;
5555

5656
// This function enforces a strict deterministic contract.
5757
match effect {
@@ -83,18 +83,18 @@ where
8383
/// of 1.0 and `false` as 0.0.
8484
///
8585
/// # Arguments
86-
/// * `evidence` - A single `Evidence` object that all causes will use.
86+
/// * `effect` - A single `PropagatingEffect` object that all causes will use.
8787
///
8888
/// # Errors
8989
/// Returns a `CausalityError` if a `ContextualLink` is encountered.
9090
fn evaluate_probabilistic_propagation(
9191
&self,
92-
evidence: &Evidence,
92+
effect: &PropagatingEffect,
9393
) -> Result<PropagatingEffect, CausalityError> {
9494
let mut cumulative_prob: NumericalValue = 1.0;
9595

9696
for cause in self.get_all_items() {
97-
let effect = cause.evaluate(evidence)?;
97+
let effect = cause.evaluate(effect)?;
9898

9999
match effect {
100100
PropagatingEffect::Probabilistic(p) => {
@@ -117,6 +117,12 @@ where
117117
"Encountered a ContextualLink in a probabilistic chain evaluation.".into(),
118118
));
119119
}
120+
_ => {
121+
// Other variants are not handled in this mode.
122+
return Err(CausalityError(format!(
123+
"evaluate_probabilistic_propagation encountered an unhandled effect: {effect:?}"
124+
)));
125+
}
120126
}
121127
}
122128

@@ -127,19 +133,19 @@ where
127133
/// probabilistic effects, aggregating them into a final effect.
128134
///
129135
/// # Arguments
130-
/// * `evidence` - A single `Evidence` object that all causes will use.
136+
/// * `effect` - A single `PropagatingEffect` object that all causes will use.
131137
///
132138
/// # Errors
133139
/// Returns a `CausalityError` if a `ContextualLink` is encountered.
134140
fn evaluate_mixed_propagation(
135141
&self,
136-
evidence: &Evidence,
142+
effect: &PropagatingEffect,
137143
) -> Result<PropagatingEffect, CausalityError> {
138144
// The chain starts as deterministically true. It can transition to probabilistic.
139145
let mut aggregated_effect = PropagatingEffect::Deterministic(true);
140146

141147
for cause in self.get_all_items() {
142-
let current_effect = cause.evaluate(evidence)?;
148+
let current_effect = cause.evaluate(effect)?;
143149

144150
// Update the aggregated effect based on the current effect.
145151
aggregated_effect = match (aggregated_effect, current_effect) {

deep_causality/src/traits/causable/mod.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
* SPDX-License-Identifier: MIT
33
* Copyright (c) "2025" . The DeepCausality Authors and Contributors. All Rights Reserved.
44
*/
5-
use crate::errors::CausalityError;
6-
use crate::{Evidence, Identifiable, PropagatingEffect};
5+
use crate::{CausalityError, Identifiable, PropagatingEffect};
76

87
pub mod causable_reasoning;
98

@@ -13,7 +12,7 @@ pub mod causable_reasoning;
1312
/// for evaluation and state inspection, regardless of whether the element is a single
1413
/// causaloid, a collection, or a graph.
1514
pub trait Causable: Identifiable {
16-
/// Evaluates the causal element against the provided runtime evidence.
15+
/// Evaluates the causal element against the provided runtime effect.
1716
///
1817
/// This is the primary method for executing the reasoning logic of a causal element.
1918
/// - For a `Singleton`, this typically involves executing its `CausalFn`.
@@ -22,13 +21,13 @@ pub trait Causable: Identifiable {
2221
///
2322
/// # Arguments
2423
///
25-
/// * `evidence` - A reference to the `Evidence` flowing through the causal graph.
24+
/// * `effect` - A reference to the `PropagatingEffect` flowing through the causal graph.
2625
///
2726
/// # Returns
2827
///
2928
/// A `Result` containing a `PropagatingEffect` on success, or a `CausalityError`
3029
/// if the evaluation fails.
31-
fn evaluate(&self, evidence: &Evidence) -> Result<PropagatingEffect, CausalityError>;
30+
fn evaluate(&self, effect: &PropagatingEffect) -> Result<PropagatingEffect, CausalityError>;
3231

3332
/// Generates a human-readable explanation of the causaloid's current state.
3433
///

0 commit comments

Comments
 (0)