eb-optimization 0.2.3__tar.gz → 0.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. {eb_optimization-0.2.3/src/eb_optimization.egg-info → eb_optimization-0.2.4}/PKG-INFO +1 -1
  2. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/pyproject.toml +1 -1
  3. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/policies/__init__.py +4 -0
  4. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/policies/dqc_policy.py +1 -1
  5. eb_optimization-0.2.4/src/eb_optimization/policies/evaluation.py +118 -0
  6. {eb_optimization-0.2.3 → eb_optimization-0.2.4/src/eb_optimization.egg-info}/PKG-INFO +1 -1
  7. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization.egg-info/SOURCES.txt +1 -0
  8. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/LICENSE +0 -0
  9. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/README.md +0 -0
  10. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/setup.cfg +0 -0
  11. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/__init__.py +0 -0
  12. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/_utils.py +0 -0
  13. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/policies/cost_ratio_policy.py +0 -0
  14. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/policies/ral_policy.py +0 -0
  15. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/policies/tau_policy.py +0 -0
  16. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/search/__init__.py +0 -0
  17. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/search/grid.py +0 -0
  18. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/search/kernels.py +0 -0
  19. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/tuning/__init__.py +0 -0
  20. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/tuning/cost_ratio.py +0 -0
  21. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/tuning/ral.py +0 -0
  22. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/tuning/sensitivity.py +0 -0
  23. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/tuning/tau.py +0 -0
  24. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization.egg-info/dependency_links.txt +0 -0
  25. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization.egg-info/requires.txt +0 -0
  26. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization.egg-info/top_level.txt +0 -0
  27. {eb_optimization-0.2.3 → eb_optimization-0.2.4}/tests/test_public_api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eb-optimization
3
- Version: 0.2.3
3
+ Version: 0.2.4
4
4
  Summary: Electric Barometer: Optimization and tuning utilities for EB objectives and policy parameters.
5
5
  Author-email: "Kyle Corrie (Economistician)" <kcorrie@economistician.com>
6
6
  License-Expression: BSD-3-Clause
@@ -3,7 +3,7 @@
3
3
  ######################################
4
4
  [project]
5
5
  name = "eb-optimization"
6
- version = "0.2.3"
6
+ version = "0.2.4"
7
7
  description = "Electric Barometer: Optimization and tuning utilities for EB objectives and policy parameters."
8
8
  readme = "README.md"
9
9
  requires-python = ">=3.10"
@@ -24,6 +24,7 @@ Exported policies
24
24
  - Cost-ratio (R = c_u / c_o) governance for asymmetric loss
25
25
  - RAL policy governance (readiness adjustment layer)
26
26
  - DQC (Δ*) governance for packed / quantized demand snapping and evaluation
27
+ - Policy-composed evaluation entrypoints (DQC-aware evaluation wrappers)
27
28
  """
28
29
 
29
30
  from __future__ import annotations
@@ -43,6 +44,7 @@ from .dqc_policy import (
43
44
  hr_at_tau_grid_units,
44
45
  snap_to_grid,
45
46
  )
47
+ from .evaluation import DQCEvaluation, evaluate_with_dqc_hr
46
48
  from .ral_policy import DEFAULT_RAL_POLICY, RALPolicy, apply_ral_policy
47
49
  from .tau_policy import (
48
50
  TauPolicy,
@@ -56,6 +58,7 @@ __all__ = [
56
58
  "DEFAULT_DQC_POLICY",
57
59
  "DEFAULT_RAL_POLICY",
58
60
  "CostRatioPolicy",
61
+ "DQCEvaluation",
59
62
  "DQCPolicy",
60
63
  "DQCResult",
61
64
  "RALPolicy",
@@ -68,6 +71,7 @@ __all__ = [
68
71
  "apply_tau_policy_hr",
69
72
  "compute_dqc",
70
73
  "enforce_snapping",
74
+ "evaluate_with_dqc_hr",
71
75
  "hr_at_tau_grid_units",
72
76
  "snap_to_grid",
73
77
  ]
@@ -104,7 +104,7 @@ def snap_to_grid(
104
104
  Returns:
105
105
  Snapped array (float dtype), preserving NaNs.
106
106
  """
107
- if not (isinstance(delta, (int, float)) and delta > 0.0):
107
+ if not (isinstance(delta, int | float) and delta > 0.0):
108
108
  raise ValueError(f"delta must be > 0; got {delta!r}")
109
109
 
110
110
  x = np.asarray(x, dtype=float)
