Scoring¶
How the node turns a block of traffic into the score that setting trials and the adaptive tuner judge.
The objective function¶
Both tuners, the adaptive bandit and the setting trial,
score a closed measurement window with the same objective. It is computed on the
node (Objective.h) and mirrored offline by beebo analyze tuning trial, so the
two are always comparable.
What is measured: confirmed delivery. When this node transmits (its own packet, a forward or an ACK reply), a neighbor either rebroadcasts it (flood) or ACKs it (direct): a reception that arrives later and was caused by the earlier transmission succeeding. From that, per window:
routed: packets routed per hour, the confirmable attempts (ack_success + ack_timeout + echo_attempt).delivered: the share of them confirmed (ack_success + echo_successover the routed count). Routed times delivered is the confirmed deliveries per hour (ACKs plus flood echoes), which the trial's confirm-ratio guard reads.
Absence of an echo or ACK does not prove a failure (no repeater may have been in
range), so this is much less confounded than the forwarding decision, but it is
not perfect ground truth. The earlier proxy, forwarded / (forwarded + no_forward
+ path_full), is not used for scoring: no_forward is admin policy, path_full
a hop-count limit and forwarded only means "scheduled", so none of the tunable
parameters changes those counts. It remains available offline as
delivery_proxy in beebo analyze tuning indicators, as a diagnostic.
The score. repeater.routing.tuning.score.* holds one signed weight per
indicator, in tenths (10 = 1.0):
routedanddelivered, as above. A retry is not a new routed packet, so a retry setting cannot raiserouted.received: valid packets received per hour.
Every indicator is put on a 0 to 100 scale (per-hour volumes as a percent of the
channel's usable capacity, about 2800 events per hour at SF7 / 62.5 kHz) and the
score is the weighted sum of ln(1 + x/0.1) of the indicators, so a weight says how
much a 10% change in that indicator is worth: weight 0 ignores it and a negative
weight treats it as a cost. The defaults (routed 10, delivered 10, received
0) give the confirmed deliveries per hour, routed times the delivered share, with
no indicator counted twice. Give received a weight to judge receive-side
switches (LNA, RX boost), which barely move the TX confirmations. Both tuners use
the same weights; a weight cannot be changed while a trial runs (stop it first).
Between trials a change restarts the trial sequence and the bandit's statistics. The trial's confirm-ratio guard and the bandit's rollback check are
separate safety checks and stay fixed.
beebo analyze tuning indicators and analyze tuning trial report wider
diagnostics that are not part of the score (TX Dispatched, RX Invalid and Errors,
neighbors, Pool Busy, CAD Busy, TX success rate, wrong-hop rate, SNR/RSSI/noise-floor
trends).