1313Rung-2 (3) -> counterfactual Rung-3 (3B) -> consensus (4).
1414"""
1515
16- from cnsd .causal import intervention_effect_of_condition , signal_kurtosis
16+ from cnsd .causal import compute_vibration_rms , intervention_effect_of_condition , signal_kurtosis
1717from cnsd .consensus import fuse
1818from cnsd .counterfactual import build_scm , what_if
1919from cnsd .datasets import Dataset
@@ -41,7 +41,8 @@ def fit(self, data: Dataset, epochs=30):
4141 self .symbolic = self ._build_symbolic (data )
4242 # fit the Rung-3 SCM (graceful None if DoWhy absent)
4343 feat = signal_kurtosis (data .X )
44- self .scm = build_scm (data .cond , feat , data .y )
44+ rms = compute_vibration_rms (data .X )
45+ self .scm = build_scm (data .cond , feat , rms )
4546 self ._fitted = True
4647 return self
4748
@@ -100,7 +101,8 @@ def condition_effect(self, data: Dataset):
100101 return intervention_effect_of_condition (data .y , data .cond )
101102
102103 def what_if (self , data : Dataset , unit_index , condition_cf ):
103- """Rung-3 counterfactual for one unit (sensitivity fallback w/o DoWhy)."""
104+ """Rung-3 counterfactual degradation severity (RMS) under do(Z) for one
105+ unit (sensitivity fallback w/o DoWhy)."""
104106 # Future refactor: process the full condition_cf dictionary for multiple interventions.
105107 # Currently, the core SCM supports a single Z variable, so we extract the first value.
106108 if isinstance (condition_cf , dict ):
@@ -115,5 +117,5 @@ def what_if(self, data: Dataset, unit_index, condition_cf):
115117 cf_val ,
116118 scm = self .scm ,
117119 X_sample = data .X [unit_index ].flatten (),
118- factual_y = (data .y [unit_index ] > 0 ) ,
120+ factual_y = compute_vibration_rms (data .X [unit_index : unit_index + 1 ])[ 0 ] ,
119121 )
0 commit comments