The problem the aggregator solves
Several challenges run at once, each producing its own raw hotkey scores on its own scale. Bittensor expects a single vector indexed by UID. The aggregator bridges the two.Step 1: normalize each challenge’s weights
For one challenge, the rawhotkey -> weight map is cleaned and normalized. Non-finite values and values at or below zero are dropped, then the rest are scaled to sum to 1.
Step 2: normalize emissions across challenges
Each active challenge carries an emission share (emission_percent). The aggregator clamps negatives to zero and normalizes the shares of active challenges so they sum to 1. If nothing is active, every share is zero.
Step 3: combine into a UID vector
The aggregator walks every active challenge. For each one it multiplies that challenge’s normalized emission share by each hotkey’s normalized weight, and accumulates per hotkey:- A hotkey with no known UID is skipped.
- UID
0is skipped.
0.
What gets published
The aggregator emits aFinalWeights value with aligned uids and weights lists, plus the surviving per-hotkey weights. This is the vector the on-chain submitter reads from the master and submits to Bittensor at each epoch.
Next
Incentive mechanism
Why the subnet is built to reward real work.
How the subnet works
See where aggregation sits in the full flow.