Skip to content

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_success over 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):

  • routed and delivered, as above. A retry is not a new routed packet, so a retry setting cannot raise routed.
  • 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).