# 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. ![alpha_strike](labels/alpha_strike.svg) ## behaviour_distance_engagement How far our machines stood from theirs, as a share of the board, averaged over the rest of the match. ![behaviour_distance_engagement](labels/behaviour_distance_engagement.svg) ## bv_loss_inflicted Discounted enemy bv removed from the decision's round to the end of the match. ![bv_loss_inflicted](labels/bv_loss_inflicted.svg) ## bv_lost Discounted bv of ours removed over the same window. ![bv_lost](labels/bv_lost.svg) ## 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_dealt](labels/bv_per_damage_dealt.svg) ## bv_per_damage_taken Our battle value lost per point of damage we took. ![bv_per_damage_taken](labels/bv_per_damage_taken.svg) ## bv_trade_ratio Enemy bv removed against ours lost, as a share in 0..1. ![bv_trade_ratio](labels/bv_trade_ratio.svg) ## crippled_suffered Discounted count of our machines put out of the fight - killed or crippled - per machine we brought. ![crippled_suffered](labels/crippled_suffered.svg) ## damage_focus How far our damage concentrated on a few of their machines rather than spreading across all of them, 0 to 1. ![damage_focus](labels/damage_focus.svg) ## damage_inflicted Discounted enemy armour and structure removed from the decision's round to the end. ![damage_inflicted](labels/damage_inflicted.svg) ## damage_taken Discounted armour and structure of ours removed over the same window. ![damage_taken](labels/damage_taken.svg) ## damage_trade_ratio Damage inflicted against damage taken, as a share in 0..1. ![damage_trade_ratio](labels/damage_trade_ratio.svg) ## dispersion How spread out our force stood, as a share of the board, averaged over the rest of the match. ![dispersion](labels/dispersion.svg) ## finishing The share of our damage that landed on machines already hurt when the window opened. ![finishing](labels/finishing.svg) ## focus_suffered How far their damage concentrated on a few of our machines rather than spreading across all of them, 0 to 1. ![focus_suffered](labels/focus_suffered.svg) ## heat_carried How hot our machines ran, averaged over the rest of the match. ![heat_carried](labels/heat_carried.svg) ## inflicted_bv_per_round Enemy bv removed from the decision's round to the end, per round it took to remove. ![inflicted_bv_per_round](labels/inflicted_bv_per_round.svg) ## inflicted_percent_of_maximum Damage inflicted against what our own guns could have landed. ![inflicted_percent_of_maximum](labels/inflicted_percent_of_maximum.svg) ## kills_secured Discounted count of enemy units removed, as a share of what they started with. ![kills_secured](labels/kills_secured.svg) ## mission_kills_inflicted Discounted count of enemy units removed from the fight - killed or crippled - as a share of what they started with. ![mission_kills_inflicted](labels/mission_kills_inflicted.svg) ## prone_time The share of our machine-rounds spent on the ground. ![prone_time](labels/prone_time.svg) ## rear_share_dealt The share of the damage we dealt that landed on rear armour. ![rear_share_dealt](labels/rear_share_dealt.svg) ## rear_share_taken The share of the damage we took that landed on our rear armour. ![rear_share_taken](labels/rear_share_taken.svg) ## shutdowns_suffered Discounted count of our machines heat switched off, per machine we brought. ![shutdowns_suffered](labels/shutdowns_suffered.svg) ## suffered_bv_per_round Our bv removed over the same window, per round. ![suffered_bv_per_round](labels/suffered_bv_per_round.svg) ## suffered_kills Discounted count of ours removed, as a share of what we started with. ![suffered_kills](labels/suffered_kills.svg) ## trade_units Machines we removed against machines we lost, as a share in 0..1 - the count that drives the initiative sequence. ![trade_units](labels/trade_units.svg)