@@ -0,0 +1,118 @@
1
+ """Policy-composed evaluation entrypoints for Electric Barometer.
2
+
3
+ This module provides "blessed" evaluation functions that compose multiple policy
4
+ artifacts into a single, decision-safe call. The intent is to make correct
5
+ evaluation easy to use and hard to misuse.
6
+
7
+ Primary responsibilities:
8
+ - Provide a stable API for evaluation that downstream code can depend on.
9
+ - Enforce structural compatibility rules (e.g., DQC snapping for packed demand).
10
+ - Interpret tolerance parameters in the correct unit space (e.g., grid units).
11
+ - Delegate metric primitives to eb-metrics after applying policy semantics.
12
+
13
+ This module is intentionally small. It does not implement forecasting models,
14
+ data adapters, or tuning routines.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ from collections.abc import Sequence
20
+ from dataclasses import dataclass
21
+
22
+ import numpy as np
23
+
24
+ from eb_optimization.policies.dqc_policy import (
25
+ DEFAULT_DQC_POLICY,
26
+ DQCPolicy,
27
+ DQCResult,
28
+ EnforcementMode,
29
+ SnapMode,
30
+ compute_dqc,
31
+ enforce_snapping,
32
+ )
33
+
34
+ try:
35
+ from eb_metrics.metrics.service import hr_at_tau as _hr_at_tau
36
+ except Exception: # pragma: no cover
37
+ _hr_at_tau = None
38
+
39
+
40
+ @dataclass(frozen=True, slots=True)
41
+ class DQCEvaluation:
42
+ """Result container for evaluations performed under DQC governance."""
43
+
44
+ dqc: DQCResult
45
+ tau_units: float
46
+ tau_y_units: float
47
+ hr_at_tau: float
48
+
49
+
50
+ def evaluate_with_dqc_hr(
51
+ y_true: Sequence[float] | np.ndarray,
52
+ y_hat: Sequence[float] | np.ndarray,
53
+ *,
54
+ tau_units: float,
55
+ dqc: DQCResult | None = None,
56
+ y_for_dqc: Sequence[float] | np.ndarray | None = None,
57
+ policy: DQCPolicy = DEFAULT_DQC_POLICY,
58
+ enforce: EnforcementMode = "snap",
59
+ snap_mode: SnapMode = "nearest",
60
+ use_positive_only_for_dqc: bool = True,
61
+ ) -> DQCEvaluation:
62
+ """Evaluate HR@τ under DQC governance with τ expressed in grid units.
63
+
64
+ This entrypoint enforces Demand Quantization Compatibility (DQC) rules:
65
+ - If demand is PACKED or QUANTIZED (per DQCResult), forecasts are snapped
66
+ to the governing grid size Δ* (subject to enforcement mode).
67
+ - Tolerance τ is interpreted in grid units. The numeric τ used for the
68
+ metric primitive is τ_y_units = tau_units * Δ*.
69
+
70
+ Callers may supply a precomputed DQCResult (recommended in production), or
71
+ allow this function to compute DQC from realized demand via `y_for_dqc` (or
72
+ `y_true` if `y_for_dqc` is not provided).
73
+
74
+ Args:
75
+ y_true: Realized demand values.
76
+ y_hat: Forecast demand values.
77
+ tau_units: Tolerance in grid units (multiples of Δ*).
78
+ dqc: Optional precomputed DQCResult. If provided, DQC is not recomputed.
79
+ y_for_dqc: Optional series to compute DQC from (e.g., entity-level
80
+ historical realized demand). Ignored if `dqc` is provided.
81
+ policy: DQCPolicy thresholds and candidate grids used if computing DQC.
82
+ enforce: Snapping enforcement behavior ("snap", "raise", "ignore").
83
+ snap_mode: Snapping mode applied when enforce == "snap".
84
+ use_positive_only_for_dqc: If True, DQC detection uses y>0 values.
85
+
86
+ Returns:
87
+ DQCEvaluation including the DQCResult, τ in grid units, τ in y-units,
88
+ and HR@τ.
89
+
90
+ Raises:
91
+ ImportError: If eb-metrics is not available.
92
+ ValueError: If enforcement mode is "raise" and forecasts are off-grid.
93
+ """
94
+ if _hr_at_tau is None: # pragma: no cover
95
+ raise ImportError("eb-metrics is required (missing eb_metrics.metrics.service.hr_at_tau).")
96
+
97
+ y_true_arr = np.asarray(y_true, dtype=float)
98
+ y_hat_arr = np.asarray(y_hat, dtype=float)
99
+
100
+ if dqc is None:
101
+ y_src = y_true_arr if y_for_dqc is None else np.asarray(y_for_dqc, dtype=float)
102
+ dqc = compute_dqc(y_src, policy=policy, use_positive_only=use_positive_only_for_dqc)
103
+
104
+ # Default: treat tau_units as y-units unless DQC indicates a grid.
105
+ tau_y_units = float(tau_units)
106
+
107
+ if dqc.dqc_class in ("PACKED", "QUANTIZED") and dqc.delta_star is not None:
108
+ y_hat_arr = enforce_snapping(y_hat_arr, dqc=dqc, enforce=enforce, mode=snap_mode)
109
+ tau_y_units = float(tau_units) * float(dqc.delta_star)
110
+
111
+ hr = float(_hr_at_tau(y_true_arr, y_hat_arr, tau=tau_y_units))
112
+
113
+ return DQCEvaluation(
114
+ dqc=dqc,
115
+ tau_units=float(tau_units),
116
+ tau_y_units=tau_y_units,
117
+ hr_at_tau=hr,
118
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eb-optimization
3
- Version: 0.2.3
3
+ Version: 0.2.4
4
4
  Summary: Electric Barometer: Optimization and tuning utilities for EB objectives and policy parameters.
5
5
  Author-email: "Kyle Corrie (Economistician)" <kcorrie@economistician.com>
6
6
  License-Expression: BSD-3-Clause
@@ -11,6 +11,7 @@ src/eb_optimization.egg-info/top_level.txt
11
11
  src/eb_optimization/policies/__init__.py
12
12
  src/eb_optimization/policies/cost_ratio_policy.py
13
13
  src/eb_optimization/policies/dqc_policy.py
14
+ src/eb_optimization/policies/evaluation.py
14
15
  src/eb_optimization/policies/ral_policy.py
15
16
  src/eb_optimization/policies/tau_policy.py
16
17
  src/eb_optimization/search/__init__.py
File without changes