|
| 1 | +# Scoring Weights Overview |
| 2 | + |
| 3 | +This diagram summarizes the scoring weights currently implemented in the `hiap-meed` prioritization pipeline. |
| 4 | + |
| 5 | +```mermaid |
| 6 | +%%{init: {"flowchart": {"nodeSpacing": 38, "rankSpacing": 48, "curve": "basis"}, "themeVariables": {"lineColor": "#7a7a7a"}} }%% |
| 7 | +flowchart TD |
| 8 | + FS["Final Score"] |
| 9 | + FS -->|0.55| IMP["Impact Pillar"] |
| 10 | + FS -->|0.22| ALN["Alignment Pillar"] |
| 11 | + FS -->|0.23| FEA["Feasibility Pillar"] |
| 12 | +
|
| 13 | + IMP -->|0.80| IMP_RED["Emissions Reduction Share of City Total"] |
| 14 | + IMP -->|0.20| IMP_TIME["Timeline Component"] |
| 15 | +
|
| 16 | + IMP_TIME -->|1.0| IMP_T_SHORT["<5 years"] |
| 17 | + IMP_TIME -->|0.5| IMP_T_MED["5-10 years"] |
| 18 | + IMP_TIME -->|0.0| IMP_T_LONG[">10 years"] |
| 19 | + IMP_TIME -->|0.5| IMP_T_UNKNOWN["Missing / Unknown timeline"] |
| 20 | +
|
| 21 | + IMP_RED --> IMP_BAND["Impact Text Multiplier"] |
| 22 | + IMP_BAND -->|0.2| BAND_VLOW["very low"] |
| 23 | + IMP_BAND -->|0.4| BAND_LOW["low"] |
| 24 | + IMP_BAND -->|0.6| BAND_MED["medium"] |
| 25 | + IMP_BAND -->|0.8| BAND_HIGH["high"] |
| 26 | + IMP_BAND -->|1.0| BAND_VHIGH["very high"] |
| 27 | +
|
| 28 | + ALN -->|0.75| ALN_POL["Policy Component"] |
| 29 | + ALN -->|0.15| ALN_SEC["Sector Match Component"] |
| 30 | + ALN -->|0.05| ALN_COB["Co-benefit Preference Component"] |
| 31 | + ALN -->|0.05| ALN_TIME["Timeframe Preference Component"] |
| 32 | +
|
| 33 | + ALN_POL -->|direct 0..1 input| POL_SCORE["policy_support_score"] |
| 34 | + POL_SCORE -->|fallback 0.0| POL_MISS["Missing policy score"] |
| 35 | +
|
| 36 | + ALN_SEC -->|1.0| SEC_MATCH["Sector overlap with city preference"] |
| 37 | + ALN_SEC -->|0.0| SEC_NO["No sector overlap"] |
| 38 | +
|
| 39 | + ALN_COB -->|normalize from -2..2 to 0..1| COB_NORM["Selected co-benefit impacts"] |
| 40 | + COB_NORM -->|0.0| COB_HARM["Most harmful aggregate"] |
| 41 | + COB_NORM -->|0.5| COB_NEUT["Neutral aggregate"] |
| 42 | + COB_NORM -->|1.0| COB_POS["Most beneficial aggregate"] |
| 43 | + ALN_COB -->|0.5| COB_NONE["No co-benefits selected"] |
| 44 | +
|
| 45 | + ALN_TIME -->|1.0| ALN_TIME_EXACT["Exact timeframe match"] |
| 46 | + ALN_TIME -->|0.5| ALN_TIME_ADJ["Adjacent match"] |
| 47 | + ALN_TIME -->|0.0| ALN_TIME_FAR["Far mismatch"] |
| 48 | + ALN_TIME -->|0.5| ALN_TIME_NOPREF["no_preference / no supported preference"] |
| 49 | + ALN_TIME -->|0.5| ALN_TIME_UNKNOWN["Missing / Unknown action timeline"] |
| 50 | +
|
| 51 | + FEA -->|0.50| FEA_LEG["Soft Legal Component"] |
| 52 | + FEA -->|0.50| FEA_SOC["Socioeconomic Component"] |
| 53 | +
|
| 54 | + FEA_LEG -->|aligned_soft / total_soft| LEG_RATIO["Recommended + Optional requirements only"] |
| 55 | + LEG_RATIO -->|0.0 fallback| LEG_NONE["No soft legal requirements"] |
| 56 | +
|
| 57 | + FEA_SOC -->|normalize from -2..2 to 0..1| SOC_NORM["Weighted socioeconomic average"] |
| 58 | + SOC_NORM -->|bucket -2| SOC_VLOW["very_low"] |
| 59 | + SOC_NORM -->|bucket -1| SOC_LOW["low"] |
| 60 | + SOC_NORM -->|bucket 0| SOC_MED["medium"] |
| 61 | + SOC_NORM -->|bucket 1| SOC_HIGH["high"] |
| 62 | + SOC_NORM -->|bucket 2| SOC_VHIGH["very_high"] |
| 63 | + FEA_SOC -->|missing city indicator -> raw 0| SOC_MISS["Missing city indicator contributes 0 before normalization"] |
| 64 | + FEA_SOC -->|0.5 fallback| SOC_NONE["No socioeconomic rules on action"] |
| 65 | +
|
| 66 | + linkStyle 0,1,2 stroke-width:4px |
| 67 | + linkStyle 3,4,16,17 stroke-width:3px |
| 68 | + linkStyle 18,19,20,21,27,28 stroke-width:2.5px |
| 69 | +``` |
| 70 | + |
| 71 | +## Notes |
| 72 | + |
| 73 | +- `0.5` is not universally neutral across all components. |
| 74 | +- `0.5` is a true neutral midpoint only for components normalized from a signed scale such as `-2..2`. |
| 75 | +- Timeline is scored differently in Impact and Alignment: |
| 76 | + - Impact uses intrinsic speed scoring. |
| 77 | + - Alignment uses match-to-city-preference scoring. |
| 78 | + |
| 79 | +## Weight Intuition |
| 80 | + |
| 81 | +These examples use the current default final weights: |
| 82 | + |
| 83 | +- Impact = `0.55` |
| 84 | +- Alignment = `0.22` |
| 85 | +- Feasibility = `0.23` |
| 86 | + |
| 87 | +### Top-level pillars |
| 88 | + |
| 89 | +- A `+0.10` change in Impact changes the final score by `+0.055` |
| 90 | +- A `+0.10` change in Alignment changes the final score by `+0.022` |
| 91 | +- A `+0.10` change in Feasibility changes the final score by `+0.023` |
| 92 | + |
| 93 | +This means Impact is a bit more than twice as influential as Alignment or Feasibility in the final ranking. |
| 94 | + |
| 95 | +### Impact examples |
| 96 | + |
| 97 | +- Impact timeline has internal weight `0.20`, so a full `1.0` swing inside that component changes: |
| 98 | + - Impact score by `0.20` |
| 99 | + - Final score by `0.55 * 0.20 = 0.11` |
| 100 | + |
| 101 | +- Example: changing Impact timeline from missing/unknown `0.5` to short `<5 years = 1.0` |
| 102 | + - Impact score change = `+0.10` |
| 103 | + - Final score change = `+0.055` |
| 104 | + |
| 105 | +- Example: changing Impact timeline from long `0.0` to short `1.0` |
| 106 | + - Impact score change = `+0.20` |
| 107 | + - Final score change = `+0.11` |
| 108 | + |
| 109 | +- Impact emissions reduction share has internal weight `0.80`, so a `+0.10` change there changes: |
| 110 | + - Impact score by `+0.08` |
| 111 | + - Final score by `0.55 * 0.08 = 0.044` |
| 112 | + |
| 113 | +### Alignment examples |
| 114 | + |
| 115 | +- Policy support has internal weight `0.75`, so a `+0.10` change in `policy_support_score` changes: |
| 116 | + - Alignment score by `+0.075` |
| 117 | + - Final score by `0.22 * 0.075 = 0.0165` |
| 118 | + |
| 119 | +- Sector match is binary with internal weight `0.15` |
| 120 | + - no match `0.0` -> match `1.0` |
| 121 | + - Alignment score change = `+0.15` |
| 122 | + - Final score change = `0.22 * 0.15 = 0.033` |
| 123 | + |
| 124 | +- Timeframe preference has internal weight `0.05` |
| 125 | + - far mismatch `0.0` -> exact match `1.0` |
| 126 | + - Alignment score change = `+0.05` |
| 127 | + - Final score change = `0.22 * 0.05 = 0.011` |
| 128 | + |
| 129 | +- Co-benefit preference also has internal weight `0.05` |
| 130 | + - harmful aggregate `0.0` -> beneficial aggregate `1.0` |
| 131 | + - Alignment score change = `+0.05` |
| 132 | + - Final score change = `0.011` |
| 133 | + |
| 134 | +### Feasibility examples |
| 135 | + |
| 136 | +- Soft legal has internal weight `0.50` |
| 137 | + - `0.0` -> `1.0` |
| 138 | + - Feasibility score change = `+0.50` |
| 139 | + - Final score change = `0.23 * 0.50 = 0.115` |
| 140 | + |
| 141 | +- Socioeconomic fit also has internal weight `0.50` |
| 142 | + - `0.5` neutral -> `1.0` very supportive |
| 143 | + - Feasibility score change = `+0.25` |
| 144 | + - Final score change = `0.23 * 0.25 = 0.0575` |
| 145 | + |
| 146 | +### Quick reading guide |
| 147 | + |
| 148 | +- The biggest single driver in the current setup is usually Impact. |
| 149 | +- Inside Alignment, Policy support dominates the other Alignment subcomponents. |
| 150 | +- Alignment timeframe matters, but its effect on the final score is small relative to Impact timeline. |
| 151 | +- Missing Impact timeline is now neutral at `0.5`, so it no longer penalizes actions just because the timeline is unknown. |
0 commit comments