diff --git a/common_libs/tests/analyze_drussgt_dodge_vs_power.py b/common_libs/tests/analyze_drussgt_dodge_vs_power.py new file mode 100644 index 0000000..bca37bf --- /dev/null +++ b/common_libs/tests/analyze_drussgt_dodge_vs_power.py @@ -0,0 +1,795 @@ +#!/usr/bin/env python3 +"""Does DrussGT's dodge quality change with the bullet power WE fire? + +Reads REAL live-vs-real-DrussGT captures (per-tick worldstate jsonl + a +fire/hit event sidecar + a per-round tick index) produced by +``tools/robocode_shim/run_bridge_battle.sh``, and measures DrussGT's movement +response per shot, conditioned on the power ModularBot fired. No offline +fixture replay, no simulator: these are the recorded live battles. + +-------------------------------------------------------------------------------- +WHY THE OBVIOUS ANALYSIS IS WRONG +-------------------------------------------------------------------------------- +Power is NOT randomly assigned. Our power policy (common_libs/gun_harness/ +virtual_bullets.nim) only ever *caps* the gun's preference, by: + * RANGE -- TR_POWER_FAR_DIST=200 -> cap 1.0 beyond it (prFar); + * OUR ENERGY -- a linear slope from TR_POWER_ENERGY_MIN=0.5 at <=20 energy to + the cap at >=80 (prEnergySlope); + * the finishing rule (prFinishKill) and the sub-average-chances rule. +So "shots we fired at low power" are disproportionately long-range shots and +late/low-energy shots. Every comparison below is therefore stratified by the +fire-time range band, the headline is the stratified one, and the between-group +difference is compared against a NULL that permutes the power labels inside the +band (re-deriving the arrival tick so the kinematic channel survives the null). +We also report the confounder itself (our energy, enemy energy) per cell. + +-------------------------------------------------------------------------------- +WHAT IS MEASURED +-------------------------------------------------------------------------------- +Per shot fired by US (ModularBot) at DrussGT. u = (cos dir, sin dir) is the +direction the bullet was fired; the bullet flies from the fire position along u +at v = 20 - 3p px/tick. + (a) MISS AT ARRIVAL -- perpendicular px between DrussGT's position on the + tick our bullet reaches its along-track plane and our bullet's intended + line. = |perp(perpendicular offset)| at that tick. Bot radius 18 px. + (b) LATERAL DISPLACEMENT -- perp offset change over the flight window, and the + SAME over a FIXED 12-tick window after the shot (power-neutral). + (c) RESPONSE LATENCY -- ticks from our fire until DrussGT's heading has turned + > LAT_DEG from its fire-tick heading. + (d) MEAN TURN RATE and MEAN SPEED over the flight window and the fixed window. + (e) DODGE DIRECTION -- did it move FURTHER off the aim line (|perp| grows). + (f) FLIGHT WINDOW LENGTH -- low power is a FASTER bullet, so a SHORTER window. +Outcome: hit rate per cell, resolved from the real hit/hitwall events. + +-------------------------------------------------------------------------------- +THE CONTROL +-------------------------------------------------------------------------------- +A real bullet response must appear in the window the bullet is in the air. A +phase/distance artifact would appear just as strongly in a LATER window of the +same shot, when the bullet is long gone. So every metric is also computed over +a CONTROL window at [fire+CTRL_OFF, fire+CTRL_OFF+12] and the two are compared. +Anything that shows up in both is a property of the situation, not of the shot. + +Run: + python3 common_libs/tests/analyze_drussgt_dodge_vs_power.py \ + --tfil /tmp/tfil_ab2/out --powtest /tmp/powtest \ + --json common_libs/tests/fixtures/dodge_vs_power_results.json + +MEASURED = the numbers in the tables below (real recorded battles). +INFERRED = the attributions and the causal reading; both are flagged in the doc. +""" +from __future__ import annotations + +import argparse +import collections +import json +import math +import os +import random +import statistics + +BOT_RADIUS = 18.0 +SPEED_A, SPEED_B = 20.0, 3.0 # bullet speed = 20 - 3p +LAT_DEG = 15.0 # heading turn that counts as a response +FIXED_WIN = 12 # power-neutral movement window (ticks) +CTRL_OFF = 40 # control window starts here after the fire +RANGE_MATCH_PX = 50 # range sub-bin used to match on range as well +MAX_FLIGHT = 220 +BANDS = [(0, 100), (100, 200), (200, 300), (300, 450), (450, 10000)] +BAND_LABELS = ["0-100", "100-200", "200-300", "300-450", "450+"] +PWR_EDGES = [0.0, 0.5, 0.75, 1.0, 1.5, 4.0] +PWR_LABELS = ["<0.50", "0.50-0.75", "0.75-1.00", "1.00-1.50", ">=1.50"] + + +def pbin(p): + for i in range(len(PWR_EDGES) - 1): + if PWR_EDGES[i] <= p < PWR_EDGES[i + 1]: + return i + return None + + +def band_of(r): + for i, (lo, hi) in enumerate(BANDS): + if lo <= r < hi: + return BAND_LABELS[i] + return BAND_LABELS[-1] + + +def wrap180(x): + return abs(((x + 180.0) % 360.0) - 180.0) + + +def mean(xs): + return statistics.fmean(xs) if xs else float("nan") + + +def pct(xs, q): + if not xs: + return float("nan") + xs = sorted(xs) + return xs[min(len(xs) - 1, int(q * len(xs)))] + + +# --------------------------------------------------------------------- loader +def _rows(path): + out = [] + with open(path) as f: + for line in f: + line = line.strip() + if not line: + continue + o = json.loads(line) + if "tick" in o: + out.append(o) + return out + + +class Run: + """One live battle: capture rows, event sidecar, per-round tick index.""" + + def __init__(self, cap_path, events_path, rounds_path): + self.cap_path = cap_path + self.rows = _rows(cap_path) + self.by_tick = {r["tick"]: r for r in self.rows} + self.events = [json.loads(l) for l in open(events_path) if l.strip()] + self.rounds = json.load(open(rounds_path))["rounds"] + self.start = {r["round"]: r["startTick"] for r in self.rounds} + self.count = {r["round"]: r["count"] for r in self.rounds} + self.owner_side = self._resolve_owner_side() + self.resolution = {} + for ev in self.events: + if ev.get("type") in ("hit", "hitwall", "hitbullet"): + self.resolution[(ev["round"], ev["owner"], ev["bullet"])] = ev["type"] + + # -- attribution ------------------------------------------------------ + def _match(self, t, side, ev): + r, r1 = self.by_tick.get(t), self.by_tick.get(t + 1) + if r is None or r1 is None: + return False + if abs(r[side + "x"] - ev["x"]) > 0.02 or abs(r[side + "y"] - ev["y"]) > 0.02: + return False + ef = "ee" if side == "e" else "se" + return abs((r[ef] - r1[ef]) - ev["power"]) < 0.02 + + def _resolve_owner_side(self): + """Tank-Royale owner id -> 'e' (DrussGT, the subject) or 's' (us). + + The id is NOT stable across runs (bot start order varies), so it is + recovered per battle: a fire event's (x,y) is the firing bot's own + position and that bot's energy drops by exactly the power one tick + later. Cross-checked against the death events (see main()).""" + votes = collections.defaultdict(collections.Counter) + for ev in self.events: + if ev.get("type") != "fire": + continue + guess = self.start.get(ev["round"], 0) + ev["tick"] + for t in range(guess - 8, guess + 9): + for side in ("e", "s"): + if self._match(t, side, ev): + votes[ev["owner"]][side] += 1 + return {o: c.most_common(1)[0][0] for o, c in votes.items() if c} + + def align(self, ev): + guess = self.start.get(ev["round"], 0) + ev["tick"] + side = self.owner_side.get(ev["owner"]) + best = None + for t in range(guess - 8, guess + 9): + for sd in (("e", "s") if side is None else (side,)): + if self._match(t, sd, ev): + d = abs(t - guess) + if best is None or d < best[0]: + best = (d, t, sd) + return None if best is None else best[1] + + # -- per-shot extraction --------------------------------------------- + def shots(self): + for ev in self.events: + if ev.get("type") != "fire" or self.owner_side.get(ev["owner"]) != "s": + continue + t0 = self.align(ev) + if t0 is None: + continue + s = self._shot(ev, t0) + if s is not None: + yield s + + def _shot(self, ev, t0): + r0 = self.by_tick[t0] + p = ev["power"] + th = math.radians(ev["dir"]) + ux, uy = math.cos(th), math.sin(th) + x0, y0 = ev["x"], ev["y"] + rnd = ev["round"] + end = self.start[rnd] + self.count[rnd] + + rng = math.hypot(r0["ex"] - x0, r0["ey"] - y0) + # per-tick geometry along/perpendicular to the aim line, up to the round + # end (capped); kept so the permutation null can re-derive the arrival. + along, perp, rows = [], [], [] + karr = None + perp_arr = None + MIN_V = SPEED_A - SPEED_B * PWR_EDGES[-2] # slowest bullet the null can make + for k in range(1, MAX_FLIGHT + 1): + if t0 + k >= end: + break + r = self.by_tick.get(t0 + k) + if r is None: + break + dx, dy = r["ex"] - x0, r["ey"] - y0 + along.append(dx * ux + dy * uy) + perp.append(dx * uy - dy * ux) + rows.append(r) + if karr is None and along[-1] > 0 and (SPEED_A - SPEED_B * p) * k >= along[-1]: + karr, perp_arr = k, perp[-1] + # stop once the real arrival is known, the null's slower arrival could + # still land, and the control window has been collected + if karr is not None and k >= CTRL_OFF + FIXED_WIN and MIN_V * k > along[-1]: + break + if karr is None: + return None + + kmax = len(along) + g0 = (r0["ex"] - x0) * uy - (r0["ey"] - y0) * ux + + # (b) fixed 12-tick window + lat_fixed = None + if kmax >= FIXED_WIN: + lat_fixed = perp[FIXED_WIN - 1] - g0 + # control window (bullet long gone, same phase and range) + lat_ctrl = None + if kmax >= CTRL_OFF + FIXED_WIN: + lat_ctrl = perp[CTRL_OFF + FIXED_WIN - 1] - perp[CTRL_OFF - 1] + + # (c) response latency + h0 = r0["eh"] + lat = None + for i in range(karr): + if wrap180(rows[i]["eh"] - h0) > LAT_DEG: + lat = i + 1 + break + + def kin(lo, n): + """mean |turn rate| and mean |speed| over ticks [lo+1, lo+n].""" + if lo > len(rows): + return None, None + tt, hh = [], [] + prev = r0 if lo == 0 else rows[lo - 1] + for j in range(lo, min(lo + n, kmax)): + r = rows[j] + tt.append(wrap180(r["eh"] - prev["eh"])) + hh.append(abs(r["es"])) + prev = r + if not tt: + return None, None + return mean(tt), mean(hh) + + tr_f, sp_f = kin(0, karr) + tr_x, sp_x = kin(0, FIXED_WIN) + tr_c, sp_c = kin(CTRL_OFF, FIXED_WIN) + kind = self.resolution.get((rnd, ev["owner"], ev["bullet"])) + + return dict( + run=self.cap_path, rnd=rnd, tick=t0, power=p, speed=SPEED_A - SPEED_B * p, + range=rng, band=band_of(rng), flight=karr, + perp_fire=g0, perp_arr=perp_arr, miss=abs(perp_arr), + miss_per_tick=abs(perp_arr) / karr, + lat_disp=perp_arr - g0, lat_disp_abs=abs(perp_arr - g0), + lat_disp_per_tick=abs(perp_arr - g0) / karr, + lat_fixed=lat_fixed, lat_fixed_abs=None if lat_fixed is None else abs(lat_fixed), + lat_ctrl=lat_ctrl, lat_ctrl_abs=None if lat_ctrl is None else abs(lat_ctrl), + dodge_further=1.0 if abs(perp_arr) > abs(g0) else 0.0, + sign_consist=1.0 if (perp_arr - g0) * perp_arr > 0 else 0.0, + latency=lat, turn_flight=tr_f, speed_flight=sp_f, + turn_fixed=tr_x, speed_fixed=sp_x, + turn_ctrl=tr_c, speed_ctrl=sp_c, + resolution=kind, hit=1.0 if kind == "hit" else 0.0, + our_energy=r0["se"], enemy_energy=r0["ee"], + _dir=ev["dir"], _x=x0, _y=y0, _along=along, _perp=perp, + ) + + @staticmethod + def _arrival(along, perp, v): + for k in range(1, len(along) + 1): + if along[k - 1] > 0 and v * k >= along[k - 1]: + return k, perp[k - 1] + return None + + +def discover_tfil(root): + runs = [] + for sub in sorted(os.listdir(root)): + d = os.path.join(root, sub) + if not os.path.isdir(d): + continue + for fn in sorted(os.listdir(d)): + if not fn.endswith(".jsonl") or fn.endswith(".events.jsonl"): + continue + cap = os.path.join(d, fn) + ev, rj = cap[:-6] + ".events.jsonl", cap + ".rounds.json" + if os.path.exists(ev) and os.path.exists(rj): + runs.append(Run(cap, ev, rj)) + return runs + + +def discover_powtest(root, arms=None): + runs = [] + for fn in sorted(os.listdir(root)): + if not (fn.startswith("cap_") and fn.endswith(".jsonl")): + continue + arm = fn[4:].split("_r")[0] + if arms and arm not in arms: + continue + cap = os.path.join(root, fn) + ev = os.path.join(root, "events_" + fn[4:].replace(".jsonl", ".json")) + rj = cap + ".rounds.json" + if os.path.exists(ev) and os.path.exists(rj): + runs.append(Run(cap, ev, rj)) + return runs + + +# --------------------------------------------------------------- statistics +def cell_stats(shots, key, only=None): + """{(band, pbin): (n, mean, sd)}""" + acc = collections.defaultdict(list) + for s in shots: + if only and not only(s): + continue + v = s.get(key) + if v is None: + continue + i = pbin(s["power"]) + if i is None: + continue + acc[(s["band"], i)].append(v) + return {k: (len(v), mean(v), statistics.pstdev(v) if len(v) > 1 else 0.0) + for k, v in acc.items()} + + +def perm_key(s, p): + """Re-derive the arrival-dependent metrics for a substituted power.""" + v = SPEED_A - SPEED_B * p + arr = Run._arrival(s["_along"], s["_perp"], v) + if arr is None: + return None + k, pe = arr + return {"power": p, "flight": k, "miss": abs(pe), + "miss_per_tick": abs(pe) / k, + "lat_disp_abs": abs(pe - s["perp_fire"]), + "lat_disp_per_tick": abs(pe - s["perp_fire"]) / k} + + +ARRIVAL_METRICS = ("miss", "lat_disp_abs", "flight", "miss_per_tick", + "lat_disp_per_tick") + + +def perm_contrast_null(shots, key, reps, seed=4242): + """Per range band, the permutation null of delta = mean(HIGH) - mean(LOW). + + For the arrival-dependent metrics each shot carries TWO precomputed values: + the metric it would have had at a typical LOW power and at a typical HIGH + power of that band (arrival tick re-derived, so the kinematic channel is + preserved). The null then draws a random subset of n_high shots to be the + HIGH arm -- which is exactly a permutation of the power values among the + shots of the band. Metrics that do not depend mechanically on power get the + same value in both arms, i.e. a plain label permutation. + + Returns {band: (observed delta, null sd, two-sided p)}. + """ + rng = random.Random(seed) + by_band = collections.defaultdict(list) + for s in shots: + if grp(s) is not None and s.get(key) is not None: + by_band[s["band"]].append(s) + out = {} + for b, ss in by_band.items(): + lo = [s for s in ss if grp(s) == "LOW"] + hi = [s for s in ss if grp(s) == "HIGH"] + if len(lo) < 15 or len(hi) < 15: + continue + p_lo = mean([s["power"] for s in lo]) + p_hi = mean([s["power"] for s in hi]) + if key in ARRIVAL_METRICS: + def val(s, p): + d = perm_key(s, p) + return None if d is None else d[key] + lows = [val(s, p_lo) for s in ss] + highs = [val(s, p_hi) for s in ss] + keep = [i for i in range(len(ss)) if lows[i] is not None and highs[i] is not None] + lows = [lows[i] for i in keep] + highs = [highs[i] for i in keep] + tag = [1 if grp(ss[i]) == "HIGH" else 0 for i in keep] + obs = (mean([highs[j] for j in range(len(keep)) if tag[j] == 1]) + - mean([lows[j] for j in range(len(keep)) if tag[j] == 0])) + else: + vals = [s[key] for s in ss] + lows = highs = vals + tag = [1 if grp(s) == "HIGH" else 0 for s in ss] + obs = mean([v for v, t in zip(vals, tag) if t == 1]) - \ + mean([v for v, t in zip(vals, tag) if t == 0]) + n = len(keep) if key in ARRIVAL_METRICS else len(ss) + k = sum(tag) + deltas = [] + for _ in range(reps): + idx = list(range(n)) + rng.shuffle(idx) + sel = set(idx[:k]) + if key in ARRIVAL_METRICS: + deltas.append(mean([highs[j] for j in sel]) - + mean([lows[j] for j in range(n) if j not in sel])) + else: + deltas.append(mean([lows[j] for j in sel]) - + mean([lows[j] for j in range(n) if j not in sel])) + p_hi_ = (sum(1 for x in deltas if x >= obs) + 1) / (reps + 1) + p_lo_ = (sum(1 for x in deltas if x <= obs) + 1) / (reps + 1) + out[b] = (obs, statistics.pstdev(deltas), min(1.0, 2 * min(p_hi_, p_lo_))) + return out + + +def fixed_horizon(shots, ks=(5, 10, 15, 20, 25, 30)): + """The confound-free test. + + Instead of the arrival tick (which power itself moves, and which also depends + on DrussGT's radial velocity), measure |perpendicular offset from the aim + line| at a FIXED number of ticks after the fire, and the same quantity in the + CONTROL window CTRL_OFF ticks later (bullet long gone). A response to the + shot would be ~0 at small k and grow with k. A phase/distance difference is + present already at k=5 and identical in the bullet-free control window. + Returns {band: {k: (low, high, nlow, nhigh, ctrl_low, ctrl_high)}}.""" + out = {} + for b in BAND_LABELS: + ss = [s for s in shots if s["band"] == b and grp(s) is not None] + if len(ss) < 200: + continue + for k in ks: + lo = [abs(s["_perp"][k - 1]) for s in ss + if grp(s) == "LOW" and len(s["_perp"]) >= k] + hi = [abs(s["_perp"][k - 1]) for s in ss + if grp(s) == "HIGH" and len(s["_perp"]) >= k] + cl = [abs(s["_perp"][k + CTRL_OFF - 1]) for s in ss + if grp(s) == "LOW" and len(s["_perp"]) >= k + CTRL_OFF] + ch = [abs(s["_perp"][k + CTRL_OFF - 1]) for s in ss + if grp(s) == "HIGH" and len(s["_perp"]) >= k + CTRL_OFF] + out.setdefault(b, {})[k] = (mean(lo), mean(hi), len(lo), len(hi), + mean(cl), mean(ch)) + return out + + +def flight_matched(shots): + _doc_extra = None + """The kinematic channel removed outright. + + Two matching variables at once, because they are both mechanical and both + differ between the arms: (i) the flight window itself (v = 20-3p, so a slower + bullet flies longer and DrussGT drifts further off the line) and (ii) the fire + RANGE inside the band (at a fixed flight window, a slower bullet implies a + shorter range, and the gun's aim error grows with range). Cells are + (integer flight window, 50 px range sub-bin) and only cells with >= MIN_CELL + shots in BOTH arms contribute; the per-cell differences are pooled with n + weights. Anything left here is not a flight-time or a range artefact. + Returns {band: (delta, n_used, cells, null_sd, p)}. + """ + MIN_CELL = 8 + out = {} + for b in BAND_LABELS: + ss = [s for s in shots if s["band"] == b and grp(s) is not None] + by = collections.defaultdict(lambda: {"LOW": [], "HIGH": []}) + for s in ss: + by[(s["flight"], int(s["range"] // RANGE_MATCH_PX))][grp(s)].append(s) + pairs = [(fl, d) for fl, d in by.items() + if len(d["LOW"]) >= MIN_CELL and len(d["HIGH"]) >= MIN_CELL] + if not pairs: + continue + num = den = 0.0 + for fl, d in pairs: + w = len(d["LOW"]) + len(d["HIGH"]) + num += w * (mean([s["miss"] for s in d["HIGH"]]) + - mean([s["miss"] for s in d["LOW"]])) + den += w + cells = [(fl, d["LOW"], d["HIGH"]) for fl, d in pairs] + out[b] = (num / den, int(den), len(pairs), cells) + return out + + +def flight_matched_null(shots, reps=400, seed=808): + """Permutation null of the flight-matched contrast (labels shuffled inside + each band, so the flight bins and their sizes are preserved).""" + rng = random.Random(seed) + res = {} + for b in BAND_LABELS: + ss = [s for s in shots if s["band"] == b and grp(s) is not None] + if not ss: + continue + vals = [s["miss"] for s in ss] + fls = [s["flight"] for s in ss] + tag = [grp(s) == "HIGH" for s in ss] + n = len(ss) + k = sum(tag) + if k < 20 or n - k < 20: + continue + rgs = [s["range"] for s in ss] + bins = collections.defaultdict(list) + for i in range(n): + bins[(fls[i], int(rgs[i] // RANGE_MATCH_PX))].append(i) + pool = [ix for ix in bins.values() if len(ix) >= 16] + if not pool: + continue + ds = [] + for _ in range(reps): + perm = tag[:] + # shuffle labels within flight bin (preserves the bin sizes and the + # flight distribution of both arms) + for ix in pool: + sub = [perm[i] for i in ix] + rng.shuffle(sub) + for i, t in zip(ix, sub): + perm[i] = t + num = den = 0.0 + for ix in pool: + a = [vals[i] for i in ix if not perm[i]] + c = [vals[i] for i in ix if perm[i]] + if len(a) >= 8 and len(c) >= 8: + num += (len(a) + len(c)) * (mean(c) - mean(a)) + den += len(a) + len(c) + if den: + ds.append(num / den) + obs_num = obs_den = 0.0 + for ix in pool: + a = [vals[i] for i in ix if not tag[i]] + c = [vals[i] for i in ix if tag[i]] + if len(a) >= 8 and len(c) >= 8: + obs_num += (len(a) + len(c)) * (mean(c) - mean(a)) + obs_den += len(a) + len(c) + if ds and obs_den: + obs = obs_num / obs_den + p_hi = (sum(1 for x in ds if x >= obs) + 1) / (len(ds) + 1) + p_lo = (sum(1 for x in ds if x <= obs) + 1) / (len(ds) + 1) + res[b] = (obs, obs_den, statistics.pstdev(ds), + min(1.0, 2 * min(p_hi, p_lo))) + return res + + +def grp(s): + return "LOW" if 0.5 <= s["power"] < 0.75 else ( + "HIGH" if 1.0 <= s["power"] < 1.5 else None) + + +def cluster_boot(shots, key, group_fn, reps=2000, seed=99): + """Round-cluster bootstrap over the per-run aggregates of `key` by group.""" + by_run = collections.defaultdict(list) + for s in shots: + if s.get(key) is not None: + by_run[s["run"]].append(s) + runs = list(by_run) + # pre-aggregate per run per group + agg = {} + for r in runs: + g = collections.defaultdict(lambda: [0.0, 0]) + for s in by_run[r]: + grp = group_fn(s) + if grp is None: + continue + g[grp][0] += s[key] + g[grp][1] += 1 + agg[r] = {k: (v[0], v[1]) for k, v in g.items()} + rng = random.Random(seed) + out = collections.defaultdict(list) + for _ in range(reps): + tot = collections.defaultdict(lambda: [0.0, 0]) + for _ in runs: + r = rng.choice(runs) + for k, (s_, c_) in agg[r].items(): + tot[k][0] += s_ + tot[k][1] += c_ + for k, (s_, c_) in tot.items(): + if c_: + out[k].append(s_ / c_) + return {k: (pct(v, .025), pct(v, .975)) for k, v in out.items()} + + +# --------------------------------------------------------------------- report +def report(name, runs, shots, reps, out): + print("=" * 104) + print("CORPUS %-10s %d battles %d rounds %d usable shots by US (ModularBot)" + % (name, len(runs), sum(len(r.rounds) for r in runs), len(shots))) + + # ---- attribution cross-check against the death events + bad = tot = 0 + for r in runs: + for ev in r.events: + if ev.get("type") != "death": + continue + end = r.start[ev["round"]] + r.count[ev["round"]] - 1 + row = r.by_tick.get(end) + if row is None: + continue + tot += 1 + vs = r.owner_side.get(ev["victim"]) + if (vs == "e" and row["ee"] > 1.0) or (vs == "s" and row["se"] > 1.0): + bad += 1 + print(" attribution: owner id -> {e=DrussGT, s=us} recovered per battle from fire" + " geometry+energy;\n cross-checked on the death events: %d/%d" + " deaths have the mapped victim at ~0 energy" % (tot - bad, tot)) + print(" (attribution is per-battle because the Tank Royale owner id is not stable" + " across runs)") + + # ---- the confounder, made visible + print("\n >> THE CONFOUNDER IS REAL: our fired power is a range + energy cap") + print(" %-9s %-11s %7s %8s %9s %9s %9s" % + ("band", "power", "shots", "firePx", "ourE", "enemyE", "flight")) + for b in BAND_LABELS: + for i in range(len(PWR_EDGES) - 1): + ss = [s for s in shots if s["band"] == b and pbin(s["power"]) == i] + if len(ss) < 5: + continue + print(" %-9s %-11s %7d %8.1f %9.1f %9.1f %9.2f" % ( + b, PWR_LABELS[i], len(ss), mean([s["range"] for s in ss]), + mean([s["our_energy"] for s in ss]), + mean([s["enemy_energy"] for s in ss]), + mean([s["flight"] for s in ss]))) + + RES = out + for key, title in ( + ("miss", "(a) MISS AT ARRIVAL px - perpendicular offset of DrussGT from our aim line"), + ("miss_per_tick", "(a') MISS AT ARRIVAL / flight ticks (px per tick - power-neutral)"), + ("lat_disp_abs", "(b) LATERAL DISPLACEMENT px over the flight window"), + ("lat_disp_per_tick", "(b/ ) LATERAL DISPLACEMENT / flight ticks" + " (px per tick - power-neutral)"), + ("lat_fixed_abs", "(b') LATERAL DISPLACEMENT px over a FIXED 12-tick window" + " (power-neutral)"), + ("lat_ctrl_abs", "(b'') CONTROL: lateral displacement px, SAME shot, 40 ticks later" + " (bullet gone)"), + ("flight", "(f) FLIGHT WINDOW LENGTH ticks (low power = FASTER bullet = shorter)"), + ("latency", "(c) RESPONSE LATENCY ticks to a >%g deg heading turn" % LAT_DEG), + ("turn_flight", "(d) MEAN TURN RATE deg/tick, flight window"), + ("turn_fixed", "(d') MEAN TURN RATE deg/tick, fixed 12-tick window"), + ("turn_ctrl", "(d'') CONTROL: mean turn rate deg/tick, 40 ticks later"), + ("speed_flight", "(d) MEAN SPEED px/tick, flight window"), + ("speed_ctrl", "(d'') CONTROL: mean speed px/tick, 40 ticks later"), + ("dodge_further", "(e) fraction where |perp| GREW (moved further off the line)"), + ("hit", "OUTCOME hit rate (real server events)"), + ): + cs = cell_stats(shots, key) + print("\n %s" % title) + print(" %-9s" % "band" + "".join("%22s" % l for l in PWR_LABELS)) + for b in BAND_LABELS: + cells, ns = [], [] + for i in range(len(PWR_EDGES) - 1): + n, m, sd = cs.get((b, i), (0, float("nan"), 0.0)) + cells.append(m) + ns.append(n) + RES.setdefault("tables", {}).setdefault(key, {}).setdefault(b, {})[ + PWR_LABELS[i]] = {"n": n, "mean": None if n == 0 else m, "sd": sd} + print(" %-9s" % b + "".join( + "%22s" % ("%.2f" % c if c == c else "-") for c in cells)) + print(" %-9s" % "" + "".join("%22s" % ("n=%d" % n) for n in ns)) + + # ---- shuffled-label null, per band, on the LOW-vs-HIGH contrast + print("\n" + "-" * 104) + print("SHUFFLED-LABEL NULL (labels permuted WITHIN each range band, %d reps)" % reps) + print(" For the arrival-dependent metrics the arrival tick is RE-DERIVED from the" + " permuted power,\n so the null keeps the kinematic channel (a slower bullet" + " really does arrive later) and destroys\n only the response. p is the two-sided" + " permutation p on delta = mean(HIGH) - mean(LOW) inside that band.") + RES["perm"] = {} + for key in ("miss", "miss_per_tick", "lat_disp_abs", "flight", + "lat_fixed_abs", "lat_ctrl_abs", "latency", "turn_fixed", "turn_ctrl", + "speed_fixed", "hit"): + print(" %-16s" % key, end="") + cells = perm_contrast_null(shots, key, reps) + RES["perm"][key] = {} + for b in BAND_LABELS: + if b in cells: + d, sd, p2 = cells[b] + print(" %s d=%+.3f(null sd=%.3f,p=%.3f)" % (b, d, sd, p2), end="") + RES["perm"][key][b] = {"delta": d, "null_sd": sd, "p_two": p2} + else: + print(" %s n/a" % b, end="") + print() + + # ---- the decisive fixed-horizon / control-window test + print("\n" + "-" * 104) + print("FIXED-HORIZON TEST (no arrival tick, no flight-window confound)") + print(" |perpendicular offset of DrussGT from our aim line| at k ticks after the fire" + " (flight window),\n and the same quantity in the CONTROL window at k+%d ticks," + " when the bullet is long gone.\n A response to our shot would be ~0 at k=5 and" + " grow with k; a phase/geometry difference is\n present at k=5 and identical in" + " the control." % CTRL_OFF) + fh = fixed_horizon(shots) + RES["fixed_horizon"] = {} + for b in BAND_LABELS: + if b not in fh: + continue + print(" band %s (nLOW=%d nHIGH=%d per k)" % (b, fh[b][5][2], fh[b][5][3])) + for k, (lo, hi, nlo, nhi, cl, ch) in sorted(fh[b].items()): + print(" k=%2d flight: LOW=%7.1f HIGH=%7.1f d=%+6.2f | control(+%d):" + " LOW=%7.1f HIGH=%7.1f d=%+6.2f" + % (k, lo, hi, hi - lo, CTRL_OFF, cl, ch, ch - cl)) + RES["fixed_horizon"].setdefault(b, {})[k] = { + "low": lo, "high": hi, "delta": hi - lo, "n_low": nlo, "n_high": nhi, + "ctrl_low": cl, "ctrl_high": ch, "ctrl_delta": ch - cl} + + # ---- flight-matched contrast: the kinematic channel removed + print("\n" + "-" * 104) + print("FLIGHT- *AND* RANGE-MATCHED CONTRAST (kinematics and range both removed)") + print(" Within each range band we compare LOW vs HIGH power only inside the SAME cell" + " = (integer\n flight window, 50 px range sub-bin), pooling the per-cell differences" + " with n weights. A longer\n window lets DrussGT drift further off the line; at a" + " fixed window a slower bullet implies a\n shorter range and the gun's aim error" + " grows with range. Anything left here is neither.") + fm = flight_matched(shots) + fnull = flight_matched_null(shots, reps) + print(" %-9s %8s %8s %8s | %10s %8s %8s" % + ("band", "obs d", "n used", "bins", "null sd", "p_two", "")) + RES["flight_matched"] = {} + for b in BAND_LABELS: + if b in fnull: + obs, nused, sd, p2 = fnull[b] + print(" %-9s %+8.2f %8d %8d | %10.2f %8.3f" + % (b, obs, nused, fm.get(b, (0, 0, 0, []))[2], sd, p2)) + RES["flight_matched"][b] = {"delta": obs, "n": nused, "null_sd": sd, + "p_two": p2} + + # ---- the headline within-band contrast: LOW (0.50-0.75) vs HIGH (1.00-1.50) + print("\n" + "-" * 104) + print("HEADLINE WITHIN-BAND CONTRAST LOW p in [0.50,0.75) vs HIGH p in [1.00,1.50)") + print(" (HELD fixed inside each range band; 95%% CI from a ROUND-cluster bootstrap)" + "\n") + + hdr = (" %-14s %-9s %7s %7s | %8s %8s %8s %8s" % + ("metric", "band", "nLOW", "nHIGH", "LOW", "HIGH", "delta", "95% CI")) + for key in ("miss", "miss_per_tick", "lat_disp_abs", "lat_disp_per_tick", + "lat_fixed_abs", "lat_ctrl_abs", "flight", "latency", "turn_flight", + "turn_fixed", "turn_ctrl", "speed_flight", "speed_ctrl", "hit"): + print(hdr) + for b in BAND_LABELS: + ss = [s for s in shots if s["band"] == b and grp(s) and s.get(key) is not None] + lo = [s[key] for s in ss if grp(s) == "LOW"] + hi = [s[key] for s in ss if grp(s) == "HIGH"] + if len(lo) < 15 or len(hi) < 15: + print(" %-14s %-9s %7d %7d | (too few for a contrast)" % + (key, b, len(lo), len(hi))) + RES.setdefault("contrast", {}).setdefault(key, {})[b] = { + "n_low": len(lo), "n_high": len(hi)} + continue + ci = cluster_boot(ss, key, grp) + d = mean(hi) - mean(lo) + print(" %-14s %-9s %7d %7d | %8.2f %8.2f %+8.2f [%+.2f,%+.2f]" % ( + key, b, len(lo), len(hi), mean(lo), mean(hi), d, + ci.get("HIGH", (float("nan"),) * 2)[0] - ci.get("LOW", (0, 0))[1], + ci.get("HIGH", (0, 0))[1] - ci.get("LOW", (float("nan"),) * 2)[0])) + RES.setdefault("contrast", {}).setdefault(key, {})[b] = { + "n_low": len(lo), "n_high": len(hi), "low": mean(lo), "high": mean(hi), + "delta": d, + "ci_lo": ci.get("HIGH", (float("nan"),) * 2)[0] - ci.get("LOW", (0, 0))[1], + "ci_hi": ci.get("HIGH", (0, 0))[1] - ci.get("LOW", (float("nan"),) * 2)[0]} + print() + + # ---- power histogram of OUR shots, for the record + h = collections.Counter(round(s["power"], 2) for s in shots) + print(" OUR fired-power histogram (exact values, top 12):") + print(" " + " ".join("%.2f:%d" % (p, n) for p, n in h.most_common(12))) + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--tfil", default=None) + ap.add_argument("--powtest", default=None) + ap.add_argument("--json", default=None) + ap.add_argument("--reps", type=int, default=800) + a = ap.parse_args() + out = {} + for name, runs in (("tfil_ab2", discover_tfil(a.tfil) if a.tfil else []), + ("powtest", discover_powtest(a.powtest) if a.powtest else [])): + if not runs: + continue + shots = [s for r in runs for s in r.shots()] + out[name] = {"battles": len(runs), "shots": len(shots)} + report(name, runs, shots, a.reps, out[name]) + if a.json: + with open(a.json, "w") as f: + json.dump(out, f, indent=1, sort_keys=True) + return out + + +if __name__ == "__main__": + main() diff --git a/common_libs/tests/fixtures/dodge_vs_power_report.txt b/common_libs/tests/fixtures/dodge_vs_power_report.txt new file mode 100644 index 0000000..eeb01e8 --- /dev/null +++ b/common_libs/tests/fixtures/dodge_vs_power_report.txt @@ -0,0 +1,760 @@ +======================================================================================================== +CORPUS tfil_ab2 70 battles 490 rounds 54939 usable shots by US (ModularBot) + attribution: owner id -> {e=DrussGT, s=us} recovered per battle from fire geometry+energy; + cross-checked on the death events: 496/496 deaths have the mapped victim at ~0 energy + (attribution is per-battle because the Tank Royale owner id is not stable across runs) + + >> THE CONFOUNDER IS REAL: our fired power is a range + energy cap + band power shots firePx ourE enemyE flight + 0-100 0.50-0.75 6 82.7 15.5 16.8 6.50 + 0-100 >=1.50 19 80.3 63.7 57.0 10.89 + 100-200 <0.50 5 160.9 8.6 0.6 10.00 + 100-200 0.50-0.75 53 165.8 13.2 18.8 10.42 + 100-200 0.75-1.00 5 177.3 29.0 33.7 11.00 + 100-200 1.00-1.50 23 168.4 85.0 83.1 11.87 + 100-200 >=1.50 191 158.7 75.8 71.0 14.86 + 200-300 <0.50 6 257.0 99.7 99.8 15.33 + 200-300 0.50-0.75 130 266.8 12.7 20.0 15.28 + 200-300 0.75-1.00 21 262.7 28.8 26.7 16.14 + 200-300 1.00-1.50 780 261.2 83.6 81.5 16.86 + 200-300 >=1.50 56 248.4 32.0 15.7 21.95 + 300-450 <0.50 333 409.1 14.5 1.9 20.96 + 300-450 0.50-0.75 5272 411.3 13.8 19.2 22.36 + 300-450 0.75-1.00 880 407.7 29.0 28.5 23.49 + 300-450 1.00-1.50 10696 402.0 69.2 62.6 23.70 + 450+ <0.50 950 537.0 14.2 1.1 27.03 + 450+ 0.50-0.75 12960 536.1 13.7 18.6 28.38 + 450+ 0.75-1.00 2424 540.4 28.8 26.4 30.18 + 450+ 1.00-1.50 20126 534.2 63.0 53.8 30.52 + + (a) MISS AT ARRIVAL px - perpendicular offset of DrussGT from our aim line + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - 23.96 - 32.97 37.21 + n=0 n=6 n=0 n=2 n=19 + 100-200 46.00 43.03 33.87 47.92 59.00 + n=5 n=53 n=5 n=23 n=191 + 200-300 53.19 74.31 79.82 74.72 113.81 + n=6 n=130 n=21 n=780 n=56 + 300-450 112.84 104.67 109.32 110.55 177.09 + n=333 n=5272 n=880 n=10696 n=1 + 450+ 130.86 124.01 132.35 132.26 - + n=950 n=12960 n=2424 n=20126 n=0 + + (a') MISS AT ARRIVAL / flight ticks (px per tick - power-neutral) + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - 3.72 - 4.85 3.61 + n=0 n=6 n=0 n=2 n=19 + 100-200 4.77 4.45 3.32 4.05 4.37 + n=5 n=53 n=5 n=23 n=191 + 200-300 3.41 5.01 5.18 4.67 5.47 + n=6 n=130 n=21 n=780 n=56 + 300-450 5.52 4.85 4.85 4.88 9.84 + n=333 n=5272 n=880 n=10696 n=1 + 450+ 4.97 4.52 4.55 4.51 - + n=950 n=12960 n=2424 n=20126 n=0 + + (b) LATERAL DISPLACEMENT px over the flight window + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - 30.64 - 42.81 47.99 + n=0 n=6 n=0 n=2 n=19 + 100-200 46.73 37.57 45.85 56.50 64.60 + n=5 n=53 n=5 n=23 n=191 + 200-300 79.80 59.91 58.51 71.56 103.43 + n=6 n=130 n=21 n=780 n=56 + 300-450 62.79 88.47 94.34 91.94 57.29 + n=333 n=5272 n=880 n=10696 n=1 + 450+ 78.40 97.42 102.03 103.30 - + n=950 n=12960 n=2424 n=20126 n=0 + + (b/ ) LATERAL DISPLACEMENT / flight ticks (px per tick - power-neutral) + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - 4.66 - 6.54 4.54 + n=0 n=6 n=0 n=2 n=19 + 100-200 4.38 3.44 3.77 4.76 4.22 + n=5 n=53 n=5 n=23 n=191 + 200-300 5.13 3.79 3.45 4.12 4.75 + n=6 n=130 n=21 n=780 n=56 + 300-450 2.96 3.94 4.00 3.86 3.18 + n=333 n=5272 n=880 n=10696 n=1 + 450+ 2.90 3.47 3.41 3.42 - + n=950 n=12960 n=2424 n=20126 n=0 + + (b') LATERAL DISPLACEMENT px over a FIXED 12-tick window (power-neutral) + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - 59.58 - 85.08 55.36 + n=0 n=6 n=0 n=2 n=19 + 100-200 56.15 43.26 46.77 59.47 51.69 + n=5 n=52 n=5 n=23 n=188 + 200-300 64.29 47.20 40.99 50.09 54.53 + n=6 n=130 n=21 n=780 n=56 + 300-450 42.81 54.20 54.14 52.75 38.69 + n=333 n=5272 n=880 n=10696 n=1 + 450+ 45.56 55.63 54.97 55.47 - + n=950 n=12960 n=2424 n=20126 n=0 + + (b'') CONTROL: lateral displacement px, SAME shot, 40 ticks later (bullet gone) + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - 47.22 - 59.18 54.33 + n=0 n=5 n=0 n=2 n=15 + 100-200 46.20 46.92 12.30 50.59 45.10 + n=2 n=41 n=5 n=23 n=170 + 200-300 56.80 43.68 49.06 49.21 41.62 + n=6 n=127 n=21 n=780 n=32 + 300-450 37.42 52.80 53.83 51.95 61.95 + n=265 n=5155 n=877 n=10695 n=1 + 450+ 42.34 52.03 52.53 52.64 - + n=821 n=12828 n=2421 n=20120 n=0 + + (f) FLIGHT WINDOW LENGTH ticks (low power = FASTER bullet = shorter) + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - 6.50 - 6.50 10.89 + n=0 n=6 n=0 n=2 n=19 + 100-200 10.00 10.42 11.00 11.87 14.86 + n=5 n=53 n=5 n=23 n=191 + 200-300 15.33 15.28 16.14 16.86 21.95 + n=6 n=130 n=21 n=780 n=56 + 300-450 20.96 22.36 23.49 23.70 18.00 + n=333 n=5272 n=880 n=10696 n=1 + 450+ 27.03 28.38 30.18 30.52 - + n=950 n=12960 n=2424 n=20126 n=0 + + (c) RESPONSE LATENCY ticks to a >15 deg heading turn + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - 4.20 - 4.00 5.67 + n=0 n=5 n=0 n=2 n=15 + 100-200 6.25 6.34 5.50 6.44 7.00 + n=4 n=29 n=2 n=16 n=148 + 200-300 8.33 9.03 10.00 7.68 9.27 + n=6 n=78 n=11 n=566 n=49 + 300-450 10.99 11.55 11.84 11.46 2.00 + n=149 n=2968 n=525 n=6860 n=1 + 450+ 13.37 13.60 14.57 14.27 - + n=559 n=8682 n=1745 n=13884 n=0 + + (d) MEAN TURN RATE deg/tick, flight window + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - 2.83 - 3.89 3.48 + n=0 n=6 n=0 n=2 n=19 + 100-200 3.77 2.01 3.39 2.86 2.78 + n=5 n=53 n=5 n=23 n=191 + 200-300 3.55 2.08 1.72 2.49 2.07 + n=6 n=130 n=21 n=780 n=56 + 300-450 1.30 1.48 1.48 1.61 3.30 + n=333 n=5272 n=880 n=10696 n=1 + 450+ 1.37 1.49 1.51 1.46 - + n=950 n=12960 n=2424 n=20126 n=0 + + (d') MEAN TURN RATE deg/tick, fixed 12-tick window + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - 2.54 - 2.91 3.43 + n=0 n=6 n=0 n=2 n=19 + 100-200 3.64 2.09 3.37 2.66 2.64 + n=5 n=53 n=5 n=23 n=191 + 200-300 3.22 1.91 1.45 2.22 2.03 + n=6 n=130 n=21 n=780 n=56 + 300-450 1.33 1.46 1.45 1.50 2.78 + n=333 n=5272 n=880 n=10696 n=1 + 450+ 1.36 1.43 1.46 1.28 - + n=950 n=12960 n=2424 n=20126 n=0 + + (d'') CONTROL: mean turn rate deg/tick, 40 ticks later + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - 3.07 - 2.91 3.18 + n=0 n=5 n=0 n=2 n=15 + 100-200 2.93 2.20 2.61 3.04 2.61 + n=3 n=44 n=5 n=23 n=174 + 200-300 2.80 1.78 1.35 2.19 3.17 + n=6 n=127 n=21 n=780 n=37 + 300-450 1.31 1.44 1.38 1.57 2.99 + n=295 n=5211 n=878 n=10696 n=1 + 450+ 1.30 1.52 1.54 1.58 - + n=886 n=12902 n=2423 n=20126 n=0 + + (d) MEAN SPEED px/tick, flight window + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - 7.39 - 8.00 7.45 + n=0 n=6 n=0 n=2 n=19 + 100-200 5.73 6.05 4.83 6.05 5.87 + n=5 n=53 n=5 n=23 n=191 + 200-300 6.18 5.39 5.64 5.44 6.20 + n=6 n=130 n=21 n=780 n=56 + 300-450 5.41 5.49 5.53 5.49 3.94 + n=333 n=5272 n=880 n=10696 n=1 + 450+ 5.37 5.46 5.44 5.48 - + n=950 n=12960 n=2424 n=20126 n=0 + + (d'') CONTROL: mean speed px/tick, 40 ticks later + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - 6.07 - 6.23 6.33 + n=0 n=5 n=0 n=2 n=15 + 100-200 5.23 5.84 3.45 5.86 5.73 + n=3 n=44 n=5 n=23 n=174 + 200-300 6.32 5.63 6.45 5.48 6.53 + n=6 n=127 n=21 n=780 n=37 + 300-450 5.48 5.50 5.56 5.45 5.37 + n=295 n=5211 n=878 n=10696 n=1 + 450+ 5.37 5.46 5.46 5.47 - + n=886 n=12902 n=2423 n=20126 n=0 + + (e) fraction where |perp| GREW (moved further off the line) + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - 0.50 - 0.50 0.63 + n=0 n=6 n=0 n=2 n=19 + 100-200 0.40 0.40 0.60 0.52 0.60 + n=5 n=53 n=5 n=23 n=191 + 200-300 0.50 0.54 0.52 0.59 0.77 + n=6 n=130 n=21 n=780 n=56 + 300-450 0.54 0.57 0.59 0.60 1.00 + n=333 n=5272 n=880 n=10696 n=1 + 450+ 0.56 0.59 0.60 0.61 - + n=950 n=12960 n=2424 n=20126 n=0 + + OUTCOME hit rate (real server events) + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - 0.67 - 0.50 0.32 + n=0 n=6 n=0 n=2 n=19 + 100-200 0.20 0.30 0.40 0.39 0.20 + n=5 n=53 n=5 n=23 n=191 + 200-300 0.50 0.18 0.10 0.16 0.07 + n=6 n=130 n=21 n=780 n=56 + 300-450 0.03 0.11 0.13 0.12 0.00 + n=333 n=5272 n=880 n=10696 n=1 + 450+ 0.01 0.10 0.09 0.09 - + n=950 n=12960 n=2424 n=20126 n=0 + +-------------------------------------------------------------------------------------------------------- +SHUFFLED-LABEL NULL (labels permuted WITHIN each range band, 400 reps) + For the arrival-dependent metrics the arrival tick is RE-DERIVED from the permuted power, + so the null keeps the kinematic channel (a slower bullet really does arrive later) and destroys + only the response. p is the two-sided permutation p on delta = mean(HIGH) - mean(LOW) inside that band. + miss 0-100 n/a 100-200 d=+5.354(null sd=7.077,p=0.893) 200-300 d=+0.348(null sd=4.611,p=0.389) 300-450 d=+5.913(null sd=1.285,p=0.274) 450+ d=+8.238(null sd=1.040,p=0.005) + miss_per_tick 0-100 n/a 100-200 d=-0.354(null sd=0.692,p=0.623) 200-300 d=-0.342(null sd=0.332,p=0.524) 300-450 d=+0.026(null sd=0.064,p=0.010) 450+ d=-0.008(null sd=0.040,p=0.005) + lat_disp_abs 0-100 n/a 100-200 d=+19.401(null sd=7.561,p=0.075) 200-300 d=+11.592(null sd=3.772,p=0.075) 300-450 d=+3.497(null sd=0.895,p=0.444) 450+ d=+5.865(null sd=0.679,p=0.005) + flight 0-100 n/a 100-200 d=+1.473(null sd=0.557,p=0.584) 200-300 d=+1.553(null sd=0.209,p=0.319) 300-450 d=+1.349(null sd=0.044,p=0.005) 450+ d=+2.131(null sd=0.039,p=0.015) + lat_fixed_abs 0-100 n/a 100-200 d=+16.205(null sd=6.822,p=0.020) 200-300 d=+2.890(null sd=2.739,p=0.269) 300-450 d=-1.453(null sd=0.521,p=0.005) 450+ d=-0.154(null sd=0.340,p=0.663) + lat_ctrl_abs 0-100 n/a 100-200 d=+3.671(null sd=7.943,p=0.683) 200-300 d=+5.532(null sd=2.951,p=0.095) 300-450 d=-0.846(null sd=0.492,p=0.095) 450+ d=+0.610(null sd=0.339,p=0.080) + latency 0-100 n/a 100-200 d=+0.093(null sd=1.210,p=0.898) 200-300 d=-1.349(null sd=0.628,p=0.035) 300-450 d=-0.094(null sd=0.145,p=0.484) 450+ d=+0.677(null sd=0.117,p=0.005) + turn_fixed 0-100 n/a 100-200 d=+0.574(null sd=0.406,p=0.150) 200-300 d=+0.316(null sd=0.147,p=0.040) 300-450 d=+0.034(null sd=0.021,p=0.125) 450+ d=-0.148(null sd=0.012,p=0.005) + turn_ctrl 0-100 n/a 100-200 d=+0.839(null sd=0.442,p=0.060) 200-300 d=+0.407(null sd=0.154,p=0.005) 300-450 d=+0.135(null sd=0.021,p=0.005) 450+ d=+0.064(null sd=0.014,p=0.005) + speed_fixed 0-100 n/a 100-200 d=+0.086(null sd=0.533,p=0.913) 200-300 d=+0.021(null sd=0.177,p=0.853) 300-450 d=-0.050(null sd=0.033,p=0.135) 450+ d=-0.007(null sd=0.022,p=0.758) + hit 0-100 n/a 100-200 d=+0.089(null sd=0.115,p=0.574) 200-300 d=-0.022(null sd=0.034,p=0.668) 300-450 d=+0.004(null sd=0.005,p=0.429) 450+ d=-0.013(null sd=0.003,p=0.005) + +-------------------------------------------------------------------------------------------------------- +FIXED-HORIZON TEST (no arrival tick, no flight-window confound) + |perpendicular offset of DrussGT from our aim line| at k ticks after the fire (flight window), + and the same quantity in the CONTROL window at k+40 ticks, when the bullet is long gone. + A response to our shot would be ~0 at k=5 and grow with k; a phase/geometry difference is + present at k=5 and identical in the control. + band 200-300 (nLOW=130 nHIGH=780 per k) + k= 5 flight: LOW= 55.5 HIGH= 54.0 d= -1.50 | control(+40): LOW= 132.6 HIGH= 136.8 d= +4.11 + k=10 flight: LOW= 60.1 HIGH= 57.4 d= -2.76 | control(+40): LOW= 141.8 HIGH= 144.8 d= +3.00 + k=15 flight: LOW= 72.4 HIGH= 69.1 d= -3.28 | control(+40): LOW= nan HIGH= nan d= +nan + k=20 flight: LOW= 83.8 HIGH= 82.5 d= -1.29 | control(+40): LOW= nan HIGH= nan d= +nan + k=25 flight: LOW= 94.5 HIGH= 93.8 d= -0.69 | control(+40): LOW= nan HIGH= nan d= +nan + k=30 flight: LOW= 104.2 HIGH= 105.2 d= +1.05 | control(+40): LOW= nan HIGH= nan d= +nan + band 300-450 (nLOW=5272 nHIGH=10696 per k) + k= 5 flight: LOW= 80.1 HIGH= 82.8 d= +2.67 | control(+40): LOW= 140.1 HIGH= 141.5 d= +1.35 + k=10 flight: LOW= 80.3 HIGH= 83.4 d= +3.17 | control(+40): LOW= 145.8 HIGH= 146.7 d= +0.91 + k=15 flight: LOW= 87.9 HIGH= 91.4 d= +3.46 | control(+40): LOW= nan HIGH= nan d= +nan + k=20 flight: LOW= 99.5 HIGH= 102.4 d= +2.95 | control(+40): LOW= nan HIGH= nan d= +nan + k=25 flight: LOW= 111.0 HIGH= 113.5 d= +2.46 | control(+40): LOW= nan HIGH= nan d= +nan + k=30 flight: LOW= 120.3 HIGH= 122.5 d= +2.20 | control(+40): LOW= nan HIGH= nan d= +nan + band 450+ (nLOW=12960 nHIGH=20126 per k) + k= 5 flight: LOW= 94.9 HIGH= 99.1 d= +4.21 | control(+40): LOW= 144.2 HIGH= 149.7 d= +5.57 + k=10 flight: LOW= 95.0 HIGH= 98.9 d= +3.86 | control(+40): LOW= 147.8 HIGH= 153.1 d= +5.23 + k=15 flight: LOW= 100.7 HIGH= 104.3 d= +3.53 | control(+40): LOW= nan HIGH= nan d= +nan + k=20 flight: LOW= 109.0 HIGH= 112.5 d= +3.50 | control(+40): LOW= nan HIGH= nan d= +nan + k=25 flight: LOW= 118.7 HIGH= 122.6 d= +3.83 | control(+40): LOW= nan HIGH= nan d= +nan + k=30 flight: LOW= 127.7 HIGH= 132.5 d= +4.74 | control(+40): LOW= nan HIGH= nan d= +nan + +-------------------------------------------------------------------------------------------------------- +FLIGHT- *AND* RANGE-MATCHED CONTRAST (kinematics and range both removed) + Within each range band we compare LOW vs HIGH power only inside the SAME cell = (integer + flight window, 50 px range sub-bin), pooling the per-cell differences with n weights. A longer + window lets DrussGT drift further off the line; at a fixed window a slower bullet implies a + shorter range and the gun's aim error grows with range. Anything left here is neither. + band obs d n used bins | null sd p_two + 200-300 +19.25 480 7 | 5.28 0.005 + 300-450 +38.59 15455 28 | 1.17 0.005 + 450+ +59.05 29975 46 | 1.09 0.005 + +-------------------------------------------------------------------------------------------------------- +HEADLINE WITHIN-BAND CONTRAST LOW p in [0.50,0.75) vs HIGH p in [1.00,1.50) + (HELD fixed inside each range band; 95%% CI from a ROUND-cluster bootstrap) + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + miss 0-100 6 2 | (too few for a contrast) + miss 100-200 53 23 | 43.03 47.92 +4.89 [-18.33,+31.08] + miss 200-300 130 780 | 74.31 74.72 +0.40 [-11.42,+11.93] + miss 300-450 5272 10696 | 104.67 110.55 +5.88 [+2.64,+9.07] + miss 450+ 12960 20126 | 124.01 132.26 +8.25 [+5.39,+11.25] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + miss_per_tick 0-100 6 2 | (too few for a contrast) + miss_per_tick 100-200 53 23 | 4.45 4.05 -0.40 [-2.84,+2.26] + miss_per_tick 200-300 130 780 | 5.01 4.67 -0.34 [-1.16,+0.46] + miss_per_tick 300-450 5272 10696 | 4.85 4.88 +0.03 [-0.13,+0.17] + miss_per_tick 450+ 12960 20126 | 4.52 4.51 -0.01 [-0.12,+0.10] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + lat_disp_abs 0-100 6 2 | (too few for a contrast) + lat_disp_abs 100-200 53 23 | 37.57 56.50 +18.93 [-3.78,+41.06] + lat_disp_abs 200-300 130 780 | 59.91 71.56 +11.64 [-0.85,+25.19] + lat_disp_abs 300-450 5272 10696 | 88.47 91.94 +3.47 [+0.78,+6.28] + lat_disp_abs 450+ 12960 20126 | 97.42 103.30 +5.88 [+3.44,+8.31] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + lat_disp_per_tick 0-100 6 2 | (too few for a contrast) + lat_disp_per_tick 100-200 53 23 | 3.44 4.76 +1.33 [-0.48,+3.23] + lat_disp_per_tick 200-300 130 780 | 3.79 4.12 +0.33 [-0.39,+1.14] + lat_disp_per_tick 300-450 5272 10696 | 3.94 3.86 -0.08 [-0.19,+0.03] + lat_disp_per_tick 450+ 12960 20126 | 3.47 3.42 -0.04 [-0.12,+0.03] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + lat_fixed_abs 0-100 6 2 | (too few for a contrast) + lat_fixed_abs 100-200 52 23 | 43.26 59.47 +16.21 [-4.15,+37.80] + lat_fixed_abs 200-300 130 780 | 47.20 50.09 +2.89 [-5.91,+12.89] + lat_fixed_abs 300-450 5272 10696 | 54.20 52.75 -1.45 [-2.96,+0.08] + lat_fixed_abs 450+ 12960 20126 | 55.63 55.47 -0.15 [-1.15,+0.84] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + lat_ctrl_abs 0-100 5 2 | (too few for a contrast) + lat_ctrl_abs 100-200 41 23 | 46.92 50.59 +3.67 [-19.55,+27.70] + lat_ctrl_abs 200-300 127 780 | 43.68 49.21 +5.53 [-3.87,+15.33] + lat_ctrl_abs 300-450 5155 10695 | 52.80 51.95 -0.85 [-2.20,+0.67] + lat_ctrl_abs 450+ 12828 20120 | 52.03 52.64 +0.61 [-0.38,+1.58] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + flight 0-100 6 2 | (too few for a contrast) + flight 100-200 53 23 | 10.42 11.87 +1.45 [-0.38,+3.14] + flight 200-300 130 780 | 15.28 16.86 +1.58 [+0.96,+2.18] + flight 300-450 5272 10696 | 22.36 23.70 +1.35 [+1.18,+1.52] + flight 450+ 12960 20126 | 28.38 30.52 +2.13 [+1.81,+2.44] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + latency 0-100 5 2 | (too few for a contrast) + latency 100-200 29 16 | 6.34 6.44 +0.09 [-4.23,+3.45] + latency 200-300 78 566 | 9.03 7.68 -1.35 [-2.92,+0.21] + latency 300-450 2968 6860 | 11.55 11.46 -0.09 [-0.47,+0.30] + latency 450+ 8682 13884 | 13.60 14.27 +0.68 [+0.36,+0.99] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + turn_flight 0-100 6 2 | (too few for a contrast) + turn_flight 100-200 53 23 | 2.01 2.86 +0.85 [-0.33,+2.21] + turn_flight 200-300 130 780 | 2.08 2.49 +0.40 [-0.08,+0.92] + turn_flight 300-450 5272 10696 | 1.48 1.61 +0.13 [+0.05,+0.21] + turn_flight 450+ 12960 20126 | 1.49 1.46 -0.03 [-0.09,+0.02] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + turn_fixed 0-100 6 2 | (too few for a contrast) + turn_fixed 100-200 53 23 | 2.09 2.66 +0.57 [-0.54,+1.89] + turn_fixed 200-300 130 780 | 1.91 2.22 +0.32 [-0.15,+0.79] + turn_fixed 300-450 5272 10696 | 1.46 1.50 +0.03 [-0.04,+0.11] + turn_fixed 450+ 12960 20126 | 1.43 1.28 -0.15 [-0.20,-0.10] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + turn_ctrl 0-100 5 2 | (too few for a contrast) + turn_ctrl 100-200 44 23 | 2.20 3.04 +0.84 [-0.35,+2.28] + turn_ctrl 200-300 127 780 | 1.78 2.19 +0.41 [-0.04,+0.88] + turn_ctrl 300-450 5211 10696 | 1.44 1.57 +0.13 [+0.05,+0.21] + turn_ctrl 450+ 12902 20126 | 1.52 1.58 +0.06 [+0.01,+0.12] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + speed_flight 0-100 6 2 | (too few for a contrast) + speed_flight 100-200 53 23 | 6.05 6.05 +0.00 [-1.80,+1.55] + speed_flight 200-300 130 780 | 5.39 5.44 +0.05 [-0.51,+0.59] + speed_flight 300-450 5272 10696 | 5.49 5.49 +0.01 [-0.08,+0.10] + speed_flight 450+ 12960 20126 | 5.46 5.48 +0.01 [-0.06,+0.08] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + speed_ctrl 0-100 5 2 | (too few for a contrast) + speed_ctrl 100-200 44 23 | 5.84 5.86 +0.01 [-1.55,+1.45] + speed_ctrl 200-300 127 780 | 5.63 5.48 -0.16 [-0.82,+0.43] + speed_ctrl 300-450 5211 10696 | 5.50 5.45 -0.05 [-0.14,+0.05] + speed_ctrl 450+ 12902 20126 | 5.46 5.47 +0.01 [-0.06,+0.09] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + hit 0-100 6 2 | (too few for a contrast) + hit 100-200 53 23 | 0.30 0.39 +0.09 [-0.33,+0.44] + hit 200-300 130 780 | 0.18 0.16 -0.02 [-0.10,+0.05] + hit 300-450 5272 10696 | 0.11 0.12 +0.00 [-0.01,+0.02] + hit 450+ 12960 20126 | 0.10 0.09 -0.01 [-0.02,-0.00] + + OUR fired-power histogram (exact values, top 12): + 1.00:31641 0.50:14182 0.10:627 0.51:222 0.55:203 0.53:195 0.60:193 0.58:192 0.59:192 0.62:190 0.54:189 0.57:184 +======================================================================================================== +CORPUS powtest 35 battles 245 rounds 24280 usable shots by US (ModularBot) + attribution: owner id -> {e=DrussGT, s=us} recovered per battle from fire geometry+energy; + cross-checked on the death events: 246/246 deaths have the mapped victim at ~0 energy + (attribution is per-battle because the Tank Royale owner id is not stable across runs) + + >> THE CONFOUNDER IS REAL: our fired power is a range + energy cap + band power shots firePx ourE enemyE flight + 100-200 1.00-1.50 8 179.5 77.7 79.5 13.25 + 100-200 >=1.50 74 169.5 84.3 82.3 14.72 + 200-300 0.50-0.75 16 262.3 21.6 33.5 15.44 + 200-300 1.00-1.50 406 260.5 83.1 82.2 16.51 + 200-300 >=1.50 17 246.1 37.9 22.0 21.00 + 300-450 <0.50 51 410.0 30.7 2.7 21.00 + 300-450 0.50-0.75 1388 412.6 14.4 17.9 22.36 + 300-450 0.75-1.00 254 412.0 29.0 23.1 23.52 + 300-450 1.00-1.50 8151 404.0 59.6 54.1 23.78 + 450+ <0.50 115 533.7 18.7 1.7 26.86 + 450+ 0.50-0.75 2249 524.9 13.6 17.8 27.75 + 450+ 0.75-1.00 456 526.4 28.8 25.2 29.26 + 450+ 1.00-1.50 11085 525.3 52.6 46.0 29.93 + + (a) MISS AT ARRIVAL px - perpendicular offset of DrussGT from our aim line + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - - - 28.34 34.35 + n=0 n=0 n=0 n=2 n=4 + 100-200 - 58.35 - 32.74 62.45 + n=0 n=1 n=0 n=8 n=74 + 200-300 - 70.50 71.07 73.03 112.28 + n=0 n=16 n=3 n=406 n=17 + 300-450 100.28 106.22 111.86 109.93 - + n=51 n=1388 n=254 n=8151 n=0 + 450+ 131.41 122.00 130.11 131.86 - + n=115 n=2249 n=456 n=11085 n=0 + + (a') MISS AT ARRIVAL / flight ticks (px per tick - power-neutral) + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - - - 3.15 2.89 + n=0 n=0 n=0 n=2 n=4 + 100-200 - 7.29 - 2.51 4.57 + n=0 n=1 n=0 n=8 n=74 + 200-300 - 4.86 4.68 4.68 5.46 + n=0 n=16 n=3 n=406 n=17 + 300-450 4.93 4.94 4.96 4.83 - + n=51 n=1388 n=254 n=8151 n=0 + 450+ 5.02 4.56 4.64 4.59 - + n=115 n=2249 n=456 n=11085 n=0 + + (b) LATERAL DISPLACEMENT px over the flight window + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - - - 50.56 59.97 + n=0 n=0 n=0 n=2 n=4 + 100-200 - 6.28 - 71.40 63.01 + n=0 n=1 n=0 n=8 n=74 + 200-300 - 58.55 61.90 71.26 109.05 + n=0 n=16 n=3 n=406 n=17 + 300-450 68.90 91.35 94.37 93.56 - + n=51 n=1388 n=254 n=8151 n=0 + 450+ 104.97 96.90 102.50 102.74 - + n=115 n=2249 n=456 n=11085 n=0 + + (b/ ) LATERAL DISPLACEMENT / flight ticks (px per tick - power-neutral) + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - - - 5.62 5.11 + n=0 n=0 n=0 n=2 n=4 + 100-200 - 0.78 - 5.34 4.12 + n=0 n=1 n=0 n=8 n=74 + 200-300 - 3.70 3.43 4.22 5.04 + n=0 n=16 n=3 n=406 n=17 + 300-450 3.29 4.07 4.00 3.91 - + n=51 n=1388 n=254 n=8151 n=0 + 450+ 3.93 3.53 3.54 3.48 - + n=115 n=2249 n=456 n=11085 n=0 + + (b') LATERAL DISPLACEMENT px over a FIXED 12-tick window (power-neutral) + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - - - 72.08 63.83 + n=0 n=0 n=0 n=2 n=4 + 100-200 - 3.66 - 63.36 49.33 + n=0 n=1 n=0 n=8 n=74 + 200-300 - 41.73 28.58 50.71 54.65 + n=0 n=16 n=3 n=406 n=17 + 300-450 46.10 53.99 54.21 53.41 - + n=51 n=1388 n=254 n=8151 n=0 + 450+ 61.58 55.53 56.08 55.85 - + n=115 n=2249 n=456 n=11085 n=0 + + (b'') CONTROL: lateral displacement px, SAME shot, 40 ticks later (bullet gone) + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - - - 6.62 55.92 + n=0 n=0 n=0 n=1 n=3 + 100-200 - 20.12 - 53.96 51.68 + n=0 n=1 n=0 n=8 n=69 + 200-300 - 51.96 42.95 50.50 46.25 + n=0 n=15 n=3 n=405 n=9 + 300-450 39.77 53.98 53.45 52.69 - + n=43 n=1362 n=252 n=8118 n=0 + 450+ 57.71 52.62 51.98 53.00 - + n=95 n=2212 n=454 n=11037 n=0 + + (f) FLIGHT WINDOW LENGTH ticks (low power = FASTER bullet = shorter) + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - - - 9.00 11.50 + n=0 n=0 n=0 n=2 n=4 + 100-200 - 8.00 - 13.25 14.72 + n=0 n=1 n=0 n=8 n=74 + 200-300 - 15.44 16.67 16.51 21.00 + n=0 n=16 n=3 n=406 n=17 + 300-450 21.00 22.36 23.52 23.78 - + n=51 n=1388 n=254 n=8151 n=0 + 450+ 26.86 27.75 29.26 29.93 - + n=115 n=2249 n=456 n=11085 n=0 + + (c) RESPONSE LATENCY ticks to a >15 deg heading turn + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - - - 5.50 4.00 + n=0 n=0 n=0 n=2 n=3 + 100-200 - 2.00 - 9.25 7.40 + n=0 n=1 n=0 n=4 n=53 + 200-300 - 9.29 10.50 7.58 9.21 + n=0 n=7 n=2 n=303 n=14 + 300-450 11.86 12.03 13.06 11.75 - + n=22 n=743 n=152 n=5004 n=0 + 450+ 13.79 13.89 14.27 14.36 - + n=70 n=1457 n=313 n=7615 n=0 + + (d) MEAN TURN RATE deg/tick, flight window + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - - - 2.85 3.72 + n=0 n=0 n=0 n=2 n=4 + 100-200 - 3.76 - 1.52 2.60 + n=0 n=1 n=0 n=8 n=74 + 200-300 - 1.86 1.48 2.49 2.01 + n=0 n=16 n=3 n=406 n=17 + 300-450 1.28 1.42 1.43 1.55 - + n=51 n=1388 n=254 n=8151 n=0 + 450+ 1.42 1.45 1.41 1.42 - + n=115 n=2249 n=456 n=11085 n=0 + + (d') MEAN TURN RATE deg/tick, fixed 12-tick window + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - - - 2.98 3.38 + n=0 n=0 n=0 n=2 n=4 + 100-200 - 4.90 - 1.32 2.41 + n=0 n=1 n=0 n=8 n=74 + 200-300 - 1.68 1.29 2.20 2.38 + n=0 n=16 n=3 n=406 n=17 + 300-450 1.29 1.39 1.35 1.43 - + n=51 n=1388 n=254 n=8151 n=0 + 450+ 1.39 1.40 1.37 1.25 - + n=115 n=2249 n=456 n=11085 n=0 + + (d'') CONTROL: mean turn rate deg/tick, 40 ticks later + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - - - 4.12 3.24 + n=0 n=0 n=0 n=1 n=3 + 100-200 - 4.93 - 2.58 2.32 + n=0 n=1 n=0 n=8 n=70 + 200-300 - 1.96 2.13 2.24 3.14 + n=0 n=15 n=3 n=405 n=11 + 300-450 1.11 1.39 1.45 1.55 - + n=47 n=1377 n=253 n=8135 n=0 + 450+ 1.34 1.49 1.45 1.54 - + n=105 n=2231 n=455 n=11069 n=0 + + (d) MEAN SPEED px/tick, flight window + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - - - 8.00 7.01 + n=0 n=0 n=0 n=2 n=4 + 100-200 - 2.25 - 6.77 5.45 + n=0 n=1 n=0 n=8 n=74 + 200-300 - 5.16 5.82 5.48 6.04 + n=0 n=16 n=3 n=406 n=17 + 300-450 4.81 5.50 5.56 5.51 - + n=51 n=1388 n=254 n=8151 n=0 + 450+ 5.74 5.43 5.54 5.51 - + n=115 n=2249 n=456 n=11085 n=0 + + (d'') CONTROL: mean speed px/tick, 40 ticks later + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - - - 4.08 6.49 + n=0 n=0 n=0 n=1 n=3 + 100-200 - 4.08 - 5.97 5.88 + n=0 n=1 n=0 n=8 n=70 + 200-300 - 5.50 5.18 5.61 6.99 + n=0 n=15 n=3 n=405 n=11 + 300-450 4.60 5.54 5.53 5.47 - + n=47 n=1377 n=253 n=8135 n=0 + 450+ 5.66 5.46 5.47 5.51 - + n=105 n=2231 n=455 n=11069 n=0 + + (e) fraction where |perp| GREW (moved further off the line) + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - - - 0.50 0.50 + n=0 n=0 n=0 n=2 n=4 + 100-200 - 1.00 - 0.25 0.58 + n=0 n=1 n=0 n=8 n=74 + 200-300 - 0.56 0.67 0.58 0.82 + n=0 n=16 n=3 n=406 n=17 + 300-450 0.55 0.61 0.59 0.59 - + n=51 n=1388 n=254 n=8151 n=0 + 450+ 0.59 0.58 0.58 0.61 - + n=115 n=2249 n=456 n=11085 n=0 + + OUTCOME hit rate (real server events) + band <0.50 0.50-0.75 0.75-1.00 1.00-1.50 >=1.50 + 0-100 - - - 0.50 0.50 + n=0 n=0 n=0 n=2 n=4 + 100-200 - 0.00 - 0.50 0.20 + n=0 n=1 n=0 n=8 n=74 + 200-300 - 0.19 0.33 0.16 0.00 + n=0 n=16 n=3 n=406 n=17 + 300-450 0.00 0.12 0.12 0.12 - + n=51 n=1388 n=254 n=8151 n=0 + 450+ 0.02 0.10 0.10 0.09 - + n=115 n=2249 n=456 n=11085 n=0 + +-------------------------------------------------------------------------------------------------------- +SHUFFLED-LABEL NULL (labels permuted WITHIN each range band, 400 reps) + For the arrival-dependent metrics the arrival tick is RE-DERIVED from the permuted power, + so the null keeps the kinematic channel (a slower bullet really does arrive later) and destroys + only the response. p is the two-sided permutation p on delta = mean(HIGH) - mean(LOW) inside that band. + miss 0-100 n/a 100-200 n/a 200-300 d=+3.592(null sd=12.030,p=0.993) 300-450 d=+3.788(null sd=2.135,p=0.793) 450+ d=+9.865(null sd=1.815,p=0.005) + miss_per_tick 0-100 n/a 100-200 n/a 200-300 d=-0.124(null sd=0.878,p=0.948) 300-450 d=-0.100(null sd=0.107,p=0.514) 450+ d=+0.031(null sd=0.074,p=0.005) + lat_disp_abs 0-100 n/a 100-200 n/a 200-300 d=+13.420(null sd=10.885,p=0.439) 300-450 d=+2.201(null sd=1.619,p=0.200) 450+ d=+5.908(null sd=1.474,p=0.160) + flight 0-100 n/a 100-200 n/a 200-300 d=+1.200(null sd=0.588,p=0.933) 300-450 d=+1.419(null sd=0.071,p=0.005) 450+ d=+2.177(null sd=0.078,p=0.818) + lat_fixed_abs 0-100 n/a 100-200 n/a 200-300 d=+8.977(null sd=6.784,p=0.195) 300-450 d=-0.580(null sd=0.874,p=0.484) 450+ d=+0.315(null sd=0.672,p=0.603) + lat_ctrl_abs 0-100 n/a 100-200 n/a 200-300 d=-1.460(null sd=7.562,p=0.783) 300-450 d=-1.285(null sd=0.876,p=0.155) 450+ d=+0.386(null sd=0.653,p=0.519) + latency 0-100 n/a 100-200 n/a 200-300 n/a 300-450 d=-0.285(null sd=0.258,p=0.279) 450+ d=+0.473(null sd=0.236,p=0.045) + turn_fixed 0-100 n/a 100-200 n/a 200-300 d=+0.514(null sd=0.383,p=0.195) 300-450 d=+0.040(null sd=0.036,p=0.254) 450+ d=-0.157(null sd=0.027,p=0.005) + turn_ctrl 0-100 n/a 100-200 n/a 200-300 d=+0.279(null sd=0.395,p=0.494) 300-450 d=+0.156(null sd=0.040,p=0.005) 450+ d=+0.052(null sd=0.027,p=0.055) + speed_fixed 0-100 n/a 100-200 n/a 200-300 d=+0.331(null sd=0.467,p=0.504) 300-450 d=+0.029(null sd=0.055,p=0.648) 450+ d=+0.053(null sd=0.042,p=0.200) + hit 0-100 n/a 100-200 n/a 200-300 d=-0.025(null sd=0.094,p=1.000) 300-450 d=-0.002(null sd=0.009,p=0.918) 450+ d=-0.007(null sd=0.006,p=0.344) + +-------------------------------------------------------------------------------------------------------- +FIXED-HORIZON TEST (no arrival tick, no flight-window confound) + |perpendicular offset of DrussGT from our aim line| at k ticks after the fire (flight window), + and the same quantity in the CONTROL window at k+40 ticks, when the bullet is long gone. + A response to our shot would be ~0 at k=5 and grow with k; a phase/geometry difference is + present at k=5 and identical in the control. + band 200-300 (nLOW=16 nHIGH=406 per k) + k= 5 flight: LOW= 54.8 HIGH= 54.5 d= -0.24 | control(+40): LOW= 123.5 HIGH= 134.1 d=+10.56 + k=10 flight: LOW= 58.3 HIGH= 57.3 d= -1.02 | control(+40): LOW= 138.4 HIGH= 142.9 d= +4.52 + k=15 flight: LOW= 69.1 HIGH= 69.6 d= +0.52 | control(+40): LOW= nan HIGH= nan d= +nan + k=20 flight: LOW= 77.8 HIGH= 83.8 d= +6.03 | control(+40): LOW= nan HIGH= nan d= +nan + k=25 flight: LOW= 84.9 HIGH= 96.8 d=+11.83 | control(+40): LOW= nan HIGH= nan d= +nan + k=30 flight: LOW= 98.6 HIGH= 108.8 d=+10.24 | control(+40): LOW= nan HIGH= nan d= +nan + band 300-450 (nLOW=1388 nHIGH=8151 per k) + k= 5 flight: LOW= 78.4 HIGH= 84.0 d= +5.62 | control(+40): LOW= 143.3 HIGH= 141.4 d= -1.87 + k=10 flight: LOW= 79.1 HIGH= 84.0 d= +4.83 | control(+40): LOW= 149.7 HIGH= 147.2 d= -2.52 + k=15 flight: LOW= 88.3 HIGH= 91.5 d= +3.15 | control(+40): LOW= nan HIGH= nan d= +nan + k=20 flight: LOW= 101.0 HIGH= 102.3 d= +1.29 | control(+40): LOW= nan HIGH= nan d= +nan + k=25 flight: LOW= 112.2 HIGH= 112.9 d= +0.70 | control(+40): LOW= nan HIGH= nan d= +nan + k=30 flight: LOW= 121.1 HIGH= 121.8 d= +0.60 | control(+40): LOW= nan HIGH= nan d= +nan + band 450+ (nLOW=2249 nHIGH=11085 per k) + k= 5 flight: LOW= 93.0 HIGH= 99.0 d= +5.97 | control(+40): LOW= 143.7 HIGH= 150.3 d= +6.59 + k=10 flight: LOW= 93.3 HIGH= 99.1 d= +5.83 | control(+40): LOW= 147.7 HIGH= 153.8 d= +6.03 + k=15 flight: LOW= 99.4 HIGH= 104.9 d= +5.50 | control(+40): LOW= nan HIGH= nan d= +nan + k=20 flight: LOW= 108.1 HIGH= 113.2 d= +5.12 | control(+40): LOW= nan HIGH= nan d= +nan + k=25 flight: LOW= 118.3 HIGH= 123.5 d= +5.13 | control(+40): LOW= nan HIGH= nan d= +nan + k=30 flight: LOW= 126.7 HIGH= 133.3 d= +6.61 | control(+40): LOW= nan HIGH= nan d= +nan + +-------------------------------------------------------------------------------------------------------- +FLIGHT- *AND* RANGE-MATCHED CONTRAST (kinematics and range both removed) + Within each range band we compare LOW vs HIGH power only inside the SAME cell = (integer + flight window, 50 px range sub-bin), pooling the per-cell differences with n weights. A longer + window lets DrussGT drift further off the line; at a fixed window a slower bullet implies a + shorter range and the gun's aim error grows with range. Anything left here is neither. + band obs d n used bins | null sd p_two + 300-450 +37.84 8588 23 | 2.32 0.005 + 450+ +57.39 10809 34 | 2.31 0.005 + +-------------------------------------------------------------------------------------------------------- +HEADLINE WITHIN-BAND CONTRAST LOW p in [0.50,0.75) vs HIGH p in [1.00,1.50) + (HELD fixed inside each range band; 95%% CI from a ROUND-cluster bootstrap) + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + miss 0-100 0 2 | (too few for a contrast) + miss 100-200 1 8 | (too few for a contrast) + miss 200-300 16 406 | 70.50 73.03 +2.53 [-12.34,+28.80] + miss 300-450 1388 8151 | 106.22 109.93 +3.72 [-1.50,+8.65] + miss 450+ 2249 11085 | 122.00 131.86 +9.86 [+4.56,+15.25] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + miss_per_tick 0-100 0 2 | (too few for a contrast) + miss_per_tick 100-200 1 8 | (too few for a contrast) + miss_per_tick 200-300 16 406 | 4.86 4.68 -0.19 [-1.31,+1.76] + miss_per_tick 300-450 1388 8151 | 4.94 4.83 -0.10 [-0.37,+0.15] + miss_per_tick 450+ 2249 11085 | 4.56 4.59 +0.03 [-0.19,+0.25] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + lat_disp_abs 0-100 0 2 | (too few for a contrast) + lat_disp_abs 100-200 1 8 | (too few for a contrast) + lat_disp_abs 200-300 16 406 | 58.55 71.26 +12.71 [-18.26,+36.16] + lat_disp_abs 300-450 1388 8151 | 91.35 93.56 +2.21 [-2.02,+6.72] + lat_disp_abs 450+ 2249 11085 | 96.90 102.74 +5.84 [+1.65,+9.94] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + lat_disp_per_tick 0-100 0 2 | (too few for a contrast) + lat_disp_per_tick 100-200 1 8 | (too few for a contrast) + lat_disp_per_tick 200-300 16 406 | 3.70 4.22 +0.52 [-0.90,+1.65] + lat_disp_per_tick 300-450 1388 8151 | 4.07 3.91 -0.16 [-0.32,+0.02] + lat_disp_per_tick 450+ 2249 11085 | 3.53 3.48 -0.05 [-0.20,+0.11] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + lat_fixed_abs 0-100 0 2 | (too few for a contrast) + lat_fixed_abs 100-200 1 8 | (too few for a contrast) + lat_fixed_abs 200-300 16 406 | 41.73 50.71 +8.98 [-11.36,+23.25] + lat_fixed_abs 300-450 1388 8151 | 53.99 53.41 -0.58 [-3.07,+1.89] + lat_fixed_abs 450+ 2249 11085 | 55.53 55.85 +0.31 [-1.24,+1.87] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + lat_ctrl_abs 0-100 0 1 | (too few for a contrast) + lat_ctrl_abs 100-200 1 8 | (too few for a contrast) + lat_ctrl_abs 200-300 15 405 | 51.96 50.50 -1.46 [-21.67,+14.83] + lat_ctrl_abs 300-450 1362 8118 | 53.98 52.69 -1.29 [-3.11,+0.47] + lat_ctrl_abs 450+ 2212 11037 | 52.62 53.00 +0.39 [-0.83,+1.57] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + flight 0-100 0 2 | (too few for a contrast) + flight 100-200 1 8 | (too few for a contrast) + flight 200-300 16 406 | 15.44 16.51 +1.07 [-0.61,+2.99] + flight 300-450 1388 8151 | 22.36 23.78 +1.42 [+1.15,+1.68] + flight 450+ 2249 11085 | 27.75 29.93 +2.18 [+1.63,+2.73] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + latency 0-100 0 2 | (too few for a contrast) + latency 100-200 1 4 | (too few for a contrast) + latency 200-300 7 303 | (too few for a contrast) + latency 300-450 743 5004 | 12.03 11.75 -0.29 [-0.81,+0.25] + latency 450+ 1457 7615 | 13.89 14.36 +0.47 [-0.15,+1.14] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + turn_flight 0-100 0 2 | (too few for a contrast) + turn_flight 100-200 1 8 | (too few for a contrast) + turn_flight 200-300 16 406 | 1.86 2.49 +0.62 [+0.33,+1.09] + turn_flight 300-450 1388 8151 | 1.42 1.55 +0.13 [+0.04,+0.23] + turn_flight 450+ 2249 11085 | 1.45 1.42 -0.03 [-0.13,+0.06] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + turn_fixed 0-100 0 2 | (too few for a contrast) + turn_fixed 100-200 1 8 | (too few for a contrast) + turn_fixed 200-300 16 406 | 1.68 2.20 +0.51 [+0.11,+1.18] + turn_fixed 300-450 1388 8151 | 1.39 1.43 +0.04 [-0.06,+0.15] + turn_fixed 450+ 2249 11085 | 1.40 1.25 -0.16 [-0.26,-0.06] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + turn_ctrl 0-100 0 1 | (too few for a contrast) + turn_ctrl 100-200 1 8 | (too few for a contrast) + turn_ctrl 200-300 15 405 | 1.96 2.24 +0.28 [-0.78,+0.97] + turn_ctrl 300-450 1377 8135 | 1.39 1.55 +0.16 [+0.04,+0.28] + turn_ctrl 450+ 2231 11069 | 1.49 1.54 +0.05 [-0.06,+0.15] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + speed_flight 0-100 0 2 | (too few for a contrast) + speed_flight 100-200 1 8 | (too few for a contrast) + speed_flight 200-300 16 406 | 5.16 5.48 +0.31 [-0.96,+1.28] + speed_flight 300-450 1388 8151 | 5.50 5.51 +0.01 [-0.13,+0.14] + speed_flight 450+ 2249 11085 | 5.43 5.51 +0.08 [-0.02,+0.19] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + speed_ctrl 0-100 0 1 | (too few for a contrast) + speed_ctrl 100-200 1 8 | (too few for a contrast) + speed_ctrl 200-300 15 405 | 5.50 5.61 +0.11 [-0.78,+1.18] + speed_ctrl 300-450 1377 8135 | 5.54 5.47 -0.07 [-0.20,+0.07] + speed_ctrl 450+ 2231 11069 | 5.46 5.51 +0.05 [-0.06,+0.15] + + metric band nLOW nHIGH | LOW HIGH delta 95% CI + hit 0-100 0 2 | (too few for a contrast) + hit 100-200 1 8 | (too few for a contrast) + hit 200-300 16 406 | 0.19 0.16 -0.02 [-0.17,+0.20] + hit 300-450 1388 8151 | 0.12 0.12 -0.00 [-0.03,+0.02] + hit 450+ 2249 11085 | 0.10 0.09 -0.01 [-0.02,+0.01] + + OUR fired-power histogram (exact values, top 12): + 1.00:19653 0.50:2760 2.00:64 0.62:61 0.90:56 0.52:56 0.10:56 0.57:54 0.59:53 0.67:49 0.65:47 0.64:44 diff --git a/common_libs/tests/fixtures/dodge_vs_power_results.json b/common_libs/tests/fixtures/dodge_vs_power_results.json new file mode 100644 index 0000000..1874d78 --- /dev/null +++ b/common_libs/tests/fixtures/dodge_vs_power_results.json @@ -0,0 +1,6067 @@ +{ + "powtest": { + "battles": 35, + "contrast": { + "flight": { + "0-100": { + "n_high": 2, + "n_low": 0 + }, + "100-200": { + "n_high": 8, + "n_low": 1 + }, + "200-300": { + "ci_hi": 2.994245156339918, + "ci_lo": -0.6055649957519087, + "delta": 1.0748152709359609, + "high": 16.51231527093596, + "low": 15.4375, + "n_high": 406, + "n_low": 16 + }, + "300-450": { + "ci_hi": 1.6813566498791666, + "ci_lo": 1.1502939912923438, + "delta": 1.4195041396239638, + "high": 23.777573303889092, + "low": 22.358069164265128, + "n_high": 8151, + "n_low": 1388 + }, + "450+": { + "ci_hi": 2.729377027286521, + "ci_lo": 1.628345953846047, + "delta": 2.1788791610484743, + "high": 29.92810103743798, + "low": 27.749221876389505, + "n_high": 11085, + "n_low": 2249 + } + }, + "hit": { + "0-100": { + "n_high": 2, + "n_low": 0 + }, + "100-200": { + "n_high": 8, + "n_low": 1 + }, + "200-300": { + "ci_hi": 0.20293398533007334, + "ci_lo": -0.1716278612830337, + "delta": -0.0249384236453202, + "high": 0.1625615763546798, + "low": 0.1875, + "n_high": 406, + "n_low": 16 + }, + "300-450": { + "ci_hi": 0.023993396856868465, + "ci_lo": -0.02859912548469598, + "delta": -0.0017281873796358843, + "high": 0.11642743221690591, + "low": 0.11815561959654179, + "n_high": 8151, + "n_low": 1388 + }, + "450+": { + "ci_hi": 0.005659361568225038, + "ci_lo": -0.018894491447985842, + "delta": -0.0069970254910065866, + "high": 0.08949030221019395, + "low": 0.09648732770120054, + "n_high": 11085, + "n_low": 2249 + } + }, + "lat_ctrl_abs": { + "0-100": { + "n_high": 1, + "n_low": 0 + }, + "100-200": { + "n_high": 8, + "n_low": 1 + }, + "200-300": { + "ci_hi": 14.826371838312319, + "ci_lo": -21.66731988457461, + "delta": -1.460103352647458, + "high": 50.49943833268097, + "low": 51.959541685328425, + "n_high": 405, + "n_low": 15 + }, + "300-450": { + "ci_hi": 0.46616316642806765, + "ci_lo": -3.111535378267938, + "delta": -1.2852258669471155, + "high": 52.69184424512454, + "low": 53.97707011207166, + "n_high": 8118, + "n_low": 1362 + }, + "450+": { + "ci_hi": 1.5725423985766724, + "ci_lo": -0.8302137791920217, + "delta": 0.3859285842171616, + "high": 53.004573693106195, + "low": 52.618645108889034, + "n_high": 11037, + "n_low": 2212 + } + }, + "lat_disp_abs": { + "0-100": { + "n_high": 2, + "n_low": 0 + }, + "100-200": { + "n_high": 8, + "n_low": 1 + }, + "200-300": { + "ci_hi": 36.16188204963159, + "ci_lo": -18.256616573158013, + "delta": 12.710917484944943, + "high": 71.26247703390105, + "low": 58.55155954895611, + "n_high": 406, + "n_low": 16 + }, + "300-450": { + "ci_hi": 6.718509680014705, + "ci_lo": -2.0227842791889543, + "delta": 2.210596791762569, + "high": 93.55971008808042, + "low": 91.34911329631785, + "n_high": 8151, + "n_low": 1388 + }, + "450+": { + "ci_hi": 9.936339945451849, + "ci_lo": 1.6458082236260623, + "delta": 5.839236270674206, + "high": 102.73960655561707, + "low": 96.90037028494287, + "n_high": 11085, + "n_low": 2249 + } + }, + "lat_disp_per_tick": { + "0-100": { + "n_high": 2, + "n_low": 0 + }, + "100-200": { + "n_high": 8, + "n_low": 1 + }, + "200-300": { + "ci_hi": 1.6482131705369722, + "ci_lo": -0.9032455200152274, + "delta": 0.5248787904228762, + "high": 4.223401051428324, + "low": 3.6985222610054476, + "n_high": 406, + "n_low": 16 + }, + "300-450": { + "ci_hi": 0.02190518975256106, + "ci_lo": -0.31640531888540036, + "delta": -0.15581816199487886, + "high": 3.913582946400491, + "low": 4.06940110839537, + "n_high": 8151, + "n_low": 1388 + }, + "450+": { + "ci_hi": 0.1084224820441464, + "ci_lo": -0.20450756406489035, + "delta": -0.04848160749757158, + "high": 3.476787740836584, + "low": 3.5252693483341555, + "n_high": 11085, + "n_low": 2249 + } + }, + "lat_fixed_abs": { + "0-100": { + "n_high": 2, + "n_low": 0 + }, + "100-200": { + "n_high": 8, + "n_low": 1 + }, + "200-300": { + "ci_hi": 23.251733670885077, + "ci_lo": -11.36093375856521, + "delta": 8.976973808032632, + "high": 50.711147102698604, + "low": 41.73417329466597, + "n_high": 406, + "n_low": 16 + }, + "300-450": { + "ci_hi": 1.8948666605875104, + "ci_lo": -3.068509413719056, + "delta": -0.5798184956824386, + "high": 53.40584690055045, + "low": 53.98566539623289, + "n_high": 8151, + "n_low": 1388 + }, + "450+": { + "ci_hi": 1.8652975800036629, + "ci_lo": -1.2362359613642795, + "delta": 0.3146010086232067, + "high": 55.84706160625502, + "low": 55.53246059763181, + "n_high": 11085, + "n_low": 2249 + } + }, + "latency": { + "0-100": { + "n_high": 2, + "n_low": 0 + }, + "100-200": { + "n_high": 4, + "n_low": 1 + }, + "200-300": { + "n_high": 303, + "n_low": 7 + }, + "300-450": { + "ci_hi": 0.2547022389423699, + "ci_lo": -0.8135606486396458, + "delta": -0.28544593665578866, + "high": 11.748201438848922, + "low": 12.03364737550471, + "n_high": 5004, + "n_low": 743 + }, + "450+": { + "ci_hi": 1.13989392857715, + "ci_lo": -0.15004202249045662, + "delta": 0.4732062166433604, + "high": 14.362705187130663, + "low": 13.889498970487303, + "n_high": 7615, + "n_low": 1457 + } + }, + "miss": { + "0-100": { + "n_high": 2, + "n_low": 0 + }, + "100-200": { + "n_high": 8, + "n_low": 1 + }, + "200-300": { + "ci_hi": 28.800748680649534, + "ci_lo": -12.343059209481908, + "delta": 2.5280366265902785, + "high": 73.02973496713113, + "low": 70.50169834054086, + "n_high": 406, + "n_low": 16 + }, + "300-450": { + "ci_hi": 8.652763753323669, + "ci_lo": -1.496691999785284, + "delta": 3.7159233615602005, + "high": 109.93492335905549, + "low": 106.21899999749529, + "n_high": 8151, + "n_low": 1388 + }, + "450+": { + "ci_hi": 15.248262270470093, + "ci_lo": 4.562151653915535, + "delta": 9.858405089571662, + "high": 131.85947851489158, + "low": 122.00107342531992, + "n_high": 11085, + "n_low": 2249 + } + }, + "miss_per_tick": { + "0-100": { + "n_high": 2, + "n_low": 0 + }, + "100-200": { + "n_high": 8, + "n_low": 1 + }, + "200-300": { + "ci_hi": 1.7566048148796205, + "ci_lo": -1.3121590231534288, + "delta": -0.18511762902022966, + "high": 4.675877477830493, + "low": 4.860995106850723, + "n_high": 406, + "n_low": 16 + }, + "300-450": { + "ci_hi": 0.1506327793173483, + "ci_lo": -0.3729687462943758, + "delta": -0.1046856584666962, + "high": 4.834435468512022, + "low": 4.939121126978718, + "n_high": 8151, + "n_low": 1388 + }, + "450+": { + "ci_hi": 0.25210260553066366, + "ci_lo": -0.1862497717083187, + "delta": 0.03148482875558756, + "high": 4.587713371536042, + "low": 4.556228542780454, + "n_high": 11085, + "n_low": 2249 + } + }, + "speed_ctrl": { + "0-100": { + "n_high": 1, + "n_low": 0 + }, + "100-200": { + "n_high": 8, + "n_low": 1 + }, + "200-300": { + "ci_hi": 1.1843597186426091, + "ci_lo": -0.7772295684032695, + "delta": 0.10784923868312735, + "high": 5.61272646090535, + "low": 5.504877222222222, + "n_high": 405, + "n_low": 15 + }, + "300-450": { + "ci_hi": 0.06853484478644312, + "ci_lo": -0.20352789159258045, + "delta": -0.06838472820240415, + "high": 5.474746250355873, + "low": 5.543130978558277, + "n_high": 8135, + "n_low": 1377 + }, + "450+": { + "ci_hi": 0.15372452307294715, + "ci_lo": -0.057849526255054684, + "delta": 0.051018493508522944, + "high": 5.511889742788155, + "low": 5.460871249279632, + "n_high": 11069, + "n_low": 2231 + } + }, + "speed_flight": { + "0-100": { + "n_high": 2, + "n_low": 0 + }, + "100-200": { + "n_high": 8, + "n_low": 1 + }, + "200-300": { + "ci_hi": 1.2825269573135518, + "ci_lo": -0.9646534426003024, + "delta": 0.31284577048475626, + "high": 5.477389663434396, + "low": 5.16454389294964, + "n_high": 406, + "n_low": 16 + }, + "300-450": { + "ci_hi": 0.144129428923657, + "ci_lo": -0.13118836730276673, + "delta": 0.008235455205348963, + "high": 5.508193090233714, + "low": 5.499957635028365, + "n_high": 8151, + "n_low": 1388 + }, + "450+": { + "ci_hi": 0.18930245690354308, + "ci_lo": -0.02207276814901249, + "delta": 0.07981424464676135, + "high": 5.510727493081691, + "low": 5.43091324843493, + "n_high": 11085, + "n_low": 2249 + } + }, + "turn_ctrl": { + "0-100": { + "n_high": 1, + "n_low": 0 + }, + "100-200": { + "n_high": 8, + "n_low": 1 + }, + "200-300": { + "ci_hi": 0.9702768283511924, + "ci_lo": -0.7812583118556717, + "delta": 0.2788816255144033, + "high": 2.2360382921810698, + "low": 1.9571566666666664, + "n_high": 405, + "n_low": 15 + }, + "300-450": { + "ci_hi": 0.2823745551182977, + "ci_lo": 0.03938393436777221, + "delta": 0.15612326429197632, + "high": 1.545915142074889, + "low": 1.3897918777829126, + "n_high": 8135, + "n_low": 1377 + }, + "450+": { + "ci_hi": 0.15347903491921544, + "ci_lo": -0.05781357150798416, + "delta": 0.05166222898670414, + "high": 1.5385299423177479, + "low": 1.4868677133310437, + "n_high": 11069, + "n_low": 2231 + } + }, + "turn_fixed": { + "0-100": { + "n_high": 2, + "n_low": 0 + }, + "100-200": { + "n_high": 8, + "n_low": 1 + }, + "200-300": { + "ci_hi": 1.176361884384384, + "ci_lo": 0.10631705349248421, + "delta": 0.514162879720854, + "high": 2.1967357963875207, + "low": 1.6825729166666668, + "n_high": 406, + "n_low": 16 + }, + "300-450": { + "ci_hi": 0.15145672636276353, + "ci_lo": -0.06257407518554392, + "delta": 0.04032615014647267, + "high": 1.4329195579274527, + "low": 1.39259340778098, + "n_high": 8151, + "n_low": 1388 + }, + "450+": { + "ci_hi": -0.06458511462671379, + "ci_lo": -0.25815368970888897, + "delta": -0.1569318795563528, + "high": 1.247239048263419, + "low": 1.4041709278197718, + "n_high": 11085, + "n_low": 2249 + } + }, + "turn_flight": { + "0-100": { + "n_high": 2, + "n_low": 0 + }, + "100-200": { + "n_high": 8, + "n_low": 1 + }, + "200-300": { + "ci_hi": 1.0910692485303997, + "ci_lo": 0.3312454788903456, + "delta": 0.6241175895927678, + "high": 2.4863982360654258, + "low": 1.862280646472658, + "n_high": 406, + "n_low": 16 + }, + "300-450": { + "ci_hi": 0.2345605327331619, + "ci_lo": 0.038619887095870276, + "delta": 0.13300988887718468, + "high": 1.5501769548793085, + "low": 1.4171670660021238, + "n_high": 8151, + "n_low": 1388 + }, + "450+": { + "ci_hi": 0.06428123407784736, + "ci_lo": -0.12641178976565182, + "delta": -0.02611397497630974, + "high": 1.4207643531690264, + "low": 1.4468783281453361, + "n_high": 11085, + "n_low": 2249 + } + } + }, + "fixed_horizon": { + "200-300": { + "5": { + "ctrl_delta": 10.562196876512871, + "ctrl_high": 134.07500499645127, + "ctrl_low": 123.5128081199384, + "delta": -0.23978457363404004, + "high": 54.5296651728233, + "low": 54.76944974645734, + "n_high": 406, + "n_low": 16 + }, + "10": { + "ctrl_delta": 4.517465121760921, + "ctrl_high": 142.86887773883032, + "ctrl_low": 138.3514126170694, + "delta": -1.0193901972743404, + "high": 57.28747542992467, + "low": 58.30686562719901, + "n_high": 406, + "n_low": 16 + }, + "15": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 0.5237595201197962, + "high": 69.59287887776448, + "low": 69.06911935764468, + "n_high": 406, + "n_low": 16 + }, + "20": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 6.025966940175394, + "high": 83.79424819754485, + "low": 77.76828125736945, + "n_high": 406, + "n_low": 16 + }, + "25": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 11.833448607077258, + "high": 96.76613415656512, + "low": 84.93268554948786, + "n_high": 406, + "n_low": 16 + }, + "30": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 10.237111472479995, + "high": 108.81156372868688, + "low": 98.57445225620688, + "n_high": 406, + "n_low": 16 + } + }, + "300-450": { + "5": { + "ctrl_delta": -1.8720726032451296, + "ctrl_high": 141.40352053359953, + "ctrl_low": 143.27559313684466, + "delta": 5.621329473735713, + "high": 84.03578804561302, + "low": 78.4144585718773, + "n_high": 8151, + "n_low": 1388 + }, + "10": { + "ctrl_delta": -2.5217741149373865, + "ctrl_high": 147.17517475154202, + "ctrl_low": 149.6969488664794, + "delta": 4.825890847085574, + "high": 83.96402898526826, + "low": 79.13813813818268, + "n_high": 8151, + "n_low": 1388 + }, + "15": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 3.150636907777354, + "high": 91.46250825481849, + "low": 88.31187134704113, + "n_high": 8151, + "n_low": 1388 + }, + "20": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 1.2907917054030804, + "high": 102.28672210179664, + "low": 100.99593039639356, + "n_high": 8151, + "n_low": 1388 + }, + "25": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 0.6965645087119299, + "high": 112.94221678346815, + "low": 112.24565227475622, + "n_high": 8151, + "n_low": 1386 + }, + "30": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 0.6022023843657109, + "high": 121.75001812242729, + "low": 121.14781573806158, + "n_high": 8149, + "n_low": 1386 + } + }, + "450+": { + "5": { + "ctrl_delta": 6.594196192098849, + "ctrl_high": 150.30921813237603, + "ctrl_low": 143.71502194027718, + "delta": 5.966740873482308, + "high": 98.95818908552722, + "low": 92.99144821204492, + "n_high": 11085, + "n_low": 2249 + }, + "10": { + "ctrl_delta": 6.032545488990337, + "ctrl_high": 153.76289488283052, + "ctrl_low": 147.73034939384019, + "delta": 5.832774030561964, + "high": 99.1051547352807, + "low": 93.27238070471874, + "n_high": 11085, + "n_low": 2249 + }, + "15": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 5.495322960569993, + "high": 104.85930309179422, + "low": 99.36398013122422, + "n_high": 11085, + "n_low": 2249 + }, + "20": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 5.122791520386798, + "high": 113.24115469777111, + "low": 108.11836317738431, + "n_high": 11085, + "n_low": 2249 + }, + "25": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 5.130972356236924, + "high": 123.47781891526282, + "low": 118.34684655902589, + "n_high": 11085, + "n_low": 2249 + }, + "30": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 6.60831247678064, + "high": 133.33994910829455, + "low": 126.73163663151391, + "n_high": 11083, + "n_low": 2243 + } + } + }, + "flight_matched": { + "300-450": { + "delta": 37.83791201463245, + "n": 8588.0, + "null_sd": 2.3187027729073013, + "p_two": 0.004987531172069825 + }, + "450+": { + "delta": 57.39266047830495, + "n": 10809.0, + "null_sd": 2.3090078336835527, + "p_two": 0.004987531172069825 + } + }, + "perm": { + "flight": { + "200-300": { + "delta": 1.1998152709359609, + "null_sd": 0.5884044980344758, + "p_two": 0.9326683291770573 + }, + "300-450": { + "delta": 1.4192459787268703, + "null_sd": 0.07075986476228899, + "p_two": 0.004987531172069825 + }, + "450+": { + "delta": 2.1769879475003115, + "null_sd": 0.07820076092760479, + "p_two": 0.8179551122194514 + } + }, + "hit": { + "200-300": { + "delta": -0.0249384236453202, + "null_sd": 0.09426136923999828, + "p_two": 1.0 + }, + "300-450": { + "delta": -0.0017281873796358843, + "null_sd": 0.009325378781361844, + "p_two": 0.9177057356608479 + }, + "450+": { + "delta": -0.0069970254910065866, + "null_sd": 0.006353035034557252, + "p_two": 0.34413965087281795 + } + }, + "lat_ctrl_abs": { + "200-300": { + "delta": -1.460103352647458, + "null_sd": 7.5618861498507, + "p_two": 0.7830423940149626 + }, + "300-450": { + "delta": -1.2852258669471155, + "null_sd": 0.8763986544203101, + "p_two": 0.1546134663341646 + }, + "450+": { + "delta": 0.3859285842171616, + "null_sd": 0.6532844738450136, + "p_two": 0.5187032418952618 + } + }, + "lat_disp_abs": { + "200-300": { + "delta": 13.420222555225912, + "null_sd": 10.884670509773606, + "p_two": 0.4389027431421446 + }, + "300-450": { + "delta": 2.2013016706234225, + "null_sd": 1.619075130294724, + "p_two": 0.19950124688279303 + }, + "450+": { + "delta": 5.907506765804499, + "null_sd": 1.4743719217723616, + "p_two": 0.1596009975062344 + } + }, + "lat_fixed_abs": { + "200-300": { + "delta": 8.976973808032632, + "null_sd": 6.784184222303351, + "p_two": 0.19451371571072318 + }, + "300-450": { + "delta": -0.5798184956824386, + "null_sd": 0.8743883468239285, + "p_two": 0.4837905236907731 + }, + "450+": { + "delta": 0.3146010086232067, + "null_sd": 0.6716611062946239, + "p_two": 0.6034912718204489 + } + }, + "latency": { + "300-450": { + "delta": -0.28544593665578866, + "null_sd": 0.2583629813601546, + "p_two": 0.2793017456359102 + }, + "450+": { + "delta": 0.4732062166433604, + "null_sd": 0.23564143619525074, + "p_two": 0.04488778054862843 + } + }, + "miss": { + "200-300": { + "delta": 3.591743252763365, + "null_sd": 12.0296328802293, + "p_two": 0.9925187032418953 + }, + "300-450": { + "delta": 3.7882888139351536, + "null_sd": 2.1349020451702856, + "p_two": 0.7930174563591023 + }, + "450+": { + "delta": 9.865231362453343, + "null_sd": 1.8145871377330147, + "p_two": 0.004987531172069825 + } + }, + "miss_per_tick": { + "200-300": { + "delta": -0.12429859994637926, + "null_sd": 0.8775449147702089, + "p_two": 0.9476309226932669 + }, + "300-450": { + "delta": -0.09962741785363072, + "null_sd": 0.10738549517163956, + "p_two": 0.513715710723192 + }, + "450+": { + "delta": 0.03124012994079184, + "null_sd": 0.07375711704754853, + "p_two": 0.004987531172069825 + } + }, + "speed_fixed": { + "200-300": { + "delta": 0.3307544283661743, + "null_sd": 0.4666079917748168, + "p_two": 0.5037406483790524 + }, + "300-450": { + "delta": 0.028926417068130483, + "null_sd": 0.05498235696717708, + "p_two": 0.6483790523690773 + }, + "450+": { + "delta": 0.05326757050177289, + "null_sd": 0.04225298345118286, + "p_two": 0.19950124688279303 + } + }, + "turn_ctrl": { + "200-300": { + "delta": 0.2788816255144033, + "null_sd": 0.39503671811463875, + "p_two": 0.4937655860349127 + }, + "300-450": { + "delta": 0.15612326429197632, + "null_sd": 0.04014372947252553, + "p_two": 0.004987531172069825 + }, + "450+": { + "delta": 0.05166222898670414, + "null_sd": 0.026764876337891052, + "p_two": 0.05486284289276808 + } + }, + "turn_fixed": { + "200-300": { + "delta": 0.514162879720854, + "null_sd": 0.3829535934905916, + "p_two": 0.19451371571072318 + }, + "300-450": { + "delta": 0.04032615014647267, + "null_sd": 0.0358874313007723, + "p_two": 0.2543640897755611 + }, + "450+": { + "delta": -0.1569318795563528, + "null_sd": 0.027079885256316886, + "p_two": 0.004987531172069825 + } + } + }, + "shots": 24280, + "tables": { + "dodge_further": { + "0-100": { + "0.50-0.75": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 0.5, + "n": 2, + "sd": 0.5 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 0.5, + "n": 4, + "sd": 0.5 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 1.0, + "n": 1, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 0.25, + "n": 8, + "sd": 0.4330127018922193 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 0.581081081081081, + "n": 74, + "sd": 0.4933820611764509 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 0.5625, + "n": 16, + "sd": 0.49607837082461076 + }, + "0.75-1.00": { + "mean": 0.6666666666666666, + "n": 3, + "sd": 0.4714045207910317 + }, + "1.00-1.50": { + "mean": 0.5763546798029556, + "n": 406, + "sd": 0.4941355713487829 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 0.8235294117647058, + "n": 17, + "sd": 0.3812200410828153 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 0.6051873198847262, + "n": 1388, + "sd": 0.4888104210585821 + }, + "0.75-1.00": { + "mean": 0.594488188976378, + "n": 254, + "sd": 0.4909908167613365 + }, + "1.00-1.50": { + "mean": 0.5899889584100111, + "n": 8151, + "sd": 0.4918353254538365 + }, + "<0.50": { + "mean": 0.5490196078431373, + "n": 51, + "sd": 0.49759127609605963 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 0.5833703868385949, + "n": 2249, + "sd": 0.4930003839738698 + }, + "0.75-1.00": { + "mean": 0.5789473684210527, + "n": 456, + "sd": 0.49372797471825575 + }, + "1.00-1.50": { + "mean": 0.606044203879116, + "n": 11085, + "sd": 0.48862524169719734 + }, + "<0.50": { + "mean": 0.591304347826087, + "n": 115, + "sd": 0.4915928356557416 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "flight": { + "0-100": { + "0.50-0.75": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 9.0, + "n": 2, + "sd": 0.0 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 11.5, + "n": 4, + "sd": 1.8027756377319946 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 8.0, + "n": 1, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 13.25, + "n": 8, + "sd": 1.5612494995995996 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 14.716216216216216, + "n": 74, + "sd": 3.7218139658631233 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 15.4375, + "n": 16, + "sd": 2.178553132241672 + }, + "0.75-1.00": { + "mean": 16.666666666666668, + "n": 3, + "sd": 2.494438257849294 + }, + "1.00-1.50": { + "mean": 16.51231527093596, + "n": 406, + "sd": 2.576627814737342 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 21.0, + "n": 17, + "sd": 4.101649596414192 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 22.358069164265128, + "n": 1388, + "sd": 2.1353751004036265 + }, + "0.75-1.00": { + "mean": 23.519685039370078, + "n": 254, + "sd": 2.3488995369444963 + }, + "1.00-1.50": { + "mean": 23.777573303889092, + "n": 8151, + "sd": 2.626267572857679 + }, + "<0.50": { + "mean": 21.0, + "n": 51, + "sd": 2.0863703354080236 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 27.749221876389505, + "n": 2249, + "sd": 3.2018614763010804 + }, + "0.75-1.00": { + "mean": 29.25657894736842, + "n": 456, + "sd": 3.442185487154613 + }, + "1.00-1.50": { + "mean": 29.92810103743798, + "n": 11085, + "sd": 3.494588851758686 + }, + "<0.50": { + "mean": 26.860869565217392, + "n": 115, + "sd": 2.8250031366561705 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "hit": { + "0-100": { + "0.50-0.75": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 0.5, + "n": 2, + "sd": 0.5 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 0.5, + "n": 4, + "sd": 0.5 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 0.0, + "n": 1, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 0.5, + "n": 8, + "sd": 0.5 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 0.20270270270270271, + "n": 74, + "sd": 0.4020128319092842 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 0.1875, + "n": 16, + "sd": 0.3903123748998999 + }, + "0.75-1.00": { + "mean": 0.3333333333333333, + "n": 3, + "sd": 0.4714045207910317 + }, + "1.00-1.50": { + "mean": 0.1625615763546798, + "n": 406, + "sd": 0.3689651883955469 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 0.0, + "n": 17, + "sd": 0.0 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 0.11815561959654179, + "n": 1388, + "sd": 0.32279230033304557 + }, + "0.75-1.00": { + "mean": 0.1220472440944882, + "n": 254, + "sd": 0.32734036461064286 + }, + "1.00-1.50": { + "mean": 0.11642743221690591, + "n": 8151, + "sd": 0.3207367849877586 + }, + "<0.50": { + "mean": 0.0, + "n": 51, + "sd": 0.0 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 0.09648732770120054, + "n": 2249, + "sd": 0.295258400886887 + }, + "0.75-1.00": { + "mean": 0.10307017543859649, + "n": 456, + "sd": 0.30405051286530244 + }, + "1.00-1.50": { + "mean": 0.08949030221019395, + "n": 11085, + "sd": 0.2854501497994389 + }, + "<0.50": { + "mean": 0.017391304347826087, + "n": 115, + "sd": 0.13072431633367745 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "lat_ctrl_abs": { + "0-100": { + "0.50-0.75": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 6.617511427403315, + "n": 1, + "sd": 0.0 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 55.92449738909183, + "n": 3, + "sd": 38.5231878816241 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 20.123914707290524, + "n": 1, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 53.95530227690641, + "n": 8, + "sd": 22.909048254803473 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 51.676851492074036, + "n": 69, + "sd": 27.608785726257175 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 51.959541685328425, + "n": 15, + "sd": 32.89468871349487 + }, + "0.75-1.00": { + "mean": 42.9490022107608, + "n": 3, + "sd": 31.163170299685618 + }, + "1.00-1.50": { + "mean": 50.49943833268097, + "n": 405, + "sd": 29.267554797326408 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 46.2519800834997, + "n": 9, + "sd": 30.70271712030645 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 53.97707011207166, + "n": 1362, + "sd": 29.212432704230597 + }, + "0.75-1.00": { + "mean": 53.447939843923194, + "n": 252, + "sd": 28.820846628278364 + }, + "1.00-1.50": { + "mean": 52.69184424512454, + "n": 8118, + "sd": 28.887405364060335 + }, + "<0.50": { + "mean": 39.766202450291594, + "n": 43, + "sd": 27.845326318870505 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 52.618645108889034, + "n": 2212, + "sd": 29.243370367577963 + }, + "0.75-1.00": { + "mean": 51.97961958749894, + "n": 454, + "sd": 29.839150188753003 + }, + "1.00-1.50": { + "mean": 53.004573693106195, + "n": 11037, + "sd": 29.287361315166404 + }, + "<0.50": { + "mean": 57.71123074627609, + "n": 95, + "sd": 29.042748473286572 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "lat_disp_abs": { + "0-100": { + "0.50-0.75": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 50.56426194931887, + "n": 2, + "sd": 2.708113466971305 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 59.969802316357935, + "n": 4, + "sd": 16.987844688715104 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 6.276762349836467, + "n": 1, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 71.39752591465388, + "n": 8, + "sd": 23.662651418894768 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 63.01491367671746, + "n": 74, + "sd": 40.23251413655876 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 58.55155954895611, + "n": 16, + "sd": 36.32297044058878 + }, + "0.75-1.00": { + "mean": 61.90115849229301, + "n": 3, + "sd": 42.96599980216771 + }, + "1.00-1.50": { + "mean": 71.26247703390105, + "n": 406, + "sd": 41.051971139132235 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 109.05217501586472, + "n": 17, + "sd": 50.04789384201907 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 91.34911329631785, + "n": 1388, + "sd": 53.07526677642685 + }, + "0.75-1.00": { + "mean": 94.37443774461744, + "n": 254, + "sd": 56.44475473720298 + }, + "1.00-1.50": { + "mean": 93.55971008808042, + "n": 8151, + "sd": 57.18965507365259 + }, + "<0.50": { + "mean": 68.89942416557358, + "n": 51, + "sd": 44.90882734813093 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 96.90037028494287, + "n": 2249, + "sd": 61.29988617140536 + }, + "0.75-1.00": { + "mean": 102.5041154915196, + "n": 456, + "sd": 63.552995520557815 + }, + "1.00-1.50": { + "mean": 102.73960655561707, + "n": 11085, + "sd": 65.79944447783136 + }, + "<0.50": { + "mean": 104.9672273079576, + "n": 115, + "sd": 66.59348137955459 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "lat_disp_per_tick": { + "0-100": { + "0.50-0.75": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 5.618251327702097, + "n": 2, + "sd": 0.30090149633014507 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 5.112897375253502, + "n": 4, + "sd": 0.9235517282232757 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 0.7845952937295584, + "n": 1, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 5.336717261234323, + "n": 8, + "sd": 1.5834078148605033 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 4.115432670315166, + "n": 74, + "sd": 2.231469022268207 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 3.6985222610054476, + "n": 16, + "sd": 2.0949743658184943 + }, + "0.75-1.00": { + "mean": 3.431682379870622, + "n": 3, + "sd": 1.912517839787989 + }, + "1.00-1.50": { + "mean": 4.223401051428324, + "n": 406, + "sd": 2.226893559388663 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 5.037718577002433, + "n": 17, + "sd": 1.7996003446514046 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 4.06940110839537, + "n": 1388, + "sd": 2.291463326680847 + }, + "0.75-1.00": { + "mean": 4.003835899424362, + "n": 254, + "sd": 2.3241888736527723 + }, + "1.00-1.50": { + "mean": 3.913582946400491, + "n": 8151, + "sd": 2.292250880695977 + }, + "<0.50": { + "mean": 3.288780480753814, + "n": 51, + "sd": 2.110227448638238 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 3.5252693483341555, + "n": 2249, + "sd": 2.212233595597083 + }, + "0.75-1.00": { + "mean": 3.5447306289928604, + "n": 456, + "sd": 2.175476364481103 + }, + "1.00-1.50": { + "mean": 3.476787740836584, + "n": 11085, + "sd": 2.2217558032948452 + }, + "<0.50": { + "mean": 3.932536304929264, + "n": 115, + "sd": 2.4373898109640213 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "lat_fixed_abs": { + "0-100": { + "0.50-0.75": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 72.07521193989942, + "n": 2, + "sd": 3.6531526560760383 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 63.82871881553273, + "n": 4, + "sd": 6.651671114367867 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 3.660888686715694, + "n": 1, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 63.355333124285224, + "n": 8, + "sd": 18.970059771696924 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 49.325976274702086, + "n": 74, + "sd": 25.14992811960984 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 41.73417329466597, + "n": 16, + "sd": 29.01583622138892 + }, + "0.75-1.00": { + "mean": 28.575779661381187, + "n": 3, + "sd": 28.879643664297717 + }, + "1.00-1.50": { + "mean": 50.711147102698604, + "n": 406, + "sd": 27.437519183426737 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 54.649485734890675, + "n": 17, + "sd": 24.94093544795416 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 53.98566539623289, + "n": 1388, + "sd": 31.01870843271513 + }, + "0.75-1.00": { + "mean": 54.2078655198878, + "n": 254, + "sd": 31.214380954458814 + }, + "1.00-1.50": { + "mean": 53.40584690055045, + "n": 8151, + "sd": 30.626885972776332 + }, + "<0.50": { + "mean": 46.101103604871, + "n": 51, + "sd": 27.054312537757518 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 55.53246059763181, + "n": 2249, + "sd": 31.023788448909812 + }, + "0.75-1.00": { + "mean": 56.07821340466638, + "n": 456, + "sd": 30.75935598699881 + }, + "1.00-1.50": { + "mean": 55.84706160625502, + "n": 11085, + "sd": 30.641459946042584 + }, + "<0.50": { + "mean": 61.57827087484883, + "n": 115, + "sd": 30.165689659261737 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "latency": { + "0-100": { + "0.50-0.75": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 5.5, + "n": 2, + "sd": 1.5 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 4.0, + "n": 3, + "sd": 0.0 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 2.0, + "n": 1, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 9.25, + "n": 4, + "sd": 3.897114317029974 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 7.39622641509434, + "n": 53, + "sd": 4.675668139689748 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 9.285714285714286, + "n": 7, + "sd": 5.229430062206608 + }, + "0.75-1.00": { + "mean": 10.5, + "n": 2, + "sd": 5.5 + }, + "1.00-1.50": { + "mean": 7.580858085808581, + "n": 303, + "sd": 4.900922313984904 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 9.214285714285714, + "n": 14, + "sd": 5.966317019360454 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 12.03364737550471, + "n": 743, + "sd": 6.2252642482425875 + }, + "0.75-1.00": { + "mean": 13.05921052631579, + "n": 152, + "sd": 6.485036980610766 + }, + "1.00-1.50": { + "mean": 11.748201438848922, + "n": 5004, + "sd": 6.754172908746483 + }, + "<0.50": { + "mean": 11.863636363636363, + "n": 22, + "sd": 7.053660909868361 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 13.889498970487303, + "n": 1457, + "sd": 8.057327598295325 + }, + "0.75-1.00": { + "mean": 14.26517571884984, + "n": 313, + "sd": 7.970991819850656 + }, + "1.00-1.50": { + "mean": 14.362705187130663, + "n": 7615, + "sd": 8.476828780180847 + }, + "<0.50": { + "mean": 13.785714285714286, + "n": 70, + "sd": 7.802733691548398 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "miss": { + "0-100": { + "0.50-0.75": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 28.339464951848832, + "n": 2, + "sd": 19.279520668374722 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 34.3485472673581, + "n": 4, + "sd": 20.708027261247597 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 58.349138458096355, + "n": 1, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 32.743273003237626, + "n": 8, + "sd": 20.017413366763343 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 62.4508709073082, + "n": 74, + "sd": 42.4554405849317 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 70.50169834054086, + "n": 16, + "sd": 48.63114679492624 + }, + "0.75-1.00": { + "mean": 71.06975277254644, + "n": 3, + "sd": 49.51351954522248 + }, + "1.00-1.50": { + "mean": 73.02973496713113, + "n": 406, + "sd": 49.56036544506678 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 112.28461723033688, + "n": 17, + "sd": 53.10299513237958 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 106.21899999749529, + "n": 1388, + "sd": 71.02183927466143 + }, + "0.75-1.00": { + "mean": 111.85528065630947, + "n": 254, + "sd": 74.68662433839884 + }, + "1.00-1.50": { + "mean": 109.93492335905549, + "n": 8151, + "sd": 74.1256968189218 + }, + "<0.50": { + "mean": 100.28022836484377, + "n": 51, + "sd": 67.03624625519598 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 122.00107342531992, + "n": 2249, + "sd": 82.36500474718763 + }, + "0.75-1.00": { + "mean": 130.11293151375355, + "n": 456, + "sd": 89.27510693882792 + }, + "1.00-1.50": { + "mean": 131.85947851489158, + "n": 11085, + "sd": 88.85452580060314 + }, + "<0.50": { + "mean": 131.41233727504073, + "n": 115, + "sd": 80.51704776614504 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "miss_per_tick": { + "0-100": { + "0.50-0.75": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 3.148829439094315, + "n": 2, + "sd": 2.1421689631527467 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 2.887419206915786, + "n": 4, + "sd": 1.7043965692125127 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 7.293642307262044, + "n": 1, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 2.5073374632168433, + "n": 8, + "sd": 1.5641337402304887 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 4.574646090798095, + "n": 74, + "sd": 3.402378376796082 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 4.860995106850723, + "n": 16, + "sd": 3.625091208712004 + }, + "0.75-1.00": { + "mean": 4.684110384620641, + "n": 3, + "sd": 3.221576658650579 + }, + "1.00-1.50": { + "mean": 4.675877477830493, + "n": 406, + "sd": 3.4509856422757084 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 5.456699536320156, + "n": 17, + "sd": 2.6377174248556523 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 4.939121126978718, + "n": 1388, + "sd": 3.5425143327858866 + }, + "0.75-1.00": { + "mean": 4.964874321287882, + "n": 254, + "sd": 3.5798709426268203 + }, + "1.00-1.50": { + "mean": 4.834435468512022, + "n": 8151, + "sd": 3.528646219750578 + }, + "<0.50": { + "mean": 4.933073717441192, + "n": 51, + "sd": 3.5476129880792393 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 4.556228542780454, + "n": 2249, + "sd": 3.2996801937420384 + }, + "0.75-1.00": { + "mean": 4.638025700177574, + "n": 456, + "sd": 3.426396873632066 + }, + "1.00-1.50": { + "mean": 4.587713371536042, + "n": 11085, + "sd": 3.3424902205044007 + }, + "<0.50": { + "mean": 5.015806289899496, + "n": 115, + "sd": 3.3335795571007796 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "speed_ctrl": { + "0-100": { + "0.50-0.75": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 4.083333333333333, + "n": 1, + "sd": 0.0 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 6.489722222222222, + "n": 3, + "sd": 1.6843428027821268 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 4.083333333333333, + "n": 1, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 5.966646875, + "n": 8, + "sd": 1.778448514330374 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 5.880108333333333, + "n": 70, + "sd": 1.9206551111953218 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 5.504877222222222, + "n": 15, + "sd": 2.241208251251218 + }, + "0.75-1.00": { + "mean": 5.175163888888889, + "n": 3, + "sd": 1.3513719168684164 + }, + "1.00-1.50": { + "mean": 5.61272646090535, + "n": 405, + "sd": 1.8706799353237673 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 6.986761363636364, + "n": 11, + "sd": 1.4208142037647304 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 5.543130978558277, + "n": 1377, + "sd": 1.9535026040674963 + }, + "0.75-1.00": { + "mean": 5.528937615283268, + "n": 253, + "sd": 1.9317884224010418 + }, + "1.00-1.50": { + "mean": 5.474746250355873, + "n": 8135, + "sd": 1.9320364855714405 + }, + "<0.50": { + "mean": 4.5996146572104015, + "n": 47, + "sd": 1.8758165897728036 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 5.460871249279632, + "n": 2231, + "sd": 1.9632359713304537 + }, + "0.75-1.00": { + "mean": 5.472083351648351, + "n": 455, + "sd": 1.9970809534887144 + }, + "1.00-1.50": { + "mean": 5.511889742788155, + "n": 11069, + "sd": 1.9622636277556829 + }, + "<0.50": { + "mean": 5.664106871091871, + "n": 105, + "sd": 2.0144437979846255 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "speed_flight": { + "0-100": { + "0.50-0.75": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 8.0, + "n": 2, + "sd": 0.0 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 7.009920634920634, + "n": 4, + "sd": 1.1803187704382359 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 2.25, + "n": 1, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 6.767914377289378, + "n": 8, + "sd": 1.7488453979474328 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 5.448163324172459, + "n": 74, + "sd": 1.9641931476779437 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 5.16454389294964, + "n": 16, + "sd": 1.5226638866719213 + }, + "0.75-1.00": { + "mean": 5.8238095238095235, + "n": 3, + "sd": 1.4784774910731573 + }, + "1.00-1.50": { + "mean": 5.477389663434396, + "n": 406, + "sd": 1.7146426750133497 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 6.037804603949617, + "n": 17, + "sd": 1.1299149655798681 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 5.499957635028365, + "n": 1388, + "sd": 1.491464990862817 + }, + "0.75-1.00": { + "mean": 5.55547024850084, + "n": 254, + "sd": 1.4989570652778894 + }, + "1.00-1.50": { + "mean": 5.508193090233714, + "n": 8151, + "sd": 1.458420139013256 + }, + "<0.50": { + "mean": 4.805793443513115, + "n": 51, + "sd": 1.470979737873827 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 5.43091324843493, + "n": 2249, + "sd": 1.3510192428891858 + }, + "0.75-1.00": { + "mean": 5.540126105006095, + "n": 456, + "sd": 1.3285413330745552 + }, + "1.00-1.50": { + "mean": 5.510727493081691, + "n": 11085, + "sd": 1.3248739145432504 + }, + "<0.50": { + "mean": 5.736683685271347, + "n": 115, + "sd": 1.362142300132998 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "turn_ctrl": { + "0-100": { + "0.50-0.75": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 4.117833333333334, + "n": 1, + "sd": 0.0 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 3.244616666666664, + "n": 3, + "sd": 2.676918958222098 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 4.930125000000001, + "n": 1, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 2.580237499999999, + "n": 8, + "sd": 1.3300283957782204 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 2.3249751190476196, + "n": 70, + "sd": 1.4778704683017243 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 1.9571566666666664, + "n": 15, + "sd": 1.2324694787641548 + }, + "0.75-1.00": { + "mean": 2.130155555555556, + "n": 3, + "sd": 0.08712183952855702 + }, + "1.00-1.50": { + "mean": 2.2360382921810698, + "n": 405, + "sd": 1.5233084360933542 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 3.1382530303030296, + "n": 11, + "sd": 1.3503572938911623 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 1.3897918777829126, + "n": 1377, + "sd": 1.2229391357130033 + }, + "0.75-1.00": { + "mean": 1.4491598155467722, + "n": 253, + "sd": 1.201761741482847 + }, + "1.00-1.50": { + "mean": 1.545915142074889, + "n": 8135, + "sd": 1.2952906210095885 + }, + "<0.50": { + "mean": 1.1136800371496118, + "n": 47, + "sd": 0.8315649897773042 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 1.4868677133310437, + "n": 2231, + "sd": 1.2253202610349505 + }, + "0.75-1.00": { + "mean": 1.4546730402930401, + "n": 455, + "sd": 1.1496624565737659 + }, + "1.00-1.50": { + "mean": 1.5385299423177479, + "n": 11069, + "sd": 1.182750811180666 + }, + "<0.50": { + "mean": 1.3392860514670513, + "n": 105, + "sd": 1.0078637325142077 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "turn_fixed": { + "0-100": { + "0.50-0.75": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 2.9819416666666667, + "n": 2, + "sd": 0.018324999999999703 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 3.376925000000001, + "n": 4, + "sd": 0.9409541737977983 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 4.903516666666666, + "n": 1, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 1.3160229166666653, + "n": 8, + "sd": 0.7447915268618753 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 2.40609009009009, + "n": 74, + "sd": 1.5944154676380495 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 1.6825729166666668, + "n": 16, + "sd": 1.2396025278993588 + }, + "0.75-1.00": { + "mean": 1.2892249999999987, + "n": 3, + "sd": 0.4868312628812158 + }, + "1.00-1.50": { + "mean": 2.1967357963875207, + "n": 406, + "sd": 1.5600922254055216 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 2.377932352941176, + "n": 17, + "sd": 1.3086825064682288 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 1.39259340778098, + "n": 1388, + "sd": 1.1094199592320186 + }, + "0.75-1.00": { + "mean": 1.3533510170603678, + "n": 254, + "sd": 1.0519468926861506 + }, + "1.00-1.50": { + "mean": 1.4329195579274527, + "n": 8151, + "sd": 1.2118604781244657 + }, + "<0.50": { + "mean": 1.289854738562092, + "n": 51, + "sd": 0.9167515651984042 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 1.4041709278197718, + "n": 2249, + "sd": 1.1574040189659554 + }, + "0.75-1.00": { + "mean": 1.371158351608187, + "n": 456, + "sd": 1.0699612160851928 + }, + "1.00-1.50": { + "mean": 1.247239048263419, + "n": 11085, + "sd": 1.162589542096646 + }, + "<0.50": { + "mean": 1.3926873913043476, + "n": 115, + "sd": 1.1395313248007408 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "turn_flight": { + "0-100": { + "0.50-0.75": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 2.8478000000000003, + "n": 2, + "sd": 0.18077777777777881 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 3.720208621933624, + "n": 4, + "sd": 1.3407097551980935 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 3.7552249999999994, + "n": 1, + "sd": 0.0 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 1.518592233027388, + "n": 8, + "sd": 0.7265990642513144 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 2.6026520988163684, + "n": 74, + "sd": 1.4984911765927917 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 1.862280646472658, + "n": 16, + "sd": 0.9575497323952453 + }, + "0.75-1.00": { + "mean": 1.4827317261904753, + "n": 3, + "sd": 0.20406144437051127 + }, + "1.00-1.50": { + "mean": 2.4863982360654258, + "n": 406, + "sd": 1.4519873131874164 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 2.01233565432608, + "n": 17, + "sd": 0.9810519015716235 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 1.4171670660021238, + "n": 1388, + "sd": 0.9494059256897522 + }, + "0.75-1.00": { + "mean": 1.4295067106407067, + "n": 254, + "sd": 0.8982756444911537 + }, + "1.00-1.50": { + "mean": 1.5501769548793085, + "n": 8151, + "sd": 1.0227826578878658 + }, + "<0.50": { + "mean": 1.2834594448206946, + "n": 51, + "sd": 0.7690604301397242 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 1.4468783281453361, + "n": 2249, + "sd": 0.8489474483558347 + }, + "0.75-1.00": { + "mean": 1.4091125215205131, + "n": 456, + "sd": 0.762296785834484 + }, + "1.00-1.50": { + "mean": 1.4207643531690264, + "n": 11085, + "sd": 0.8030078799459991 + }, + "<0.50": { + "mean": 1.4165793506168738, + "n": 115, + "sd": 0.7769602201031014 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + } + } + }, + "tfil_ab2": { + "battles": 70, + "contrast": { + "flight": { + "0-100": { + "n_high": 2, + "n_low": 6 + }, + "100-200": { + "ci_hi": 3.1400742115027835, + "ci_lo": -0.3821839080459757, + "delta": 1.4544708777686637, + "high": 11.869565217391305, + "low": 10.415094339622641, + "n_high": 23, + "n_low": 53 + }, + "200-300": { + "ci_hi": 2.1848863587724185, + "ci_lo": 0.9582490192029738, + "delta": 1.583333333333334, + "high": 16.86025641025641, + "low": 15.276923076923078, + "n_high": 780, + "n_low": 130 + }, + "300-450": { + "ci_hi": 1.5174295614613733, + "ci_lo": 1.1775324205603077, + "delta": 1.3454372346305625, + "high": 23.70203814510097, + "low": 22.35660091047041, + "n_high": 10696, + "n_low": 5272 + }, + "450+": { + "ci_hi": 2.4380875885994797, + "ci_lo": 1.814820801890619, + "delta": 2.131597318069005, + "high": 30.516396700785055, + "low": 28.38479938271605, + "n_high": 20126, + "n_low": 12960 + } + }, + "hit": { + "0-100": { + "n_high": 2, + "n_low": 6 + }, + "100-200": { + "ci_hi": 0.4358561460010736, + "ci_lo": -0.3309438470728793, + "delta": 0.0894175553732568, + "high": 0.391304347826087, + "low": 0.3018867924528302, + "n_high": 23, + "n_low": 53 + }, + "200-300": { + "ci_hi": 0.05075297445710958, + "ci_lo": -0.10244563800385878, + "delta": -0.0217948717948718, + "high": 0.15512820512820513, + "low": 0.17692307692307693, + "n_high": 780, + "n_low": 130 + }, + "300-450": { + "ci_hi": 0.017969394735227767, + "ci_lo": -0.009132936009564024, + "delta": 0.003992245906458303, + "high": 0.11780104712041885, + "low": 0.11380880121396054, + "n_high": 10696, + "n_low": 5272 + }, + "450+": { + "ci_hi": -0.0044358098027070525, + "ci_lo": -0.02216712884816334, + "delta": -0.013412561050566624, + "high": 0.0863559574679519, + "low": 0.09976851851851852, + "n_high": 20126, + "n_low": 12960 + } + }, + "lat_ctrl_abs": { + "0-100": { + "n_high": 2, + "n_low": 5 + }, + "100-200": { + "ci_hi": 27.703880635408666, + "ci_lo": -19.545813261397257, + "delta": 3.6709471843688632, + "high": 50.58873129241841, + "low": 46.917784108049545, + "n_high": 23, + "n_low": 41 + }, + "200-300": { + "ci_hi": 15.32519158282306, + "ci_lo": -3.8693745421272254, + "delta": 5.53238939915974, + "high": 49.21214319541761, + "low": 43.67975379625787, + "n_high": 780, + "n_low": 127 + }, + "300-450": { + "ci_hi": 0.6710653003384337, + "ci_lo": -2.2048903783853646, + "delta": -0.8458175093539424, + "high": 51.954661154774776, + "low": 52.80047866412872, + "n_high": 10695, + "n_low": 5155 + }, + "450+": { + "ci_hi": 1.5786736691497438, + "ci_lo": -0.38372035657892667, + "delta": 0.610383626104209, + "high": 52.63678821664668, + "low": 52.02640459054247, + "n_high": 20120, + "n_low": 12828 + } + }, + "lat_disp_abs": { + "0-100": { + "n_high": 2, + "n_low": 6 + }, + "100-200": { + "ci_hi": 41.058969884529375, + "ci_lo": -3.77635563870318, + "delta": 18.934643886175138, + "high": 56.50017270659045, + "low": 37.56552882041531, + "n_high": 23, + "n_low": 53 + }, + "200-300": { + "ci_hi": 25.189206896863737, + "ci_lo": -0.8538553400013313, + "delta": 11.643632363530031, + "high": 71.55531510165146, + "low": 59.91168273812143, + "n_high": 780, + "n_low": 130 + }, + "300-450": { + "ci_hi": 6.276794797184124, + "ci_lo": 0.7754925214434394, + "delta": 3.468795273649235, + "high": 91.93646788106132, + "low": 88.46767260741208, + "n_high": 10696, + "n_low": 5272 + }, + "450+": { + "ci_hi": 8.307786736371384, + "ci_lo": 3.439413375305648, + "delta": 5.877366036393923, + "high": 103.29641512473457, + "low": 97.41904908834064, + "n_high": 20126, + "n_low": 12960 + } + }, + "lat_disp_per_tick": { + "0-100": { + "n_high": 2, + "n_low": 6 + }, + "100-200": { + "ci_hi": 3.229662469158459, + "ci_lo": -0.47847461210931463, + "delta": 1.3292529424508022, + "high": 4.7644501119898806, + "low": 3.4351971695390784, + "n_high": 23, + "n_low": 53 + }, + "200-300": { + "ci_hi": 1.1352747459759454, + "ci_lo": -0.38658329691680837, + "delta": 0.32886316991722797, + "high": 4.11798517665058, + "low": 3.7891220067333524, + "n_high": 780, + "n_low": 130 + }, + "300-450": { + "ci_hi": 0.029739811894474055, + "ci_lo": -0.1854091742866273, + "delta": -0.07850967222211835, + "high": 3.8603924732460864, + "low": 3.9389021454682047, + "n_high": 10696, + "n_low": 5272 + }, + "450+": { + "ci_hi": 0.03177863072117004, + "ci_lo": -0.11562879559953076, + "delta": -0.04268018526784534, + "high": 3.4243989676673565, + "low": 3.467079152935202, + "n_high": 20126, + "n_low": 12960 + } + }, + "lat_fixed_abs": { + "0-100": { + "n_high": 2, + "n_low": 6 + }, + "100-200": { + "ci_hi": 37.801935222141296, + "ci_lo": -4.15040507601713, + "delta": 16.205145269375528, + "high": 59.46718326269751, + "low": 43.26203799332198, + "n_high": 23, + "n_low": 52 + }, + "200-300": { + "ci_hi": 12.885792068736542, + "ci_lo": -5.910445510509938, + "delta": 2.8900374569580833, + "high": 50.09169789213629, + "low": 47.201660435178205, + "n_high": 780, + "n_low": 130 + }, + "300-450": { + "ci_hi": 0.08203628689458498, + "ci_lo": -2.9566362041046403, + "delta": -1.4525065310947767, + "high": 52.75137356049976, + "low": 54.203880091594534, + "n_high": 10696, + "n_low": 5272 + }, + "450+": { + "ci_hi": 0.8355743578354051, + "ci_lo": -1.1494158450891803, + "delta": -0.15419589442451098, + "high": 55.471394315727224, + "low": 55.625590210151735, + "n_high": 20126, + "n_low": 12960 + } + }, + "latency": { + "0-100": { + "n_high": 2, + "n_low": 5 + }, + "100-200": { + "ci_hi": 3.4453781512605035, + "ci_lo": -4.232919254658386, + "delta": 0.0926724137931032, + "high": 6.4375, + "low": 6.344827586206897, + "n_high": 16, + "n_low": 29 + }, + "200-300": { + "ci_hi": 0.21162209175907876, + "ci_lo": -2.9226230191826517, + "delta": -1.3489625804113432, + "high": 7.676678445229682, + "low": 9.025641025641026, + "n_high": 566, + "n_low": 78 + }, + "300-450": { + "ci_hi": 0.29606973716524365, + "ci_lo": -0.4675383609461452, + "delta": -0.09448814566257724, + "high": 11.45874635568513, + "low": 11.553234501347708, + "n_high": 6860, + "n_low": 2968 + }, + "450+": { + "ci_hi": 0.9949699079712531, + "ci_lo": 0.35990935446253935, + "delta": 0.6773768913997049, + "high": 14.27470469605301, + "low": 13.597327804653306, + "n_high": 13884, + "n_low": 8682 + } + }, + "miss": { + "0-100": { + "n_high": 2, + "n_low": 6 + }, + "100-200": { + "ci_hi": 31.08305753861211, + "ci_lo": -18.334168405972527, + "delta": 4.886788639751941, + "high": 47.91691117103256, + "low": 43.03012253128062, + "n_high": 23, + "n_low": 53 + }, + "200-300": { + "ci_hi": 11.93090451251993, + "ci_lo": -11.416893117111442, + "delta": 0.4045708511166879, + "high": 74.71615889047352, + "low": 74.31158803935683, + "n_high": 780, + "n_low": 130 + }, + "300-450": { + "ci_hi": 9.070073142167956, + "ci_lo": 2.64043925034629, + "delta": 5.879367208314832, + "high": 110.55222959176946, + "low": 104.67286238345463, + "n_high": 10696, + "n_low": 5272 + }, + "450+": { + "ci_hi": 11.24718097460196, + "ci_lo": 5.391905118810911, + "delta": 8.250872104184438, + "high": 132.25653488536696, + "low": 124.00566278118252, + "n_high": 20126, + "n_low": 12960 + } + }, + "miss_per_tick": { + "0-100": { + "n_high": 2, + "n_low": 6 + }, + "100-200": { + "ci_hi": 2.2554591702940465, + "ci_lo": -2.8394191890735945, + "delta": -0.3976946880554406, + "high": 4.054060199085319, + "low": 4.451754887140759, + "n_high": 23, + "n_low": 53 + }, + "200-300": { + "ci_hi": 0.4644145235259316, + "ci_lo": -1.16140381573787, + "delta": -0.34185371862414904, + "high": 4.668253267558399, + "low": 5.0101069861825485, + "n_high": 780, + "n_low": 130 + }, + "300-450": { + "ci_hi": 0.1739907370436109, + "ci_lo": -0.1290756197249623, + "delta": 0.02617068926796673, + "high": 4.876990142817484, + "low": 4.8508194535495175, + "n_high": 10696, + "n_low": 5272 + }, + "450+": { + "ci_hi": 0.10147520383835484, + "ci_lo": -0.11653806251098686, + "delta": -0.007921326930148354, + "high": 4.510830461684959, + "low": 4.518751788615107, + "n_high": 20126, + "n_low": 12960 + } + }, + "speed_ctrl": { + "0-100": { + "n_high": 2, + "n_low": 5 + }, + "100-200": { + "ci_hi": 1.4530173167092926, + "ci_lo": -1.5456659613375123, + "delta": 0.0125895750988132, + "high": 5.855096014492753, + "low": 5.84250643939394, + "n_high": 23, + "n_low": 44 + }, + "200-300": { + "ci_hi": 0.42872482751048047, + "ci_lo": -0.8171990976812085, + "delta": -0.15981399707248123, + "high": 5.4750203205128205, + "low": 5.634834317585302, + "n_high": 780, + "n_low": 127 + }, + "300-450": { + "ci_hi": 0.047862264171341984, + "ci_lo": -0.141382721004212, + "delta": -0.04959568850814211, + "high": 5.446102483794565, + "low": 5.495698172302707, + "n_high": 10696, + "n_low": 5211 + }, + "450+": { + "ci_hi": 0.0872114499229415, + "ci_lo": -0.06371663592924381, + "delta": 0.013462567120586577, + "high": 5.469208434805172, + "low": 5.455745867684586, + "n_high": 20126, + "n_low": 12902 + } + }, + "speed_flight": { + "0-100": { + "n_high": 2, + "n_low": 6 + }, + "100-200": { + "ci_hi": 1.5510672803406287, + "ci_lo": -1.7970431890102656, + "delta": 0.004038170928515328, + "high": 6.0509069779495865, + "low": 6.046868807021071, + "n_high": 23, + "n_low": 53 + }, + "200-300": { + "ci_hi": 0.5936436755562315, + "ci_lo": -0.5139611633917056, + "delta": 0.04950455601684478, + "high": 5.44110577260184, + "low": 5.391601216584995, + "n_high": 780, + "n_low": 130 + }, + "300-450": { + "ci_hi": 0.09520338303738463, + "ci_lo": -0.08157259843860754, + "delta": 0.006677048150627307, + "high": 5.491856931951072, + "low": 5.485179883800445, + "n_high": 10696, + "n_low": 5272 + }, + "450+": { + "ci_hi": 0.08242250630342518, + "ci_lo": -0.05728223439426294, + "delta": 0.010851714175632132, + "high": 5.47515439586977, + "low": 5.464302681694138, + "n_high": 20126, + "n_low": 12960 + } + }, + "turn_ctrl": { + "0-100": { + "n_high": 2, + "n_low": 5 + }, + "100-200": { + "ci_hi": 2.279185916666666, + "ci_lo": -0.3510002042483662, + "delta": 0.8385218544137012, + "high": 3.039410869565217, + "low": 2.2008890151515157, + "n_high": 23, + "n_low": 44 + }, + "200-300": { + "ci_hi": 0.8772148764591261, + "ci_lo": -0.04253545207691145, + "delta": 0.4074286492193282, + "high": 2.190603386752137, + "low": 1.7831747375328086, + "n_high": 780, + "n_low": 127 + }, + "300-450": { + "ci_hi": 0.21493515567928845, + "ci_lo": 0.05305284115398101, + "delta": 0.1347852704013086, + "high": 1.5729784935178261, + "low": 1.4381932231165175, + "n_high": 10696, + "n_low": 5211 + }, + "450+": { + "ci_hi": 0.11914725269156579, + "ci_lo": 0.0075277621622820146, + "delta": 0.06358267373822324, + "high": 1.5825974207630815, + "low": 1.5190147470248583, + "n_high": 20126, + "n_low": 12902 + } + }, + "turn_fixed": { + "0-100": { + "n_high": 2, + "n_low": 6 + }, + "100-200": { + "ci_hi": 1.8916857996633005, + "ci_lo": -0.543365078236131, + "delta": 0.5741256972928639, + "high": 2.663519565217392, + "low": 2.089393867924528, + "n_high": 23, + "n_low": 53 + }, + "200-300": { + "ci_hi": 0.791195473310758, + "ci_lo": -0.14564611803551086, + "delta": 0.3161265491452998, + "high": 2.2219028311965814, + "low": 1.9057762820512816, + "n_high": 780, + "n_low": 130 + }, + "300-450": { + "ci_hi": 0.11057826423897854, + "ci_lo": -0.04232638760571272, + "delta": 0.03436896479484153, + "high": 1.4990659662490653, + "low": 1.4646970014542238, + "n_high": 10696, + "n_low": 5272 + }, + "450+": { + "ci_hi": -0.10069657937150489, + "ci_lo": -0.19838250355442866, + "delta": -0.14848471999442348, + "high": 1.280381113981914, + "low": 1.4288658339763374, + "n_high": 20126, + "n_low": 12960 + } + }, + "turn_flight": { + "0-100": { + "n_high": 2, + "n_low": 6 + }, + "100-200": { + "ci_hi": 2.210708684167244, + "ci_lo": -0.3283349550727044, + "delta": 0.8472941394934947, + "high": 2.855961124358734, + "low": 2.0086669848652394, + "n_high": 23, + "n_low": 53 + }, + "200-300": { + "ci_hi": 0.9153532185233433, + "ci_lo": -0.07574850144013423, + "delta": 0.40305831352065447, + "high": 2.486846908243533, + "low": 2.0837885947228787, + "n_high": 780, + "n_low": 130 + }, + "300-450": { + "ci_hi": 0.20731395668546715, + "ci_lo": 0.04837463285073107, + "delta": 0.12892892949570434, + "high": 1.6096593549183502, + "low": 1.4807304254226459, + "n_high": 10696, + "n_low": 5272 + }, + "450+": { + "ci_hi": 0.022267725574367736, + "ci_lo": -0.08539923877200017, + "delta": -0.030122605350308973, + "high": 1.4611714876946271, + "low": 1.491294093044936, + "n_high": 20126, + "n_low": 12960 + } + } + }, + "fixed_horizon": { + "200-300": { + "5": { + "ctrl_delta": 4.1114864850652, + "ctrl_high": 136.7553725190195, + "ctrl_low": 132.6438860339543, + "delta": -1.4952187676509183, + "high": 54.040611325940446, + "low": 55.535830093591365, + "n_high": 780, + "n_low": 130 + }, + "10": { + "ctrl_delta": 3.0034524754613017, + "ctrl_high": 144.83486891076583, + "ctrl_low": 141.83141643530453, + "delta": -2.7612592254738715, + "high": 57.38815308320545, + "low": 60.149412308679324, + "n_high": 780, + "n_low": 130 + }, + "15": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": -3.2803581583315093, + "high": 69.09235175742272, + "low": 72.37270991575423, + "n_high": 780, + "n_low": 130 + }, + "20": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": -1.2875947248105746, + "high": 82.53778345632648, + "low": 83.82537818113705, + "n_high": 780, + "n_low": 130 + }, + "25": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": -0.6918243038312824, + "high": 93.80948283414962, + "low": 94.5013071379809, + "n_high": 780, + "n_low": 129 + }, + "30": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 1.0496264197550005, + "high": 105.21206929810776, + "low": 104.16244287835276, + "n_high": 780, + "n_low": 129 + } + }, + "300-450": { + "5": { + "ctrl_delta": 1.3497259552823664, + "ctrl_high": 141.47358740863845, + "ctrl_low": 140.12386145335608, + "delta": 2.674594826440341, + "high": 82.76633405903684, + "low": 80.0917392325965, + "n_high": 10696, + "n_low": 5272 + }, + "10": { + "ctrl_delta": 0.9108050770643388, + "ctrl_high": 146.68559159512267, + "ctrl_low": 145.77478651805833, + "delta": 3.1749389830277295, + "high": 83.44772254463825, + "low": 80.27278356161052, + "n_high": 10696, + "n_low": 5272 + }, + "15": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 3.4588820478335123, + "high": 91.38722598345463, + "low": 87.92834393562111, + "n_high": 10696, + "n_low": 5272 + }, + "20": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 2.948163816254336, + "high": 102.43170986402004, + "low": 99.4835460477657, + "n_high": 10696, + "n_low": 5272 + }, + "25": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 2.4614103818017696, + "high": 113.47182602630492, + "low": 111.01041564450315, + "n_high": 10696, + "n_low": 5264 + }, + "30": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 2.2014855363484855, + "high": 122.47338169848732, + "low": 120.27189616213883, + "n_high": 10696, + "n_low": 5258 + } + }, + "450+": { + "5": { + "ctrl_delta": 5.570114934737546, + "ctrl_high": 149.7483702105451, + "ctrl_low": 144.17825527580754, + "delta": 4.214368200568089, + "high": 99.09339455850068, + "low": 94.87902635793259, + "n_high": 20126, + "n_low": 12960 + }, + "10": { + "ctrl_delta": 5.225801270603625, + "ctrl_high": 153.05161761968714, + "ctrl_low": 147.8258163490835, + "delta": 3.85553801785575, + "high": 98.87189851505386, + "low": 95.01636049719811, + "n_high": 20126, + "n_low": 12960 + }, + "15": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 3.527731688162831, + "high": 104.2514607267088, + "low": 100.72372903854597, + "n_high": 20126, + "n_low": 12960 + }, + "20": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 3.4966878232423113, + "high": 112.51419145194471, + "low": 109.0175036287024, + "n_high": 20126, + "n_low": 12960 + }, + "25": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 3.827317871044116, + "high": 122.55610397005289, + "low": 118.72878609900877, + "n_high": 20126, + "n_low": 12960 + }, + "30": { + "ctrl_delta": NaN, + "ctrl_high": NaN, + "ctrl_low": NaN, + "delta": 4.744839137966906, + "high": 132.4863174082567, + "low": 127.74147827028979, + "n_high": 20126, + "n_low": 12954 + } + } + }, + "flight_matched": { + "200-300": { + "delta": 19.2514847001377, + "n": 480.0, + "null_sd": 5.277278289695253, + "p_two": 0.004987531172069825 + }, + "300-450": { + "delta": 38.587314239452425, + "n": 15455.0, + "null_sd": 1.169918862929385, + "p_two": 0.004987531172069825 + }, + "450+": { + "delta": 59.051194643051744, + "n": 29975.0, + "null_sd": 1.08575261327812, + "p_two": 0.004987531172069825 + } + }, + "perm": { + "flight": { + "100-200": { + "delta": 1.473338802296965, + "null_sd": 0.556956758926469, + "p_two": 0.5835411471321695 + }, + "200-300": { + "delta": 1.5525641025641033, + "null_sd": 0.20856042603213584, + "p_two": 0.3192019950124688 + }, + "300-450": { + "delta": 1.349208673015898, + "null_sd": 0.04362546529948333, + "p_two": 0.004987531172069825 + }, + "450+": { + "delta": 2.131466568769305, + "null_sd": 0.03857204939208006, + "p_two": 0.014962593516209476 + } + }, + "hit": { + "100-200": { + "delta": 0.0894175553732568, + "null_sd": 0.11468298641187769, + "p_two": 0.57356608478803 + }, + "200-300": { + "delta": -0.0217948717948718, + "null_sd": 0.033835646770189014, + "p_two": 0.6683291770573566 + }, + "300-450": { + "delta": 0.003992245906458303, + "null_sd": 0.005358483615821702, + "p_two": 0.428927680798005 + }, + "450+": { + "delta": -0.013412561050566624, + "null_sd": 0.0033154758523642, + "p_two": 0.004987531172069825 + } + }, + "lat_ctrl_abs": { + "100-200": { + "delta": 3.6709471843688632, + "null_sd": 7.942796693464658, + "p_two": 0.683291770573566 + }, + "200-300": { + "delta": 5.53238939915974, + "null_sd": 2.951420386597066, + "p_two": 0.09476309226932668 + }, + "300-450": { + "delta": -0.8458175093539424, + "null_sd": 0.49161173221498405, + "p_two": 0.09476309226932668 + }, + "450+": { + "delta": 0.610383626104209, + "null_sd": 0.3385393736708803, + "p_two": 0.0798004987531172 + } + }, + "lat_disp_abs": { + "100-200": { + "delta": 19.40146731718493, + "null_sd": 7.560783535503733, + "p_two": 0.07481296758104738 + }, + "200-300": { + "delta": 11.592148620900673, + "null_sd": 3.7719453871090027, + "p_two": 0.07481296758104738 + }, + "300-450": { + "delta": 3.496995115977228, + "null_sd": 0.8946876610016066, + "p_two": 0.44389027431421446 + }, + "450+": { + "delta": 5.865111399487489, + "null_sd": 0.6794354326848626, + "p_two": 0.004987531172069825 + } + }, + "lat_fixed_abs": { + "100-200": { + "delta": 16.205145269375528, + "null_sd": 6.822448122427615, + "p_two": 0.0199501246882793 + }, + "200-300": { + "delta": 2.8900374569580833, + "null_sd": 2.7385410861299175, + "p_two": 0.26932668329177056 + }, + "300-450": { + "delta": -1.4525065310947767, + "null_sd": 0.5211374129788454, + "p_two": 0.004987531172069825 + }, + "450+": { + "delta": -0.15419589442451098, + "null_sd": 0.3404159528924756, + "p_two": 0.6633416458852868 + } + }, + "latency": { + "100-200": { + "delta": 0.0926724137931032, + "null_sd": 1.2100361802355357, + "p_two": 0.8977556109725686 + }, + "200-300": { + "delta": -1.3489625804113432, + "null_sd": 0.6279066443351822, + "p_two": 0.034912718204488775 + }, + "300-450": { + "delta": -0.09448814566257724, + "null_sd": 0.14536953176648718, + "p_two": 0.4837905236907731 + }, + "450+": { + "delta": 0.6773768913997049, + "null_sd": 0.11658431631707712, + "p_two": 0.004987531172069825 + } + }, + "miss": { + "100-200": { + "delta": 5.353612070761727, + "null_sd": 7.076975850478476, + "p_two": 0.8927680798004988 + }, + "200-300": { + "delta": 0.34759363710234936, + "null_sd": 4.610721786395759, + "p_two": 0.38902743142144636 + }, + "300-450": { + "delta": 5.913375533477691, + "null_sd": 1.285303458071748, + "p_two": 0.2743142144638404 + }, + "450+": { + "delta": 8.238469710701466, + "null_sd": 1.040424273858285, + "p_two": 0.004987531172069825 + } + }, + "miss_per_tick": { + "100-200": { + "delta": -0.3543711417987625, + "null_sd": 0.691931289558753, + "p_two": 0.6234413965087282 + }, + "200-300": { + "delta": -0.3415292081424033, + "null_sd": 0.33232655173559145, + "p_two": 0.5236907730673317 + }, + "300-450": { + "delta": 0.026408909881282305, + "null_sd": 0.0644831850754759, + "p_two": 0.00997506234413965 + }, + "450+": { + "delta": -0.008124648296730541, + "null_sd": 0.04016664265423111, + "p_two": 0.004987531172069825 + } + }, + "speed_fixed": { + "100-200": { + "delta": 0.08586543614984876, + "null_sd": 0.5332221255741902, + "p_two": 0.912718204488778 + }, + "200-300": { + "delta": 0.02094948717948686, + "null_sd": 0.1772020218686483, + "p_two": 0.8528678304239401 + }, + "300-450": { + "delta": -0.05009719924702516, + "null_sd": 0.0325574186246455, + "p_two": 0.13466334164588528 + }, + "450+": { + "delta": -0.006990610016273102, + "null_sd": 0.022005529692951956, + "p_two": 0.7581047381546134 + } + }, + "turn_ctrl": { + "100-200": { + "delta": 0.8385218544137012, + "null_sd": 0.4421570053850438, + "p_two": 0.059850374064837904 + }, + "200-300": { + "delta": 0.4074286492193282, + "null_sd": 0.15420136905487, + "p_two": 0.004987531172069825 + }, + "300-450": { + "delta": 0.1347852704013086, + "null_sd": 0.020967316617011986, + "p_two": 0.004987531172069825 + }, + "450+": { + "delta": 0.06358267373822324, + "null_sd": 0.013693960030510587, + "p_two": 0.004987531172069825 + } + }, + "turn_fixed": { + "100-200": { + "delta": 0.5741256972928639, + "null_sd": 0.40578541593606854, + "p_two": 0.14962593516209477 + }, + "200-300": { + "delta": 0.3161265491452998, + "null_sd": 0.1467835976233877, + "p_two": 0.0399002493765586 + }, + "300-450": { + "delta": 0.03436896479484153, + "null_sd": 0.021077949051367888, + "p_two": 0.12468827930174564 + }, + "450+": { + "delta": -0.14848471999442348, + "null_sd": 0.012421003923621221, + "p_two": 0.004987531172069825 + } + } + }, + "shots": 54939, + "tables": { + "dodge_further": { + "0-100": { + "0.50-0.75": { + "mean": 0.5, + "n": 6, + "sd": 0.5 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 0.5, + "n": 2, + "sd": 0.5 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 0.631578947368421, + "n": 19, + "sd": 0.48237638894272 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 0.39622641509433965, + "n": 53, + "sd": 0.48911250554021585 + }, + "0.75-1.00": { + "mean": 0.6, + "n": 5, + "sd": 0.4898979485566356 + }, + "1.00-1.50": { + "mean": 0.5217391304347826, + "n": 23, + "sd": 0.49952718665548074 + }, + "<0.50": { + "mean": 0.4, + "n": 5, + "sd": 0.4898979485566356 + }, + ">=1.50": { + "mean": 0.5968586387434555, + "n": 191, + "sd": 0.49052869854960046 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 0.5384615384615384, + "n": 130, + "sd": 0.4985185152621431 + }, + "0.75-1.00": { + "mean": 0.5238095238095238, + "n": 21, + "sd": 0.4994327848429293 + }, + "1.00-1.50": { + "mean": 0.5923076923076923, + "n": 780, + "sd": 0.4914054231902904 + }, + "<0.50": { + "mean": 0.5, + "n": 6, + "sd": 0.5 + }, + ">=1.50": { + "mean": 0.7678571428571429, + "n": 56, + "sd": 0.4221996577691746 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 0.5739757207890743, + "n": 5272, + "sd": 0.4944973131714033 + }, + "0.75-1.00": { + "mean": 0.5897727272727272, + "n": 880, + "sd": 0.49187483919999053 + }, + "1.00-1.50": { + "mean": 0.6026551982049364, + "n": 10696, + "sd": 0.489348454867802 + }, + "<0.50": { + "mean": 0.5405405405405406, + "n": 333, + "sd": 0.4983537544482642 + }, + ">=1.50": { + "mean": 1.0, + "n": 1, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 0.5927469135802469, + "n": 12960, + "sd": 0.49132271474188755 + }, + "0.75-1.00": { + "mean": 0.6047854785478548, + "n": 2424, + "sd": 0.4888967206736992 + }, + "1.00-1.50": { + "mean": 0.6099075822319387, + "n": 20126, + "sd": 0.4877707692840251 + }, + "<0.50": { + "mean": 0.5610526315789474, + "n": 950, + "sd": 0.49625857793824113 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "flight": { + "0-100": { + "0.50-0.75": { + "mean": 6.5, + "n": 6, + "sd": 0.7637626158259734 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 6.5, + "n": 2, + "sd": 0.5 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 10.894736842105264, + "n": 19, + "sd": 3.9456136450508024 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 10.415094339622641, + "n": 53, + "sd": 2.1051057631669967 + }, + "0.75-1.00": { + "mean": 11.0, + "n": 5, + "sd": 1.8973665961010275 + }, + "1.00-1.50": { + "mean": 11.869565217391305, + "n": 23, + "sd": 1.984819514871883 + }, + "<0.50": { + "mean": 10.0, + "n": 5, + "sd": 2.0976176963403033 + }, + ">=1.50": { + "mean": 14.863874345549739, + "n": 191, + "sd": 3.9223221651793256 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 15.276923076923078, + "n": 130, + "sd": 1.9335713653372277 + }, + "0.75-1.00": { + "mean": 16.142857142857142, + "n": 21, + "sd": 2.3961420238874522 + }, + "1.00-1.50": { + "mean": 16.86025641025641, + "n": 780, + "sd": 2.5140038422542568 + }, + "<0.50": { + "mean": 15.333333333333334, + "n": 6, + "sd": 1.1055415967851332 + }, + ">=1.50": { + "mean": 21.946428571428573, + "n": 56, + "sd": 4.0857751618841425 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 22.35660091047041, + "n": 5272, + "sd": 2.2440948596390378 + }, + "0.75-1.00": { + "mean": 23.490909090909092, + "n": 880, + "sd": 2.5058856338463165 + }, + "1.00-1.50": { + "mean": 23.70203814510097, + "n": 10696, + "sd": 2.7139800466075914 + }, + "<0.50": { + "mean": 20.963963963963963, + "n": 333, + "sd": 2.030967141593614 + }, + ">=1.50": { + "mean": 18.0, + "n": 1, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 28.38479938271605, + "n": 12960, + "sd": 3.20534379088693 + }, + "0.75-1.00": { + "mean": 30.17986798679868, + "n": 2424, + "sd": 3.3916258719351364 + }, + "1.00-1.50": { + "mean": 30.516396700785055, + "n": 20126, + "sd": 3.587384519394333 + }, + "<0.50": { + "mean": 27.030526315789473, + "n": 950, + "sd": 3.038024762873699 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "hit": { + "0-100": { + "0.50-0.75": { + "mean": 0.6666666666666666, + "n": 6, + "sd": 0.4714045207910317 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 0.5, + "n": 2, + "sd": 0.5 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 0.3157894736842105, + "n": 19, + "sd": 0.464829519280413 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 0.3018867924528302, + "n": 53, + "sd": 0.4590764173809977 + }, + "0.75-1.00": { + "mean": 0.4, + "n": 5, + "sd": 0.4898979485566356 + }, + "1.00-1.50": { + "mean": 0.391304347826087, + "n": 23, + "sd": 0.4880422678400793 + }, + "<0.50": { + "mean": 0.2, + "n": 5, + "sd": 0.4 + }, + ">=1.50": { + "mean": 0.20418848167539266, + "n": 191, + "sd": 0.40310736240670486 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 0.17692307692307693, + "n": 130, + "sd": 0.3816035924557681 + }, + "0.75-1.00": { + "mean": 0.09523809523809523, + "n": 21, + "sd": 0.29354352395090366 + }, + "1.00-1.50": { + "mean": 0.15512820512820513, + "n": 780, + "sd": 0.36202685687930203 + }, + "<0.50": { + "mean": 0.5, + "n": 6, + "sd": 0.5 + }, + ">=1.50": { + "mean": 0.07142857142857142, + "n": 56, + "sd": 0.25753937681885636 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 0.11380880121396054, + "n": 5272, + "sd": 0.3175789004014621 + }, + "0.75-1.00": { + "mean": 0.12840909090909092, + "n": 880, + "sd": 0.3345447597571837 + }, + "1.00-1.50": { + "mean": 0.11780104712041885, + "n": 10696, + "sd": 0.3223723940069182 + }, + "<0.50": { + "mean": 0.03003003003003003, + "n": 333, + "sd": 0.17066993679739126 + }, + ">=1.50": { + "mean": 0.0, + "n": 1, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 0.09976851851851852, + "n": 12960, + "sd": 0.2996911096965316 + }, + "0.75-1.00": { + "mean": 0.0924092409240924, + "n": 2424, + "sd": 0.2896027850624463 + }, + "1.00-1.50": { + "mean": 0.0863559574679519, + "n": 20126, + "sd": 0.2808889568454858 + }, + "<0.50": { + "mean": 0.011578947368421053, + "n": 950, + "sd": 0.106980724180856 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "lat_ctrl_abs": { + "0-100": { + "0.50-0.75": { + "mean": 47.21625138004994, + "n": 5, + "sd": 30.75117882820708 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 59.18210036547579, + "n": 2, + "sd": 29.0948701112559 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 54.3268692817701, + "n": 15, + "sd": 29.10325541470395 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 46.917784108049545, + "n": 41, + "sd": 30.007840395009747 + }, + "0.75-1.00": { + "mean": 12.30261742632229, + "n": 5, + "sd": 3.4258174605725817 + }, + "1.00-1.50": { + "mean": 50.58873129241841, + "n": 23, + "sd": 29.00828889422822 + }, + "<0.50": { + "mean": 46.20098183830483, + "n": 2, + "sd": 3.50088451583197 + }, + ">=1.50": { + "mean": 45.100258849875566, + "n": 170, + "sd": 29.530499444646725 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 43.67975379625787, + "n": 127, + "sd": 32.01164563413677 + }, + "0.75-1.00": { + "mean": 49.059512777929925, + "n": 21, + "sd": 33.83538980568077 + }, + "1.00-1.50": { + "mean": 49.21214319541761, + "n": 780, + "sd": 29.86245612671833 + }, + "<0.50": { + "mean": 56.80253387034053, + "n": 6, + "sd": 33.117776686820264 + }, + ">=1.50": { + "mean": 41.61922542155979, + "n": 32, + "sd": 29.09868157061391 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 52.80047866412872, + "n": 5155, + "sd": 29.536380507598064 + }, + "0.75-1.00": { + "mean": 53.83089771547462, + "n": 877, + "sd": 29.23380486038875 + }, + "1.00-1.50": { + "mean": 51.954661154774776, + "n": 10695, + "sd": 28.806843620501702 + }, + "<0.50": { + "mean": 37.4184927138927, + "n": 265, + "sd": 31.593000770483304 + }, + ">=1.50": { + "mean": 61.94691279817114, + "n": 1, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 52.02640459054247, + "n": 12828, + "sd": 29.49958067328621 + }, + "0.75-1.00": { + "mean": 52.52841560398924, + "n": 2421, + "sd": 29.37615589063758 + }, + "1.00-1.50": { + "mean": 52.63678821664668, + "n": 20120, + "sd": 29.68974455056102 + }, + "<0.50": { + "mean": 42.34157506257748, + "n": 821, + "sd": 32.8887636857119 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "lat_disp_abs": { + "0-100": { + "0.50-0.75": { + "mean": 30.64021504475089, + "n": 6, + "sd": 14.92653145598428 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 42.811410354190095, + "n": 2, + "sd": 7.131556660826469 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 47.994349780500656, + "n": 19, + "sd": 24.13032749935146 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 37.56552882041531, + "n": 53, + "sd": 30.43201085985685 + }, + "0.75-1.00": { + "mean": 45.8493014799471, + "n": 5, + "sd": 33.9647387483235 + }, + "1.00-1.50": { + "mean": 56.50017270659045, + "n": 23, + "sd": 23.354988751176027 + }, + "<0.50": { + "mean": 46.728400885093734, + "n": 5, + "sd": 30.82973046579226 + }, + ">=1.50": { + "mean": 64.60341518389738, + "n": 191, + "sd": 39.024333864588414 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 59.91168273812143, + "n": 130, + "sd": 40.80150766008176 + }, + "0.75-1.00": { + "mean": 58.50781991733394, + "n": 21, + "sd": 42.632915954928286 + }, + "1.00-1.50": { + "mean": 71.55531510165146, + "n": 780, + "sd": 42.4402794037589 + }, + "<0.50": { + "mean": 79.800498169248, + "n": 6, + "sd": 30.16210313888696 + }, + ">=1.50": { + "mean": 103.43305934540533, + "n": 56, + "sd": 56.123430304913995 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 88.46767260741208, + "n": 5272, + "sd": 54.269056706055274 + }, + "0.75-1.00": { + "mean": 94.33894320113612, + "n": 880, + "sd": 56.2287989606859 + }, + "1.00-1.50": { + "mean": 91.93646788106132, + "n": 10696, + "sd": 57.014783210690126 + }, + "<0.50": { + "mean": 62.78851650977546, + "n": 333, + "sd": 56.48494003424647 + }, + ">=1.50": { + "mean": 57.28960653244455, + "n": 1, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 97.41904908834064, + "n": 12960, + "sd": 63.319212365578636 + }, + "0.75-1.00": { + "mean": 102.03477954909238, + "n": 2424, + "sd": 66.32390841395575 + }, + "1.00-1.50": { + "mean": 103.29641512473457, + "n": 20126, + "sd": 66.380739833294 + }, + "<0.50": { + "mean": 78.40363550501456, + "n": 950, + "sd": 62.88227927920604 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "lat_disp_per_tick": { + "0-100": { + "0.50-0.75": { + "mean": 4.664829566294595, + "n": 6, + "sd": 2.2191968444176835 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 6.540675927900533, + "n": 2, + "sd": 0.594033645673262 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 4.5379885951867065, + "n": 19, + "sd": 2.0584559510404685 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 3.4351971695390784, + "n": 53, + "sd": 2.676401108822656 + }, + "0.75-1.00": { + "mean": 3.769730174693612, + "n": 5, + "sd": 2.4480074086401657 + }, + "1.00-1.50": { + "mean": 4.7644501119898806, + "n": 23, + "sd": 1.7555902767941987 + }, + "<0.50": { + "mean": 4.383640155429889, + "n": 5, + "sd": 2.5643827415772704 + }, + ">=1.50": { + "mean": 4.217746022236908, + "n": 191, + "sd": 2.2499977540986627 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 3.7891220067333524, + "n": 130, + "sd": 2.4239083220154547 + }, + "0.75-1.00": { + "mean": 3.44894412438595, + "n": 21, + "sd": 2.316007250886723 + }, + "1.00-1.50": { + "mean": 4.11798517665058, + "n": 780, + "sd": 2.2212313297123973 + }, + "<0.50": { + "mean": 5.126027757209099, + "n": 6, + "sd": 1.776617577302923 + }, + ">=1.50": { + "mean": 4.746731088766156, + "n": 56, + "sd": 2.3693509681686575 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 3.9389021454682047, + "n": 5272, + "sd": 2.3410041268443256 + }, + "0.75-1.00": { + "mean": 3.996094750026922, + "n": 880, + "sd": 2.3008029319932857 + }, + "1.00-1.50": { + "mean": 3.8603924732460864, + "n": 10696, + "sd": 2.288678849717428 + }, + "<0.50": { + "mean": 2.963462130502309, + "n": 333, + "sd": 2.6041756748397433 + }, + ">=1.50": { + "mean": 3.182755918469142, + "n": 1, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 3.467079152935202, + "n": 12960, + "sd": 2.2425748659816285 + }, + "0.75-1.00": { + "mean": 3.4146539451554694, + "n": 2424, + "sd": 2.209830150117997 + }, + "1.00-1.50": { + "mean": 3.4243989676673565, + "n": 20126, + "sd": 2.1939148127405206 + }, + "<0.50": { + "mean": 2.89826741239308, + "n": 950, + "sd": 2.3172118689440566 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "lat_fixed_abs": { + "0-100": { + "0.50-0.75": { + "mean": 59.579497867515606, + "n": 6, + "sd": 28.31889037166739 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 85.08222342215191, + "n": 2, + "sd": 4.4533502366829865 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 55.363552065687145, + "n": 19, + "sd": 26.30211403214148 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 43.26203799332198, + "n": 52, + "sd": 31.926105941323193 + }, + "0.75-1.00": { + "mean": 46.770868412346445, + "n": 5, + "sd": 25.307337293964327 + }, + "1.00-1.50": { + "mean": 59.46718326269751, + "n": 23, + "sd": 19.873228910152303 + }, + "<0.50": { + "mean": 56.152787498679245, + "n": 5, + "sd": 25.749893701480786 + }, + ">=1.50": { + "mean": 51.68522937672502, + "n": 188, + "sd": 25.81181261447445 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 47.201660435178205, + "n": 130, + "sd": 30.121010131809975 + }, + "0.75-1.00": { + "mean": 40.98681728303937, + "n": 21, + "sd": 27.283897526807362 + }, + "1.00-1.50": { + "mean": 50.09169789213629, + "n": 780, + "sd": 27.324487062123403 + }, + "<0.50": { + "mean": 64.28791048481943, + "n": 6, + "sd": 23.65477340829907 + }, + ">=1.50": { + "mean": 54.53143047809447, + "n": 56, + "sd": 28.42000232926964 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 54.203880091594534, + "n": 5272, + "sd": 30.930173848176345 + }, + "0.75-1.00": { + "mean": 54.14416408579752, + "n": 880, + "sd": 30.911798831554933 + }, + "1.00-1.50": { + "mean": 52.75137356049976, + "n": 10696, + "sd": 30.603351689804544 + }, + "<0.50": { + "mean": 42.80804200593977, + "n": 333, + "sd": 33.840304192292514 + }, + ">=1.50": { + "mean": 38.69228248989607, + "n": 1, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 55.625590210151735, + "n": 12960, + "sd": 30.887333226136498 + }, + "0.75-1.00": { + "mean": 54.96924827531732, + "n": 2424, + "sd": 30.413956441572132 + }, + "1.00-1.50": { + "mean": 55.471394315727224, + "n": 20126, + "sd": 30.788303077783077 + }, + "<0.50": { + "mean": 45.56248061999915, + "n": 950, + "sd": 33.62940943375547 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "latency": { + "0-100": { + "0.50-0.75": { + "mean": 4.2, + "n": 5, + "sd": 0.4 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 4.0, + "n": 2, + "sd": 0.0 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 5.666666666666667, + "n": 15, + "sd": 2.2110831935702664 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 6.344827586206897, + "n": 29, + "sd": 3.4167524616317446 + }, + "0.75-1.00": { + "mean": 5.5, + "n": 2, + "sd": 1.5 + }, + "1.00-1.50": { + "mean": 6.4375, + "n": 16, + "sd": 4.527261175368613 + }, + "<0.50": { + "mean": 6.25, + "n": 4, + "sd": 3.344772040064913 + }, + ">=1.50": { + "mean": 7.0, + "n": 148, + "sd": 4.523213399725847 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 9.025641025641026, + "n": 78, + "sd": 5.186210411778525 + }, + "0.75-1.00": { + "mean": 10.0, + "n": 11, + "sd": 5.410427642315095 + }, + "1.00-1.50": { + "mean": 7.676678445229682, + "n": 566, + "sd": 4.8769002195786415 + }, + "<0.50": { + "mean": 8.333333333333334, + "n": 6, + "sd": 4.109609335312651 + }, + ">=1.50": { + "mean": 9.26530612244898, + "n": 49, + "sd": 5.0820834157916535 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 11.553234501347708, + "n": 2968, + "sd": 6.265024769312844 + }, + "0.75-1.00": { + "mean": 11.836190476190476, + "n": 525, + "sd": 6.223138448901407 + }, + "1.00-1.50": { + "mean": 11.45874635568513, + "n": 6860, + "sd": 6.6712835409951365 + }, + "<0.50": { + "mean": 10.993288590604028, + "n": 149, + "sd": 5.919478305844169 + }, + ">=1.50": { + "mean": 2.0, + "n": 1, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 13.597327804653306, + "n": 8682, + "sd": 7.931361981406761 + }, + "0.75-1.00": { + "mean": 14.569054441260745, + "n": 1745, + "sd": 8.473654737322693 + }, + "1.00-1.50": { + "mean": 14.27470469605301, + "n": 13884, + "sd": 8.575357300417421 + }, + "<0.50": { + "mean": 13.373881932021467, + "n": 559, + "sd": 7.603649754017249 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "miss": { + "0-100": { + "0.50-0.75": { + "mean": 23.963383018113465, + "n": 6, + "sd": 7.437986604844714 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 32.96827900563402, + "n": 2, + "sd": 21.47255383106524 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 37.21146348203399, + "n": 19, + "sd": 21.318968736230936 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 43.03012253128062, + "n": 53, + "sd": 23.500318655067485 + }, + "0.75-1.00": { + "mean": 33.86894195555372, + "n": 5, + "sd": 17.66244525746101 + }, + "1.00-1.50": { + "mean": 47.91691117103256, + "n": 23, + "sd": 40.68892274129111 + }, + "<0.50": { + "mean": 46.00180636762276, + "n": 5, + "sd": 23.226477701603983 + }, + ">=1.50": { + "mean": 59.00110338219948, + "n": 191, + "sd": 39.18057309234945 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 74.31158803935683, + "n": 130, + "sd": 49.847396227408844 + }, + "0.75-1.00": { + "mean": 79.82200160363949, + "n": 21, + "sd": 43.482810828767214 + }, + "1.00-1.50": { + "mean": 74.71615889047352, + "n": 780, + "sd": 49.49094380207556 + }, + "<0.50": { + "mean": 53.18647211884433, + "n": 6, + "sd": 44.34244523643521 + }, + ">=1.50": { + "mean": 113.80802951615617, + "n": 56, + "sd": 62.776021223530385 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 104.67286238345463, + "n": 5272, + "sd": 69.95665899354074 + }, + "0.75-1.00": { + "mean": 109.32032724864372, + "n": 880, + "sd": 72.78462218817842 + }, + "1.00-1.50": { + "mean": 110.55222959176946, + "n": 10696, + "sd": 73.71582516574469 + }, + "<0.50": { + "mean": 112.8439835470441, + "n": 333, + "sd": 60.335653132046616 + }, + ">=1.50": { + "mean": 177.09202932397116, + "n": 1, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 124.00566278118252, + "n": 12960, + "sd": 84.00375276710734 + }, + "0.75-1.00": { + "mean": 132.35267326508838, + "n": 2424, + "sd": 87.58027750200361 + }, + "1.00-1.50": { + "mean": 132.25653488536696, + "n": 20126, + "sd": 88.23310485884831 + }, + "<0.50": { + "mean": 130.8550947360902, + "n": 950, + "sd": 75.6698920379287 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "miss_per_tick": { + "0-100": { + "0.50-0.75": { + "mean": 3.715911940585235, + "n": 6, + "sd": 1.0739507755146913 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 4.846608014787821, + "n": 2, + "sd": 2.9306538190263587 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 3.613838250708224, + "n": 19, + "sd": 2.06818429834411 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 4.451754887140759, + "n": 53, + "sd": 2.744391943079593 + }, + "0.75-1.00": { + "mean": 3.3169427351062, + "n": 5, + "sd": 2.0992977394436614 + }, + "1.00-1.50": { + "mean": 4.054060199085319, + "n": 23, + "sd": 3.4668449577634934 + }, + "<0.50": { + "mean": 4.7667116484446375, + "n": 5, + "sd": 2.572632476609606 + }, + ">=1.50": { + "mean": 4.372622686767855, + "n": 191, + "sd": 3.1842217739860037 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 5.0101069861825485, + "n": 130, + "sd": 3.4670928803557657 + }, + "0.75-1.00": { + "mean": 5.180660601390251, + "n": 21, + "sd": 3.0722809736002077 + }, + "1.00-1.50": { + "mean": 4.668253267558399, + "n": 780, + "sd": 3.3342143732698455 + }, + "<0.50": { + "mean": 3.4060067177395155, + "n": 6, + "sd": 2.794593831551734 + }, + ">=1.50": { + "mean": 5.465401498950195, + "n": 56, + "sd": 3.3229906339951008 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 4.8508194535495175, + "n": 5272, + "sd": 3.4580659054994167 + }, + "0.75-1.00": { + "mean": 4.849172363213818, + "n": 880, + "sd": 3.480761872492741 + }, + "1.00-1.50": { + "mean": 4.876990142817484, + "n": 10696, + "sd": 3.5242009053669445 + }, + "<0.50": { + "mean": 5.521080856555471, + "n": 333, + "sd": 3.13866300340333 + }, + ">=1.50": { + "mean": 9.838446073553953, + "n": 1, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 4.518751788615107, + "n": 12960, + "sd": 3.258353775689371 + }, + "0.75-1.00": { + "mean": 4.548700988847811, + "n": 2424, + "sd": 3.2366388125477763 + }, + "1.00-1.50": { + "mean": 4.510830461684959, + "n": 20126, + "sd": 3.244531893392607 + }, + "<0.50": { + "mean": 4.973900684748863, + "n": 950, + "sd": 3.040281544033142 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "speed_ctrl": { + "0-100": { + "0.50-0.75": { + "mean": 6.0710999999999995, + "n": 5, + "sd": 1.939283589370054 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 6.229166666666666, + "n": 2, + "sd": 1.3958333333333335 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 6.331183333333333, + "n": 15, + "sd": 1.7961026750944618 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 5.84250643939394, + "n": 44, + "sd": 2.083104456983705 + }, + "0.75-1.00": { + "mean": 3.449888333333333, + "n": 5, + "sd": 0.8357875670354944 + }, + "1.00-1.50": { + "mean": 5.855096014492753, + "n": 23, + "sd": 1.673561103379372 + }, + "<0.50": { + "mean": 5.233567592592593, + "n": 3, + "sd": 1.213108558443809 + }, + ">=1.50": { + "mean": 5.732775215517242, + "n": 174, + "sd": 1.9862286874394712 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 5.634834317585302, + "n": 127, + "sd": 1.8751550115750577 + }, + "0.75-1.00": { + "mean": 6.451118253968254, + "n": 21, + "sd": 1.9436786439727738 + }, + "1.00-1.50": { + "mean": 5.4750203205128205, + "n": 780, + "sd": 1.9864513454441706 + }, + "<0.50": { + "mean": 6.315916666666666, + "n": 6, + "sd": 1.6301763433921974 + }, + ">=1.50": { + "mean": 6.531512451737452, + "n": 37, + "sd": 1.740366794354855 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 5.495698172302707, + "n": 5211, + "sd": 1.970536711240611 + }, + "0.75-1.00": { + "mean": 5.561080220197418, + "n": 878, + "sd": 1.9327321379895332 + }, + "1.00-1.50": { + "mean": 5.446102483794565, + "n": 10696, + "sd": 1.9166885655881285 + }, + "<0.50": { + "mean": 5.477705827280065, + "n": 295, + "sd": 2.064652692924689 + }, + ">=1.50": { + "mean": 5.373725, + "n": 1, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 5.455745867684586, + "n": 12902, + "sd": 1.9473522258559828 + }, + "0.75-1.00": { + "mean": 5.460318996423167, + "n": 2423, + "sd": 1.9665883468045677 + }, + "1.00-1.50": { + "mean": 5.469208434805172, + "n": 20126, + "sd": 1.9898270400418554 + }, + "<0.50": { + "mean": 5.373754200937951, + "n": 886, + "sd": 2.130090788820977 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "speed_flight": { + "0-100": { + "0.50-0.75": { + "mean": 7.3925833333333335, + "n": 6, + "sd": 1.3582249573329972 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 8.0, + "n": 2, + "sd": 0.0 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 7.446368482570062, + "n": 19, + "sd": 1.55274954697051 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 6.046868807021071, + "n": 53, + "sd": 2.1214285392427583 + }, + "0.75-1.00": { + "mean": 4.831982626262627, + "n": 5, + "sd": 1.9083374919972278 + }, + "1.00-1.50": { + "mean": 6.0509069779495865, + "n": 23, + "sd": 1.9311369110161072 + }, + "<0.50": { + "mean": 5.732590888888889, + "n": 5, + "sd": 2.316655704937818 + }, + ">=1.50": { + "mean": 5.874213729078478, + "n": 191, + "sd": 1.9437709087096937 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 5.391601216584995, + "n": 130, + "sd": 1.816332333820947 + }, + "0.75-1.00": { + "mean": 5.641279399746629, + "n": 21, + "sd": 1.6353428020450034 + }, + "1.00-1.50": { + "mean": 5.44110577260184, + "n": 780, + "sd": 1.7461748683226956 + }, + "<0.50": { + "mean": 6.177562464985994, + "n": 6, + "sd": 1.8596284104980816 + }, + ">=1.50": { + "mean": 6.198369152093142, + "n": 56, + "sd": 1.4742863129097392 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 5.485179883800445, + "n": 5272, + "sd": 1.5060900999945754 + }, + "0.75-1.00": { + "mean": 5.533642865792223, + "n": 880, + "sd": 1.4807240908916732 + }, + "1.00-1.50": { + "mean": 5.491856931951072, + "n": 10696, + "sd": 1.4636111360741952 + }, + "<0.50": { + "mean": 5.409039989906664, + "n": 333, + "sd": 1.7405703821295355 + }, + ">=1.50": { + "mean": 3.9444444444444446, + "n": 1, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 5.464302681694138, + "n": 12960, + "sd": 1.3625893180593711 + }, + "0.75-1.00": { + "mean": 5.438160057295022, + "n": 2424, + "sd": 1.329482471756138 + }, + "1.00-1.50": { + "mean": 5.47515439586977, + "n": 20126, + "sd": 1.3297898785769187 + }, + "<0.50": { + "mean": 5.366062263359946, + "n": 950, + "sd": 1.5591323110613864 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "turn_ctrl": { + "0-100": { + "0.50-0.75": { + "mean": 3.0661233333333335, + "n": 5, + "sd": 1.6556213787796485 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 2.912691666666664, + "n": 2, + "sd": 2.1291083333333356 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 3.181840555555555, + "n": 15, + "sd": 1.442477198538792 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 2.2008890151515157, + "n": 44, + "sd": 1.8596525528468728 + }, + "0.75-1.00": { + "mean": 2.6075733333333337, + "n": 5, + "sd": 1.9710590289754275 + }, + "1.00-1.50": { + "mean": 3.039410869565217, + "n": 23, + "sd": 1.5194216914331433 + }, + "<0.50": { + "mean": 2.9279314814814783, + "n": 3, + "sd": 2.0067975821445767 + }, + ">=1.50": { + "mean": 2.6141867816091957, + "n": 174, + "sd": 1.5719486386405983 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 1.7831747375328086, + "n": 127, + "sd": 1.3613083400467414 + }, + "0.75-1.00": { + "mean": 1.3534634920634923, + "n": 21, + "sd": 1.4607273128852516 + }, + "1.00-1.50": { + "mean": 2.190603386752137, + "n": 780, + "sd": 1.5190157218664448 + }, + "<0.50": { + "mean": 2.7986791666666666, + "n": 6, + "sd": 1.6759234549759885 + }, + ">=1.50": { + "mean": 3.1666712998713, + "n": 37, + "sd": 1.3290541087603711 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 1.4381932231165175, + "n": 5211, + "sd": 1.2222896055156327 + }, + "0.75-1.00": { + "mean": 1.3807379897494305, + "n": 878, + "sd": 1.2150489018065649 + }, + "1.00-1.50": { + "mean": 1.5729784935178261, + "n": 10696, + "sd": 1.2822039385463873 + }, + "<0.50": { + "mean": 1.3106677491256387, + "n": 295, + "sd": 1.4583227391977498 + }, + ">=1.50": { + "mean": 2.9881833333333248, + "n": 1, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 1.5190147470248583, + "n": 12902, + "sd": 1.2076871787890433 + }, + "0.75-1.00": { + "mean": 1.543279667767231, + "n": 2423, + "sd": 1.167656263219484 + }, + "1.00-1.50": { + "mean": 1.5825974207630815, + "n": 20126, + "sd": 1.2257859100139692 + }, + "<0.50": { + "mean": 1.2997883886714612, + "n": 886, + "sd": 1.2260331491225624 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "turn_fixed": { + "0-100": { + "0.50-0.75": { + "mean": 2.5449361111111117, + "n": 6, + "sd": 1.3261123670832622 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 2.9147500000000015, + "n": 2, + "sd": 0.06669166666666504 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 3.4278039473684205, + "n": 19, + "sd": 0.9673612969329813 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 2.089393867924528, + "n": 53, + "sd": 1.6984098792280413 + }, + "0.75-1.00": { + "mean": 3.3696599999999983, + "n": 5, + "sd": 1.261053360063632 + }, + "1.00-1.50": { + "mean": 2.663519565217392, + "n": 23, + "sd": 1.1983159166424164 + }, + "<0.50": { + "mean": 3.6392650000000004, + "n": 5, + "sd": 2.7842151196791534 + }, + ">=1.50": { + "mean": 2.6424062053783914, + "n": 191, + "sd": 1.55922137220201 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 1.9057762820512816, + "n": 130, + "sd": 1.3827683607900456 + }, + "0.75-1.00": { + "mean": 1.4498583333333332, + "n": 21, + "sd": 1.3671915034175701 + }, + "1.00-1.50": { + "mean": 2.2219028311965814, + "n": 780, + "sd": 1.5790677417862777 + }, + "<0.50": { + "mean": 3.217323611111111, + "n": 6, + "sd": 1.862481813088042 + }, + ">=1.50": { + "mean": 2.0345766369047626, + "n": 56, + "sd": 1.2232100515931434 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 1.4646970014542238, + "n": 5272, + "sd": 1.1459371920053136 + }, + "0.75-1.00": { + "mean": 1.4535254734848486, + "n": 880, + "sd": 1.1878665955737555 + }, + "1.00-1.50": { + "mean": 1.4990659662490653, + "n": 10696, + "sd": 1.2485673852220047 + }, + "<0.50": { + "mean": 1.3334705705705705, + "n": 333, + "sd": 1.2855351645376285 + }, + ">=1.50": { + "mean": 2.7844166666666674, + "n": 1, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 1.4288658339763374, + "n": 12960, + "sd": 1.1710563581265307 + }, + "0.75-1.00": { + "mean": 1.464763376650165, + "n": 2424, + "sd": 1.18620990701361 + }, + "1.00-1.50": { + "mean": 1.280381113981914, + "n": 20126, + "sd": 1.1979129407817146 + }, + "<0.50": { + "mean": 1.3610155175438596, + "n": 950, + "sd": 1.1754585305136172 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + }, + "turn_flight": { + "0-100": { + "0.50-0.75": { + "mean": 2.831939523809524, + "n": 6, + "sd": 1.300711016758442 + }, + "0.75-1.00": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + "1.00-1.50": { + "mean": 3.892007142857143, + "n": 2, + "sd": 0.107992857142857 + }, + "<0.50": { + "mean": null, + "n": 0, + "sd": 0.0 + }, + ">=1.50": { + "mean": 3.4807076279860487, + "n": 19, + "sd": 1.516574523388289 + } + }, + "100-200": { + "0.50-0.75": { + "mean": 2.0086669848652394, + "n": 53, + "sd": 1.6999128896985405 + }, + "0.75-1.00": { + "mean": 3.3915521789321774, + "n": 5, + "sd": 1.7036308729617895 + }, + "1.00-1.50": { + "mean": 2.855961124358734, + "n": 23, + "sd": 1.2544288567681272 + }, + "<0.50": { + "mean": 3.768159738095238, + "n": 5, + "sd": 2.978448430717541 + }, + ">=1.50": { + "mean": 2.779563153285567, + "n": 191, + "sd": 1.5423194380179057 + } + }, + "200-300": { + "0.50-0.75": { + "mean": 2.0837885947228787, + "n": 130, + "sd": 1.3246931107975277 + }, + "0.75-1.00": { + "mean": 1.7197008615981255, + "n": 21, + "sd": 1.5140304617150067 + }, + "1.00-1.50": { + "mean": 2.486846908243533, + "n": 780, + "sd": 1.4624241504604008 + }, + "<0.50": { + "mean": 3.5514761064425766, + "n": 6, + "sd": 2.0267643904265196 + }, + ">=1.50": { + "mean": 2.072830223735927, + "n": 56, + "sd": 0.9858692139128992 + } + }, + "300-450": { + "0.50-0.75": { + "mean": 1.4807304254226459, + "n": 5272, + "sd": 0.9622261476648617 + }, + "0.75-1.00": { + "mean": 1.4806186549256157, + "n": 880, + "sd": 0.968965517183195 + }, + "1.00-1.50": { + "mean": 1.6096593549183502, + "n": 10696, + "sd": 1.0217998316747314 + }, + "<0.50": { + "mean": 1.297379149243533, + "n": 333, + "sd": 1.1088913951468535 + }, + ">=1.50": { + "mean": 3.295583333333334, + "n": 1, + "sd": 0.0 + } + }, + "450+": { + "0.50-0.75": { + "mean": 1.491294093044936, + "n": 12960, + "sd": 0.865839215327703 + }, + "0.75-1.00": { + "mean": 1.5090910526230799, + "n": 2424, + "sd": 0.8139249401898841 + }, + "1.00-1.50": { + "mean": 1.4611714876946271, + "n": 20126, + "sd": 0.8385829351723906 + }, + "<0.50": { + "mean": 1.3737332518143328, + "n": 950, + "sd": 0.948750257621483 + }, + ">=1.50": { + "mean": null, + "n": 0, + "sd": 0.0 + } + } + } + } + } +} \ No newline at end of file diff --git a/docs/drussgt_dodge_vs_power.md b/docs/drussgt_dodge_vs_power.md new file mode 100644 index 0000000..8240955 --- /dev/null +++ b/docs/drussgt_dodge_vs_power.md @@ -0,0 +1,342 @@ +# DrussGT's movement response as a function of the bullet power we fire + +**Question (the user's hypothesis).** *"When low power, more bullets fly and I see +DrussGT dodging easier. Is this a DrussGT hidden feature at low energy to suddenly +increase the capability to dodge? I doubt."* + +**Answer: no.** Once range is controlled, DrussGT's movement does **not** respond to +the power we fire. The perceived "better dodging at low power" is a property of the +*situation* the low-power shots are fired in (we are nearly dead, so the whole +engagement geometry differs), not of the bullet — and most of the raw difference in +miss distance is pure flight-time kinematics: a low-power bullet is a *faster* +bullet, so it arrives **sooner** and DrussGT simply has fewer ticks to drift off the +line. Every measure that removes the flight window is flat. + +This was measured on **70 real live battles / 490 rounds / 54 939 shots** against the +real, unmodified DrussGT (`/tmp/tfil_ab2/`) and **replicated on 35 more battles / +245 rounds / 24 280 shots** (`/tmp/powtest/`). Nothing here uses the offline fixture +harness; these are real robot-vs-robot Tank Royale battles recorded through +`tools/robocode_shim/run_bridge_battle.sh`. + +--- + +## 1. What was measured, and how a shot is attributed + +Each shot is analysed from the recorded per-tick worldstate plus the real +fire/hit/wall event sidecar. For a shot fired by **ModularBot (us)** at +DrussGT with power `p` in direction `dir`: + +* bullet speed `v = 20 - 3p` px/tick (so **low power = faster bullet = shorter + flight**); +* the bullet flies from the fire position along `u = (cos dir, sin dir)`; +* `along(t) = (D(t) - P0)·u` and `perp(t) = (D(t) - P0)×u` are DrussGT's along-track + distance and **perpendicular offset from our aim line** at tick `t`; +* **arrival tick** `k*` = the first tick where the bullet has travelled at least + `along(k*)`; +* **(a) miss distance at arrival** = `|perp(k*)|` (bot radius is 18 px). + +**Attribution (this has bitten the project before, so it is stated explicitly).** + +* In the capture rows, **`e*` is the SUBJECT = DrussGT** and **`s*` is the adversary + = ModularBot**. That is by construction of + `tools/robocode_shim/src/robocode_shim/TrBattleCapture.java` (`en` = the bot whose + name contains "DrussGT", written as `e*`; `sh` = the other, written as `s*`). +* The event sidecar's `owner` is the Tank Royale bot id, and **it is not stable + across runs** (start order varies). It is therefore recovered **per battle** from + the fire geometry (`owner`'s position equals the fire event's `x,y`, and its energy + drops by exactly `power` on the next capture row). +* Cross-check: for **496/496 death events** the mapped victim is the bot whose energy + is ~0 at the end of that round. The mapping agrees with the death evidence in + every battle. +* Sanity check that the mapping is the *right way round*: the recovered + ModularBot power histogram is exactly its documented policy + (`common_libs/gun_harness/virtual_bullets.nim`): a spike at **0.50** + (`TR_POWER_ENERGY_MIN`, when our energy ≤ 20), a spike at **1.00** + (`TR_POWER_FAR_CAP`, beyond `TR_POWER_FAR_DIST = 200`), and the linear + `TR_POWER_ENERGY_SLOPE` continuum in between. +* No power-value heuristic is used anywhere (the old {1.0,1.5,2.0,3.0} assumption is + exactly what mis-attributed ModularBot in a previous job; our shots here are mostly + **0.50 and 1.00**, plus a continuum 0.10–0.99). + +**Validation of the geometry (MEASURED).** For shots the *server* recorded as hits, +the measured miss distance is **mean 11.6 px, median 10.8 px, 80.6 % below the 18 px +bot radius**; for shots that hit a wall it is 133 px. The measurement is therefore +correct and the ~18 px figure is the right reference scale. + +--- + +## 2. The confound is real and severe (MEASURED) + +Power is **not** randomly assigned. The policy only ever *caps* the gun's preference, +by range (`TR_POWER_FAR_DIST=200 → 1.0`), by **our own energy** (a linear slope from +0.5 at ≤20 to the cap at ≥80), by the finishing rule, and by the sub-average-chances +rule. The consequence is stark — this is the *same* table for both corpora (tfil_ab2): + +| band | power | shots | fire px | OUR energy | enemy energy | flight ticks | +|---|---|---|---|---|---|---| +| 300-450 | 0.50–0.75 | 5 272 | 411.3 | **13.8** | 19.2 | 22.36 | +| 300-450 | 0.75–1.00 | 880 | 407.7 | 29.0 | 28.5 | 23.49 | +| 300-450 | 1.00–1.50 | 10 696 | 402.0 | **69.2** | 62.6 | 23.70 | +| 450+ | 0.50–0.75 | 12 960 | 536.1 | **13.7** | 18.6 | 28.38 | +| 450+ | 0.75–1.00 | 2 424 | 540.4 | 28.8 | 26.4 | 30.18 | +| 450+ | 1.00–1.50 | 20 126 | 534.2 | **63.0** | 53.8 | 30.52 | + +Two things follow, and they drive the whole design: + +1. **Range must be held fixed** — hence everything below is stratified by range band, + and the headline is the stratified result. +2. **Within a range band, our power is almost a deterministic function of our own + energy.** Low-power shots are shots fired when *we* are nearly dead. So a naive + "low power vs high power" comparison inside a band is secretly a + "losing badly vs healthy" comparison. That is why a *within-shot* control is + needed to separate the two, and it is provided in §4. + +Because the LOW/HIGH split is also a low-energy/high-energy split, the **whole +comparison must be read as an energy-conditioned contrast**, and the burden of proof +falls on the *time-resolved* tests, not on the raw miss distance. + +--- + +## 3. Headline: within-range-band, LOW vs HIGH power + +`LOW = p ∈ [0.50, 0.75)`, `HIGH = p ∈ [1.00, 1.50)`; 95 % CI from a +**round-cluster bootstrap** (resampling battles, not shots — shots inside a battle +are correlated). Corpus `tfil_ab2`, 70 battles. + +| metric | band | nLOW | nHIGH | LOW | HIGH | delta | 95 % CI | +|---|---|---|---|---|---|---|---| +| **(a) miss at arrival px** | 300-450 | 5 272 | 10 696 | 104.67 | 110.55 | **+5.88** | [+2.64, +9.07] | +| **(a) miss at arrival px** | 450+ | 12 960 | 20 126 | 124.01 | 132.26 | **+8.25** | [+5.39, +11.25] | +| (b) lateral disp. / flight tick | 450+ | 12 960 | 20 126 | 3.47 | 3.42 | −0.04 | [−0.12, +0.03] | +| (b′) lateral disp., FIXED 12 ticks | 450+ | 12 960 | 20 126 | 55.63 | 55.47 | −0.15 | [−1.15, +0.84] | +| (b′′) CONTROL, same shot, +40 ticks | 450+ | 12 828 | 20 120 | 52.03 | 52.64 | +0.61 | [−0.38, +1.58] | +| (f) flight window ticks | 450+ | 12 960 | 20 126 | 28.38 | 30.52 | **+2.13** | [+1.81, +2.44] | +| (c) response latency ticks | 450+ | 8 682 | 13 884 | 13.60 | 14.27 | +0.68 | [+0.36, +0.99] | +| (d) turn rate deg/tick (flight) | 450+ | 12 960 | 20 126 | 1.49 | 1.46 | −0.03 | [−0.09, +0.02] | +| (d′) turn rate deg/tick (fixed 12) | 450+ | 12 960 | 20 126 | 1.43 | 1.28 | −0.15 | [−0.20, −0.10] | +| (d′′) turn rate, CONTROL (+40) | 450+ | 12 902 | 20 126 | 1.52 | 1.58 | +0.06 | [+0.01, +0.12] | +| (d) speed px/tick (flight) | 450+ | 12 960 | 20 126 | 5.46 | 5.48 | +0.01 | [−0.06, +0.08] | +| OUTCOME hit rate | 450+ | 12 960 | 20 126 | 0.10 | 0.09 | −0.01 | [−0.02, −0.00] | + +`powtest`, 35 battles (replication, same bins): + +| metric | band | nLOW | nHIGH | LOW | HIGH | delta | 95 % CI | +|---|---|---|---|---|---|---|---| +| (a) miss at arrival px | 300-450 | 1 388 | 8 151 | 106.22 | 109.93 | +3.72 | [−1.50, +8.65] | +| (a) miss at arrival px | 450+ | 2 249 | 11 085 | 122.00 | 131.86 | **+9.86** | [+4.56, +15.25] | +| (b) lateral disp. / flight tick | 450+ | 2 249 | 11 085 | 3.53 | 3.48 | −0.05 | [−0.20, +0.11] | +| (b′) lateral disp., FIXED 12 ticks | 450+ | 2 249 | 11 085 | 55.53 | 55.85 | +0.31 | [−1.24, +1.87] | +| (f) flight window ticks | 450+ | 2 249 | 11 085 | 27.75 | 29.93 | +2.18 | [+1.63, +2.73] | +| OUTCOME hit rate | 450+ | 2 249 | 11 085 | 0.10 | 0.09 | −0.01 | [−0.02, +0.01] | + +**Reading.** The only metric with a non-trivial difference is the raw miss distance, +and it is *larger* for **high** power — i.e. the opposite of the hypothesis ("low +power is dodged better"). Two things explain it entirely, and neither is a behavioural +response. + +--- + +## 4. Why the miss-distance difference is not a dodge: two decisive tests + +### 4.1 The difference is the flight window, not the dodging + +A low-power bullet is *faster*, so it arrives **2.13 ticks sooner** in band 450+ +(28.38 vs 30.52). DrussGT drifts away from the aim line at roughly **1.7–1.8 px per +tick**; 2.13 ticks × ~3.9 px/tick of accumulated miss ≈ **+8 px** — exactly the +observed +8.25 px. Normalise by the window and it disappears: + +| metric | band | LOW | HIGH | delta | 95 % CI | +|---|---|---|---|---|---| +| miss / flight ticks | 300-450 | 4.85 | 4.88 | +0.03 | [−0.13, +0.17] | +| miss / flight ticks | 450+ | 4.52 | 4.51 | −0.01 | [−0.12, +0.10] | + +(per-tick miss rate, px/tick). The per-tick dodge rate is **identical**. Same in +`powtest`: 4.56 vs 4.59, delta +0.03 [−0.19, +0.25]. + +### 4.2 The difference is already present before the bullet can matter, and survives the bullet + +The arrival tick depends on the power, so it is the wrong place to compare. Instead, +measure `|perp|` — DrussGT's perpendicular offset from our aim line — at a **fixed +number of ticks after the fire**, and again in a **CONTROL window 40 ticks later, when +the bullet is long gone**. A response to *our shot* must be ~0 at k=5 and grow with k; +a phase/geometry difference is present already at k=5 and identical in the control. + +`tfil_ab2`, band 450+ (nLOW = 12 960, nHIGH = 20 126): + +| k (ticks after fire) | LOW | HIGH | delta | CONTROL (+40 ticks) LOW | HIGH | delta | +|---|---|---|---|---|---|---| +| 5 | 94.9 | 99.1 | **+4.21** | 144.2 | 149.7 | **+5.57** | +| 10 | 95.0 | 98.9 | +3.86 | 147.8 | 153.1 | +5.23 | +| 15 | 100.7 | 104.3 | +3.53 | — | — | — | +| 20 | 109.0 | 112.5 | +3.50 | — | — | — | +| 25 | 118.7 | 122.6 | +3.83 | — | — | — | +| 30 | 127.7 | 132.5 | +4.74 | — | — | — | + +`powtest`, band 450+ (nLOW = 2 249, nHIGH = 11 085): k=5 delta **+5.97**, control +**+6.59**; identical story. + +The whole difference is present **5 ticks after the trigger pull** (before the miss +can be a reaction to a bullet still in flight) and is *at least as large in the window +where the bullet has already gone*. It is a standing offset between the two +situations, not a dodge. + +Also note the **sign flip**: in band 300-450 the turn rate is +0.03 deg/tick in the +flight window and +0.13 deg/tick in the bullet-free control window — the control +window shows *more* difference than the flight window. In band 450+ the flight-window +turn rate leans one way (−0.15) and the control window the other (+0.06). A real +response would behave the opposite way in both. + +### 4.3 What the miss-distance metric actually contains (MEASURED) + +`|perp|` is already 80–95 px only 5 ticks after the fire. **The miss distance is +dominated by our own gun's lead/aim error, not by DrussGT's dodge.** It is therefore a +weak instrument for "dodge quality" on its own, which is why the flight-normalised and +fixed-window measures carry the conclusion. + +--- + +## 5. Shuffled-label null (MEASURED) + +Labels are permuted **inside each range band**; for the arrival-dependent metrics the +arrival tick is **re-derived** for the permuted power, so the null keeps the kinematic +channel and destroys only the response. 400 reps. Corpus `tfil_ab2`, per band, two-sided +permutation p on `delta = mean(HIGH) − mean(LOW)`: + +| metric | 100-200 | 200-300 | 300-450 | 450+ | +|---|---|---|---|---| +| miss | d=+5.35, p=0.89 | d=+0.35, p=0.39 | d=+5.91, p=0.27 | d=+8.24, p=0.005 | +| miss / flight | d=−0.35, p=0.62 | d=−0.34, p=0.52 | d=+0.03, p=0.01 | d=−0.01, p=0.005 | +| lateral / flight | — | — | d=−0.08, p≈0.1 | d=−0.04, p≈0.1 | +| lateral, fixed 12 | d=+16.2, p=0.02 | d=+2.89, p=0.27 | d=−1.45, p=0.005 | d=−0.15, p=0.66 | +| lateral, CONTROL (+40) | d=+3.67, p=0.68 | d=+5.53, p=0.10 | d=−0.85, p=0.10 | d=+0.61, p=0.08 | +| turn rate, fixed 12 | d=+0.57, p=0.15 | d=+0.32, p=0.04 | d=+0.03, p=0.13 | d=−0.15, p=0.005 | +| turn rate, CONTROL | d=+0.84, p=0.06 | d=+0.41, p=0.005 | d=+0.14, p=0.005 | d=+0.06, p=0.005 | +| speed, fixed 12 | d=+0.09, p=0.91 | d=+0.02, p=0.85 | d=−0.05, p=0.14 | d=−0.01, p=0.76 | +| hit rate | d=+0.09, p=0.57 | d=−0.02, p=0.67 | d=+0.004, p=0.43 | d=−0.013, p=0.005 | + +The null is **centred on the kinematic counterfactual**, so a *small* p means +"the observed difference is not fully explained by flight-time kinematics". Only the +raw miss in 450+ (and the fixed-12 turn rate) reach that, and in **both** cases the +sign is the *opposite* of "low power is dodged better": at matched conditions DrussGT +is marginally **further** from the line and turns **less** on the high-power (slower) +bullets, and the difference is present in the bullet-free control window as well. + +*Effective sample size.* The two bands that carry the conclusion are band 450+ +(12 960 LOW / 20 126 HIGH, 70 battles) and band 300-450 (5 272 / 10 696, 70 battles), +replicated in a second corpus (2 249 / 11 085, 35 battles). The bootstrap is clustered +by battle, so the CIs already carry the between-battle variance. Bands **0-100** and +**100-200** have n = 6/2 and 53/23 shots — far too few for any claim, and they are +labelled "too few for a contrast" in the report. The design has ample power to detect a +modest effect (the CIs on the fixed-window lateral displacement, a ~55 px quantity, +are ±1 px); it cannot rule out an effect smaller than ~2 % on any of these measures. + +--- + +## 6. The response latency, turn rate and speed (MEASURED) + +* **(c) Response latency** (ticks from our fire until DrussGT's heading has turned + >15°): band 450+ **13.60 → 14.27 ticks**, delta +0.68 [+0.36, +0.99]. But the + measurement window is capped by the flight, which is itself 2.13 ticks longer for + HIGH power. As a **fraction of the flight window** it is 0.479 (LOW) vs 0.468 + (HIGH) — the high-power shots are responded to *sooner relative to the bullet*. + In band 300-450 it is **−0.09** [−0.47, +0.30]. Directionally inconsistent ⇒ no + effect. `powtest`: +0.47 (450+), −0.29 (300-450). +* **(d) Turn rate** in the flight window: 1.49 vs 1.46 deg/tick in 450+ (−0.03 + [−0.09, +0.02]); +0.13 [+0.05, +0.21] in 300-450 with the same sign in the control + window (+0.13). Surfers do slow to turn, but DrussGT's turn rate does not track our + power. +* **Speed** in the flight window: 5.46 vs 5.48 px/tick — flat, and the control window + agrees. DrussGT is not slowing down more against low-power bullets. + +--- + +## 7. Flight-window lengths (MEASURED) — the thing that would have to be true + +`speed = 20 − 3p`, so a **lower** power is a **faster** bullet and a **shorter** +flight. Measured, band 450+: + +| power | 0.50–0.75 | 0.75–1.00 | 1.00–1.50 | +|---|---|---|---| +| flight ticks | 28.38 | 30.18 | 30.52 | + +A genuine "dodge low power better" would have to overcome a **2.1-tick handicap** and +still produce a *larger* miss per unit time at low power. It does not: the per-tick +miss rate is 4.52 at LOW and 4.51 at HIGH. If anything the extra reaction time on the +slow, high-power bullets produces slightly *more* lateral drift (1.8 px/tick vs +1.7 px/tick between k=10 and k=30 in band 450+). + +--- + +## 8. Outcome (MEASURED) — reproduces the known flat result + +Hit rate from the real server events, per band: + +| band | 0.50–0.75 | 1.00–1.50 | delta | 95 % CI | +|---|---|---|---|---| +| 300-450 | 0.11 | 0.12 | +0.004 | [−0.01, +0.02] | +| 450+ | 0.10 | 0.09 | −0.013 | [−0.02, −0.00] | + +Flat, in agreement with the previously measured live outcome (9.55 % / 10.86 % / +10.35 % by fired power, Fisher p = 0.37). This job adds the *mechanism*: the outcome is +flat because the movement is flat. + +--- + +## 9. Verdict + +**MEASURED** + +* DrussGT's miss-normalised, fixed-window and control-window movement metrics are + **flat across the power we fire, inside a range band**, on 54 939 shots and + replicated on 24 280 more. +* The only between-power difference that is large is the **raw miss distance at + arrival** (+8.2 px in band 450+ for a 2.13-tick longer flight), and that is + **exactly the flight-window kinematics**; normalising by the window removes it. +* The difference is present **5 ticks after the fire** and is **as large in the window + 40 ticks later when the bullet is gone** — so it is a property of the low-energy / + high-energy *situation*, not of the shot. +* Hit rate is flat. + +**INFERRED** + +* The null results rule out a *dodge-quality* response to power of the size the visual + impression suggests. They cannot exclude an effect that is exactly cancelled by the + same energy confound in every metric — but that would require a coincidence, and the + control window argues against it. +* The user's visual impression ("more bullets fly at low power") is real but is a + *bullet-count* effect, not a dodge effect: firing at low power gives a shorter + reload interval (`10 + 2p` ticks) and a faster bullet, so more bullets are in the air + and more of them are seen. That increased visual *rate of activity* is not DrussGT + dodging differently. +* There is **no hidden DrussGT behaviour** to exploit at low power. If anything, the + (tiny, situational) residual points the other way: DrussGT is marginally *further* + off the aim line and turns *less* against the slower high-power bullets, which is + just the extra reaction time. +* Practical reading for the energy-slope policy: the low-power arm loses nothing in + terms of DrussGT's evasion; its hit rate is the same and its energy cost is lower. + The flat outcome measured earlier is not hiding a movement-side penalty. + +--- + +## 10. Reproducing + +```bash +# corpora (live captures; not in the repo - ~490 MB total) +# /tmp/tfil_ab2/out//run*.jsonl{,.events.jsonl,.rounds.json} +# /tmp/powtest/{cap__r.jsonl,events__r.json,cap_*_r.jsonl.rounds.json} + +python3 common_libs/tests/analyze_drussgt_dodge_vs_power.py \ + --tfil /tmp/tfil_ab2/out --powtest /tmp/powtest --reps 400 \ + --json common_libs/tests/fixtures/dodge_vs_power_results.json \ + | tee common_libs/tests/fixtures/dodge_vs_power_report.txt +``` + +`common_libs/tests/fixtures/dodge_vs_power_report.txt` is the verbatim captured +output the tables above were taken from; +`common_libs/tests/fixtures/dodge_vs_power_results.json` is the same numbers as JSON. +Runtime ≈ 2.5 minutes for both corpora, single-threaded pure Python (no numpy). + +To rebuild a corpus, `tools/robocode_shim/make_botdir.sh /tmp/tr_bots/DrussGT` and then +`TR_EVENTS_OUT=.events.jsonl tools/robocode_shim/run_bridge_battle.sh + 7 .jsonl` (the analyzer also needs the `.rounds.json` sidecar, +which the shim writes automatically).