EDA — Exposed Diversity Algorithm¶
Two distinct objects
The index is a metric, mandated by the regulator. The algorithm is one way among others of keeping that metric above a threshold. The memorandum mandates the former and does not prescribe the latter.
Status: proposed, never evaluated on real data
The algorithm is validated on its own model — a four-viewpoint catalogue, synthetic relevance. Its real cost in perceived relevance has not been measured, and cannot be on public data as things stand: evaluation would require a dataset carrying the served rank and an interpretable viewpoint label. EB-NeRD carries both columns, but its recorded order does not contain the rank → the index measured. → logs that record the rank · Article 40 request
What is established, and bounds the discussion: a rank-aware floor costs between 10.6 % and 20.9 % of engagement depending on the measure, by exhaustive enumeration (adversarial rank); and evaluating that cost naively on logged clicks is off by 201 % at the median (rank and counterfactual).
And it brings nothing a 1998 heuristic does not already bring
Compared for the first time with tuned baselines and with the exact frontier of the (exposed diversity, engagement) plane, the filter holds it — 0.0 to 1.0 % shortfall. But MMR, published in 1998, holds it too, and beats the filter head to head at floor 0.80.
The filter only stands out at the high requirement: at floor 0.90, MMR finds no compliant setting in 47 % of pools, against 12 % for it. What distinguishes this repository is therefore not its algorithm. → Baselines
The problem it addresses¶
A conventional recommender maximises immediate engagement. The resonance kinetics shows that this cost function is the one producing negative damping: it mechanically rewards emotional charge, hence disinformation, and drives the system towards destructive resonance.
The problem is neither an implementation flaw nor malicious intent. It is the cost function itself. And a cost function, unlike a physical law, can be changed.
The scoring function¶
| Term | Role |
|---|---|
| \(\mathrm{Relevance}(i,c)\) | the conventional matching score, retained |
| \(\Delta H(i,c) = H_{\text{future}} - H_{\text{current}}\) | entropic impact: what serving the item would do to the feed's index |
| \(\mu \ge 0\) | the thermodynamic regulation coefficient — the "viscosity" of the flow |
The sign is positive. The original thread wavered between \(-\mu\Delta H\) and \(+\mu\Delta H\); only the latter promotes diversifying content. The former would close the bubble it claims to open, and a bad-faith platform could invoke it. The code refuses a negative \(\mu\) with an explicit exception. → audit, point 2
Relevance is retained. An algorithm serving diversity without relevance would be abandoned by its users, dissipating no entropy at all. This is not a censorship filter, it is a rebalancing.
Annealing: \(\mu\) is not constant¶
While the feed stays diverse, the algorithm has no reason to intervene. Once the index drops below the critical threshold — the signal of a closing bubble — \(\mu\) rises and the algorithm enters annealing mode: it deliberately over-ranks divergent content long enough to reheat the feed.
This transposes simulated annealing from metallurgy: a temperature spike to break a frozen state, followed by slow cooling that lets the system resettle at lower tension.
from ide.ade import annealing_coefficient
annealing_coefficient(0.80) # 0.5 — healthy feed, resting regime
annealing_coefficient(0.20) # 2.25 — the bubble is closing, μ rises
annealing_coefficient(0.00) # 4.0 — frozen bubble, full annealing
The ramp must be progressive¶
With all-or-nothing triggering, each intervention would lift the index just above the threshold, disabling the next intervention, which would let it fall back: permanent chattering without stabilisation. Linear interpolation between the threshold and zero avoids that cycle.
What it does in practice¶
A user enclosed in a bubble, two candidate items:
from ide.ade import Candidate, EntropicScorer
scorer = EntropicScorer(catalogue_size=4)
feed = ["conspiracy"] * 20
candidates = [
Candidate("bubble-item", "conspiracy", relevance=0.95),
Candidate("fact-check", "factual", relevance=0.50),
]
for scored in scorer.rank(feed, candidates):
print(f"{scored.identifier:14s} score={scored.score:.3f} ΔH={scored.delta_entropy:.4f}")
# fact-check score=1.052 ΔH=0.1381
# bubble-item score=0.950 ΔH=0.0000
The fact-check outranks an item almost twice as relevant — not by penalising the latter, whose score remains its raw relevance, but through the entropic bonus of the former. The feed being frozen, \(\mu\) sits at its maximum annealing value: that is what lets a relevance gap of \(0.45\) be overturned by an entropic impact of \(0.14\).
Notebook 07 shows the full loop: an initially frozen feed sees its index recover over successive serving cycles, whereas a pure engagement filter holds it there indefinitely.
What makes it deployable¶
At \(\mu = 0\), the algorithm is indistinguishable from an engagement filter. The transformation is a parameterised addition, not a product rewrite. A regulator can therefore require a minimum \(\mu\) — or a minimum index, which amounts to the same without prescribing the implementation — without mandating that a recommender engine be rewritten.
The intervention is intermittent. Once the index recovers, \(\mu\) falls back and relevance takes over. The algorithm does not impose permanent diversity: it prevents freezing. That is also what limits its cost in perceived relevance.
The four remedies, and how solid each is¶
| Lever | Action | Solidity |
|---|---|---|
| Thermal noise | raise \(T\): inject a quota of non-personalised content | well supported — hysteresis decreases with \(T\) (notebook 05) |
| Simulated annealing | modulate \(T(t)\): spikes during crises, then cooling | supported, and preferable to permanent noise: notebook 08 shows excessive noise degrades diversity again |
| Counter-field \(-H\) | saturate affected feeds with equally forceful counter-speech | direct consequence of hysteresis, but costly and politically delicate |
| Topological restructuring | limit cascading share reach | to reformulate: connectivity accelerates consensus more than it blocks it (audit, point 12). Defensible as an emergency measure, not as a diagnosis |
Limitations¶
- Not tested on a real system. Validated against its own model, with a four-viewpoint catalogue and synthetic relevance. → roadmap §3.1
- The engagement cost is evaluated only in simulation. The order of magnitude exists — 10.6 % to 20.9 % for a rank-aware floor, by exhaustive enumeration of every possible feed — but it concerns feeds of eight slots over four viewpoints, with synthetic relevance. It is not an answer to a platform's objection; it is what is needed to state the objection properly. → adversarial rank
- The tooling to evaluate it exists, the data does not. This repository's counterfactual estimators were confronted with a ground truth and recover the value of a never-deployed policy to within 2.5 %, where the naive estimate is off by 32 %. What they lack is a log carrying both rank and viewpoints. → logs that record the rank
- Viewpoint discretisation is inherited from the index, with its limitations: label diversity can satisfy the score without diversifying the argument.
- An algorithm that decides what should be seen is still an algorithm that decides. Changing its cost function relocates editorial power; it does not remove it.
Implementation: ide.ade · Notebook:
07 ·
Regulatory memorandum