| |
| |
| |
| |
| |
|
|
| """ |
| Aggregate Grader -- combines all sub-grader scores into a single 0-1 score. |
| |
| CRITICAL DESIGN: Fidelity acts as a GATE, not just a weighted component. |
| The aggregate score is the weighted sum MULTIPLIED by fidelity, ensuring |
| that low-fidelity circuits cannot score highly regardless of efficiency/noise. |
| |
| Formula: |
| weighted_sum = w_f * fidelity + w_e * efficiency + w_n * noise + w_c * constraints |
| aggregate = weighted_sum * fidelity |
| |
| This means: |
| - fidelity=1.0: aggregate == weighted_sum (normal behaviour) |
| - fidelity=0.5: aggregate drops by 50% (strong penalty) |
| - fidelity=0.0: aggregate == 0.0 (total failure) |
| |
| This prevents trivially short, incorrect circuits from scoring highly |
| via inflated efficiency/noise scores. |
| """ |
|
|
| import logging |
| from typing import Dict, Optional |
|
|
| logger = logging.getLogger(__name__) |
|
|
|
|
| |
| DEFAULT_WEIGHTS: Dict[str, float] = { |
| "fidelity": 0.50, |
| "efficiency": 0.20, |
| "noise": 0.15, |
| "constraints": 0.15, |
| } |
|
|
|
|
| class AggregateGrader: |
| """Combine individual grader scores into a single aggregate score.""" |
|
|
| def __init__(self, weights: Optional[Dict[str, float]] = None): |
| """ |
| Initialize with optional custom weights. |
| |
| Args: |
| weights: Dict mapping grader name to weight. |
| Must sum to ~1.0. Defaults to DEFAULT_WEIGHTS. |
| """ |
| self.weights = weights or DEFAULT_WEIGHTS.copy() |
|
|
| def grade( |
| self, |
| fidelity_score: float, |
| efficiency_score: float, |
| noise_score: float, |
| constraints_score: float, |
| ) -> float: |
| """ |
| Compute weighted aggregate score with fidelity gating. |
| |
| The final score is: |
| weighted_sum * fidelity_score |
| |
| This ensures fidelity dominates: a circuit with fidelity=0.25 |
| can score at most 0.25, regardless of other components. |
| |
| If constraints_score == 0.0, the entire score is zeroed out |
| (hard constraint failure). |
| |
| Args: |
| fidelity_score: Score from FidelityGrader [0, 1]. |
| efficiency_score: Score from EfficiencyGrader [0, 1]. |
| noise_score: Score from NoiseGrader [0, 1]. |
| constraints_score: Score from ConstraintsGrader [0, 1]. |
| |
| Returns: |
| Aggregate score in [0.0, 1.0]. |
| """ |
|
|
| |
| if constraints_score < 1e-6: |
| logger.debug( |
| "Aggregate: CONSTRAINT FAILURE -> 0.0 " |
| "(fid=%.4f eff=%.4f noise=%.4f cstr=%.4f)", |
| fidelity_score, efficiency_score, noise_score, constraints_score, |
| ) |
| return 0.0001 |
|
|
| |
| weighted_sum = ( |
| self.weights.get("fidelity", 0.5) * fidelity_score |
| + self.weights.get("efficiency", 0.2) * efficiency_score |
| + self.weights.get("noise", 0.15) * noise_score |
| + self.weights.get("constraints", 0.15) * constraints_score |
| ) |
|
|
| |
| |
| aggregate = weighted_sum * fidelity_score |
|
|
| aggregate = float(max(0.0001, min(0.9999, aggregate))) |
|
|
| logger.debug( |
| "Aggregate: %.4f (fid=%.4f eff=%.4f noise=%.4f cstr=%.4f, " |
| "weighted_sum=%.4f, fid_gated=%.4f)", |
| aggregate, fidelity_score, efficiency_score, |
| noise_score, constraints_score, weighted_sum, aggregate, |
| ) |
|
|
| return aggregate |
|
|