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.
- {eb_optimization-0.2.3/src/eb_optimization.egg-info → eb_optimization-0.2.4}/PKG-INFO +1 -1
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/pyproject.toml +1 -1
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/policies/__init__.py +4 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/policies/dqc_policy.py +1 -1
- eb_optimization-0.2.4/src/eb_optimization/policies/evaluation.py +118 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4/src/eb_optimization.egg-info}/PKG-INFO +1 -1
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization.egg-info/SOURCES.txt +1 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/LICENSE +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/README.md +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/setup.cfg +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/__init__.py +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/_utils.py +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/policies/cost_ratio_policy.py +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/policies/ral_policy.py +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/policies/tau_policy.py +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/search/__init__.py +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/search/grid.py +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/search/kernels.py +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/tuning/__init__.py +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/tuning/cost_ratio.py +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/tuning/ral.py +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/tuning/sensitivity.py +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/tuning/tau.py +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization.egg-info/dependency_links.txt +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization.egg-info/requires.txt +0 -0
- {eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization.egg-info/top_level.txt +0 -0
- {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
|
+
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.
|
|
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,
|
|
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
|
+
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization/policies/cost_ratio_policy.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{eb_optimization-0.2.3 → eb_optimization-0.2.4}/src/eb_optimization.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|