1414from codecarbon .output_methods .emissions_data import EmissionsData , TaskEmissionsData
1515
1616
17- @dataclass
18- class UncertaintyAwareEmissionsData (EmissionsData ):
19- """
20- Enhanced emissions data with uncertainty quantification.
17+ class UncertaintyMixin :
18+ """Mixin for uncertainty quantification fields and methods."""
2119
22- Extends the base EmissionsData to include confidence intervals
23- and uncertainty metadata from Monte Carlo analysis.
24- """
25-
26- # Uncertainty analysis results
2720 uncertainty_enabled : bool = False
2821 uncertainty_method : Optional [str ] = None
2922 emissions_ci_lower_kg : Optional [float ] = None
@@ -64,6 +57,16 @@ def set_uncertainty_data(self, uncertainty_summary: UncertaintySummary) -> None:
6457 else :
6558 self .uncertainty_quality = "very_low_precision"
6659
60+
61+ @dataclass
62+ class UncertaintyAwareEmissionsData (EmissionsData , UncertaintyMixin ):
63+ """
64+ Enhanced emissions data with uncertainty quantification.
65+
66+ Extends the base EmissionsData to include confidence intervals
67+ and uncertainty metadata from Monte Carlo analysis.
68+ """
69+
6770 @property
6871 def values (self ) -> OrderedDict :
6972 """Extended values property including uncertainty fields."""
@@ -161,39 +164,11 @@ def toJSON(self):
161164
162165
163166@dataclass
164- class UncertaintyAwareTaskEmissionsData (TaskEmissionsData ):
167+ class UncertaintyAwareTaskEmissionsData (TaskEmissionsData , UncertaintyMixin ):
165168 """
166169 Task-level emissions data with uncertainty quantification.
167170
168171 Inherits all base task fields from TaskEmissionsData and adds
169- uncertainty-specific metadata and confidence intervals.
172+ uncertainty-specific metadata and confidence intervals via UncertaintyMixin .
170173 """
171-
172- # Uncertainty fields - only declare new fields, inherit the rest
173- uncertainty_enabled : bool = False
174- uncertainty_method : Optional [str ] = None
175- emissions_ci_lower_kg : Optional [float ] = None
176- emissions_ci_upper_kg : Optional [float ] = None
177- confidence_level_pct : Optional [float ] = None
178- relative_uncertainty_pct : Optional [float ] = None
179- uncertainty_quality : Optional [str ] = None
180-
181- def set_uncertainty_data (self , uncertainty_summary : UncertaintySummary ) -> None :
182- """Populate uncertainty fields from analysis results."""
183- self .uncertainty_enabled = True
184- self .uncertainty_method = uncertainty_summary .method
185- self .emissions_ci_lower_kg = uncertainty_summary .ci_lower_kg
186- self .emissions_ci_upper_kg = uncertainty_summary .ci_upper_kg
187- self .confidence_level_pct = uncertainty_summary .confidence_level_pct
188- self .relative_uncertainty_pct = uncertainty_summary .relative_uncertainty_pct
189-
190- # Quality assessment
191- if self .relative_uncertainty_pct is not None :
192- if self .relative_uncertainty_pct <= 5.0 :
193- self .uncertainty_quality = "high_precision"
194- elif self .relative_uncertainty_pct <= 15.0 :
195- self .uncertainty_quality = "moderate_precision"
196- elif self .relative_uncertainty_pct <= 25.0 :
197- self .uncertainty_quality = "low_precision"
198- else :
199- self .uncertainty_quality = "very_low_precision"
174+ pass # All uncertainty functionality provided by UncertaintyMixin
0 commit comments