Labels, worked through #
docs/FEATURES.md exists because a sentence is not enough to argue with a
fitted weight. A label needs it more than a feature does. A feature is a number
about one candidate at one instant, and a reader can check it by looking at the
board; a label is a window - it looks forward from the decision's round to the
end of the match, discounts what it finds, and collapses it to one number. None
of that is visible in the name, and two labels whose names differ by a word can
have completely different shapes over the same match.
So each figure here plots one label over the rounds of a single hand-built
match, for both seats at once. Two lines rather than one, because the
question a label has to answer is "which of these two sides was doing better",
and a label that draws the same line twice cannot answer it. That is not
hypothetical: behaviour_distance_engagement drew two identical lines through
four corpora before anybody looked, and sds labelrank scored it 0 decided
against 964 ties.
The match is small enough to check by hand and is written out below. Nothing on
this page is transcribed - every figure is rendered by label_value itself,
through the same code sds train fits with, and tests/test_labeldoc.py fails
if the file on disk stops matching what the code renders.
The match #
A 2v2 on a 17-hex board. North brings a heavy and a medium, South the same, and the two sides start eleven hexes apart.
- Round 1 - both sides deploy and close. Nobody shoots.
- Round 2 - first exchange. North lands 80 points across both of South's machines; South lands 45 into North's heavy.
- Round 3 - North concentrates on South's medium, which had already been hurt, and takes it apart. South's heavy puts 50 into North's medium, 25 of it into the rear.
- Round 4 - North's heavy runs hot and shuts down. South's heavy, alone now, backs off; the gap opens.
- Round 5 - North's medium closes and finishes South's heavy. The match ends.
Every figure below plots one label at each decision round of that match. A point is what a decision taken in that round would be labelled with, which is why round 5 is empty for most of them: the window a label looks through runs from the decision to the end of the match, and after the last round there is nothing left to look at. An open circle on the axis is a round where the label is undefined rather than zero - a share with nothing in its denominator has no value, and calling it zero would fill the column with rows claiming a failure in windows where nobody shot anybody.
All 27 of them.
alpha_strike #
What we fired against what our surviving guns could still have fired.
behaviour_distance_engagement #
How far our machines stood from theirs, as a share of the board, averaged over the rest of the match.
bv_loss_inflicted #
Discounted enemy bv removed from the decision's round to the end of the match.
bv_lost #
Discounted bv of ours removed over the same window.
bv_per_damage_dealt #
Enemy battle value removed per point of damage we dealt - high when a point takes a gun or a pilot off, low when it strips armour.
bv_per_damage_taken #
Our battle value lost per point of damage we took.
bv_trade_ratio #
Enemy bv removed against ours lost, as a share in 0..1.
crippled_suffered #
Discounted count of our machines put out of the fight - killed or crippled - per machine we brought.
damage_focus #
How far our damage concentrated on a few of their machines rather than spreading across all of them, 0 to 1.
damage_inflicted #
Discounted enemy armour and structure removed from the decision's round to the end.
damage_taken #
Discounted armour and structure of ours removed over the same window.
damage_trade_ratio #
Damage inflicted against damage taken, as a share in 0..1.
dispersion #
How spread out our force stood, as a share of the board, averaged over the rest of the match.
finishing #
The share of our damage that landed on machines already hurt when the window opened.
focus_suffered #
How far their damage concentrated on a few of our machines rather than spreading across all of them, 0 to 1.
heat_carried #
How hot our machines ran, averaged over the rest of the match.
inflicted_bv_per_round #
Enemy bv removed from the decision's round to the end, per round it took to remove.
inflicted_percent_of_maximum #
Damage inflicted against what our own guns could have landed.
kills_secured #
Discounted count of enemy units removed, as a share of what they started with.
mission_kills_inflicted #
Discounted count of enemy units removed from the fight - killed or crippled - as a share of what they started with.
prone_time #
The share of our machine-rounds spent on the ground.
rear_share_dealt #
The share of the damage we dealt that landed on rear armour.
rear_share_taken #
The share of the damage we took that landed on our rear armour.
shutdowns_suffered #
Discounted count of our machines heat switched off, per machine we brought.
suffered_bv_per_round #
Our bv removed over the same window, per round.
suffered_kills #
Discounted count of ours removed, as a share of what we started with.
trade_units #
Machines we removed against machines we lost, as a share in 0..1 - the count that drives the initiative sequence.