MELEE A/B: BitBrain vs shipped Pattern rack — repo's first melee measurement (null)

Adds common_libs/tests/measure_melee_bitbrain_ab.nim (+ .sh driver, .py analyzer,
committed per-run fixtures) and docs/melee_bitbrain_ab.md.

Experiment: 4-bot Free-For-All (ModularBot + WaveSurfer + PatternMover +
RandomMover), 4 arms x 16 runs x 7 rounds, frozen ModularBot from git archive
HEAD (commit 0f5cfe3, binary 11bba27), shipped tfil movement in every run.
Arms differ only in the gun rack: pattern (shipped), bb_round, bb_ret, bb_learn.

Result: NOT DETECTABLE. Score (server round score = damage + survival bonus)
differs by -63..+33 pts (perm p=0.16-0.71) against an MDE of 151 (~5.1%).
Every arm finishes rank 1. Round wins hint BitBrain's way (112/112 and 111/112
vs 109/112) but p=0.225 (MW 0.080), half the 0.40-win MDE.

Liveness proven: rack boot lines flip (rack active melee = PATTERN / BITBRAIN),
every run faced 3 distinct targets and ~66-69 target changes, and the bb arms
logged one [bb-reset] reason=target_change per switch. The melee premise was
exercised; the fast adaptation bought no measurable score edge at this sample.
This commit is contained in:
2026-09-26 00:35:44 +02:00
parent 02b691dd5f
commit da4a971ca9
70 changed files with 1743 additions and 0 deletions
+215
View File
@@ -0,0 +1,215 @@
#!/usr/bin/env python3
"""analyze_melee_ab.py — analyze a melee A/B session produced by
common_libs/tests/measure_melee_bitbrain_ab.nim (+ run_melee_bitbrain_ab.sh).
python3 common_libs/tests/analyze_melee_ab.py <outdir> [--reference ARM]
Melee scoring caveat: a round score (and the run `totalScore`) is the SERVER's
round score = damage dealt + the survival bonus; it is not raw damage. Per-round
placement is the 1..N rank in that round. `firstPlaces` is the count of rounds
won (rank 1) and `survivalCount` the total ticks survived.
Statistics are reused verbatim from tools/ab/ab_analyze.py (MC permutation test
+ Mann-Whitney U + MDE), so the melee numbers use the same machinery as the 1v1
A/Bs. All tests are two-sided on PER-RUN values.
"""
import glob
import importlib.util
import json
import math
import os
import statistics
import sys
REPO = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
_AB = os.path.join(REPO, "tools", "ab", "ab_analyze.py")
_spec = importlib.util.spec_from_file_location("ab_analyze", _AB)
ab = importlib.util.module_from_spec(_spec)
_spec.loader.exec_module(ab)
def load_runs(outdir, arm):
runs = []
for p in sorted(glob.glob(os.path.join(outdir, arm, "run*.json"))):
try:
d = json.load(open(p))
except (OSError, json.JSONDecodeError):
continue
if not d.get("ok"):
continue
mb = d.get("modularbot", {})
pr = d.get("perRound", [])
ranks = [r["rank"] for r in pr]
runs.append({
"run": d["run"],
"wins": mb.get("firstPlaces", 0),
"rounds": d.get("rounds", len(pr)),
"score": mb.get("totalScore", 0),
"survival": mb.get("survivalCount", 0),
"rank": mb.get("rank", 0),
"mean_rank": (sum(ranks) / len(ranks)) if ranks else float("nan"),
"field_score": sum(f.get("totalScore", 0) for f in d.get("field", [])),
"live": d.get("live", {}),
})
return runs
def score_share(r):
tot = r["score"] + r["field_score"]
return r["score"] / tot if tot else float("nan")
def fmt(xs, width=5):
return " ".join(f"{x:>{width}g}" for x in xs)
def main():
args = sys.argv[1:]
if not args:
print(__doc__)
return 2
outdir = args[0]
reference = "pattern"
if "--reference" in args:
reference = args[args.index("--reference") + 1]
arms = [d for d in sorted(os.listdir(outdir))
if os.path.isdir(os.path.join(outdir, d)) and load_runs(outdir, d)]
if reference not in arms:
print(f"ERROR: reference '{reference}' not among {arms}", file=sys.stderr)
return 2
data = {a: load_runs(outdir, a) for a in arms}
print(f"# melee A/B session: {outdir}")
print(f"# arms: {', '.join(arms)} reference: {reference}")
# commit / binary sha
anyj = glob.glob(os.path.join(outdir, reference, "run*.json"))
if anyj:
d0 = json.load(open(sorted(anyj)[0]))
print(f"# commit={d0.get('commit')} binary_sha256={d0.get('binary_sha256')}")
print()
print("ARM SUMMARY (melee: score=server round score dmg+survival bonus)")
hdr = (f"{'arm':<10} {'runs':>4} {'wins/rd':>9} {'score':>8} "
f"{'surv':>7} {'rank':>5} {'meanrank':>9} {'score share':>11} "
f"{'targets':>8} {'tchanges':>9}")
print(hdr)
print("-" * len(hdr))
for a in arms:
rs = data[a]
n = len(rs)
wins = sum(r["wins"] for r in rs)
rounds = sum(r["rounds"] for r in rs)
sc = statistics.mean(r["score"] for r in rs)
sv = statistics.mean(r["survival"] for r in rs)
rk = statistics.mean(r["rank"] for r in rs)
mr = statistics.mean(r["mean_rank"] for r in rs)
ss = statistics.mean(score_share(r) for r in rs)
tg = statistics.mean(r["live"].get("distinct_targets", 0) for r in rs)
tc = statistics.mean(r["live"].get("target_changes", 0) for r in rs)
print(f"{a:<10} {n:>4} {str(wins)+'/'+str(rounds):>9} {sc:>8.0f} "
f"{sv:>7.0f} {rk:>5.2f} {mr:>9.3f} {ss*100:>10.1f}% "
f"{tg:>8.2f} {tc:>9.2f}")
print("\nPER-RUN VALUES (never just the mean)")
for a in arms:
rs = data[a]
print(f" {a:<10} wins: " + " ".join(f"r{r['run']}={r['wins']}" for r in rs))
print(f" {'':<10} score: " + " ".join(f"r{r['run']}={r['score']}" for r in rs))
print(f" {'':<10} surv: " + " ".join(f"r{r['run']}={r['survival']}" for r in rs))
print(f" {'':<10} mrank: " + " ".join(f"r{r['run']}={r['mean_rank']:.2f}" for r in rs))
metrics = [("score", "score"), ("survival", "survival"),
("wins", "wins"), ("mean_rank", "mean_rank"),
("rank", "rank"), ("score_share", "__share__")]
def vals(a, key, f):
if key == "__share__":
return [score_share(r) for r in data[a]]
return [r[key] for r in data[a]]
print("\nPAIRWISE PERMUTATION TEST (per-run) + MANN-WHITNEY CROSS-CHECK")
print(f" perm: exact when C(n,na) <= {ab.EXACT_CAP:,}; else Monte-Carlo "
f"{ab.MC_DRAWS:,} draws seed={ab.MC_SEED:#x}")
hdr = (f"{'metric':<12} {'A':<10} {'B':<10} {'diff(A-B)':>11} "
f"{'perm p':>9} {'method':<12} {'MW p':>9} {'MW U':>8}")
print(hdr)
print("-" * len(hdr))
for label, key in metrics:
for a in arms:
if a == reference:
continue
xa = vals(reference, key, None)
xb = vals(a, key, None)
res = ab.perm_test(xa, xb)
mw = ab.mannwhitney_p(xa, xb)
if res is None:
continue
mstr = ("exact" if res["method"] == "exact"
else f"MC/B={res['draws']:,}")
mwp = f"{mw[0]:.4f}" if mw else "n/a"
mwu = f"{mw[1]:.1f}" if mw else "n/a"
print(f"{label:<12} {reference:<10} {a:<10} {res['signed']:>+11.4f} "
f"{res['p']:>9.4f} {mstr:<12} {mwp:>9} {mwu:>8}")
print("\nMINIMUM DETECTABLE EFFECT (two-sample, alpha=0.05 two-sided, "
"80% power; MDE = 2.8016*sd*sqrt(2/n))")
print(f"{'metric':<12} {'n/arm':>6} {'sd(ref)':>9} {'MDE':>10} {'ref mean':>10}")
print("-" * 52)
for label, key in [("score", "score"), ("survival", "survival"),
("wins", "wins"), ("mean_rank", "mean_rank")]:
xa = vals(reference, key, None)
if len(xa) < 2:
continue
sd = statistics.stdev(xa)
mde = ab.min_detectable_effect(sd, len(xa))
print(f"{label:<12} {len(xa):>6} {sd:>9.2f} {mde:>10.2f} {statistics.mean(xa):>10.3f}")
print("\nLIVENESS (per arm, from the bot's own boot report + log)")
print(f"{'arm':<10} {'rack_melee':>11} {'mem':>9} {'targets':>8} "
f"{'tchanges':>9} {'bb-reset':>9} {'OK':>4}")
for a in arms:
rs = data[a]
racks = {r["live"].get("rack_active_melee", "?") for r in rs}
mems = {r["live"].get("env_TR_BITBRAIN_MEM", "?") for r in rs}
tgt = statistics.mean(r["live"].get("distinct_targets", 0) for r in rs)
tch = statistics.mean(r["live"].get("target_changes", 0) for r in rs)
rst = statistics.mean(r["live"].get("bb_reset_target_change", 0) for r in rs)
if a == reference:
ok = all(r["live"].get("rack_active_melee") == "PATTERN"
and r["live"].get("env_TR_RACK_BITBRAIN") == "off"
and r["live"].get("bb_reset_target_change", -1) == 0
for r in rs)
else:
ok = all(r["live"].get("rack_active_melee") == "BITBRAIN"
and r["live"].get("env_TR_RACK_PATTERN") == "off"
and r["live"].get("env_TR_RACK_BITBRAIN") == "melee"
and r["live"].get("bb_reset_target_change", 0) > 0
for r in rs)
print(f"{a:<10} {','.join(sorted(racks)):>11} {','.join(sorted(mems)):>9} "
f"{tgt:>8.2f} {tch:>9.2f} {rst:>9.2f} {'yes' if ok else 'NO':>4}")
# machine-readable dump for the doc
dump = {"reference": reference, "arms": {}}
for a in arms:
rs = data[a]
dump["arms"][a] = {
"n": len(rs),
"wins": [r["wins"] for r in rs],
"rounds": [r["rounds"] for r in rs],
"score": [r["score"] for r in rs],
"survival": [r["survival"] for r in rs],
"mean_rank": [round(r["mean_rank"], 4) for r in rs],
"rack_melee": [r["live"].get("rack_active_melee") for r in rs],
"target_changes": [r["live"].get("target_changes") for r in rs],
"distinct_targets": [r["live"].get("distinct_targets") for r in rs],
"bb_reset": [r["live"].get("bb_reset_target_change") for r in rs],
}
with open(os.path.join(outdir, "analysis.json"), "w") as fh:
json.dump(dump, fh, indent=1)
print(f"\n# machine-readable: {os.path.join(outdir, 'analysis.json')}")
return 0
if __name__ == "__main__":
sys.exit(main())
@@ -0,0 +1,665 @@
{
"reference": "pattern",
"arms": {
"bb_learn": {
"n": 16,
"wins": [
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7
],
"rounds": [
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7
],
"score": [
2883,
2757,
2906,
3145,
2911,
3068,
2758,
2715,
3107,
2848,
3190,
2912,
2859,
3092,
2907,
3066
],
"survival": [
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050
],
"mean_rank": [
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0
],
"rack_melee": [
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN"
],
"target_changes": [
63,
68,
68,
72,
80,
55,
58,
77,
78,
72,
66,
62,
62,
64,
60,
63
],
"distinct_targets": [
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3
],
"bb_reset": [
63,
68,
68,
72,
80,
55,
58,
77,
78,
72,
66,
62,
62,
64,
60,
63
]
},
"bb_ret": {
"n": 16,
"wins": [
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7
],
"rounds": [
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7
],
"score": [
2891,
2770,
2792,
2934,
2943,
2890,
2817,
2999,
2994,
2913,
2920,
2890,
3011,
2945,
2943,
2802
],
"survival": [
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1000,
1050,
1050,
1050,
1050
],
"mean_rank": [
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0
],
"rack_melee": [
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN"
],
"target_changes": [
60,
67,
73,
54,
63,
70,
83,
65,
73,
71,
55,
82,
74,
84,
56,
59
],
"distinct_targets": [
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3
],
"bb_reset": [
62,
67,
73,
54,
63,
70,
83,
65,
73,
71,
55,
82,
74,
84,
56,
59
]
},
"bb_round": {
"n": 16,
"wins": [
7,
6,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7
],
"rounds": [
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7
],
"score": [
3040,
2944,
3125,
3110,
3037,
2993,
2985,
2842,
2835,
3045,
3180,
2952,
3126,
2927,
3021,
2804
],
"survival": [
1050,
900,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
1050,
950
],
"mean_rank": [
1.0,
1.1429,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0
],
"rack_melee": [
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN",
"BITBRAIN"
],
"target_changes": [
62,
60,
81,
62,
69,
61,
73,
70,
67,
63,
66,
70,
71,
75,
83,
67
],
"distinct_targets": [
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3
],
"bb_reset": [
62,
60,
81,
62,
69,
61,
73,
70,
67,
63,
66,
70,
71,
75,
83,
67
]
},
"pattern": {
"n": 16,
"wins": [
7,
7,
7,
7,
7,
7,
7,
7,
7,
6,
7,
6,
7,
6,
7,
7
],
"rounds": [
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7,
7
],
"score": [
3082,
2795,
2897,
2915,
3176,
2922,
2860,
2878,
3261,
2957,
3106,
2869,
3194,
2728,
2869,
2931
],
"survival": [
1050,
1050,
1050,
1050,
1050,
950,
1050,
1050,
1050,
1000,
1050,
1050,
1050,
900,
1050,
1050
],
"mean_rank": [
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0
],
"rack_melee": [
"PATTERN",
"PATTERN",
"PATTERN",
"PATTERN",
"PATTERN",
"PATTERN",
"PATTERN",
"PATTERN",
"PATTERN",
"PATTERN",
"PATTERN",
"PATTERN",
"PATTERN",
"PATTERN",
"PATTERN",
"PATTERN"
],
"target_changes": [
66,
56,
73,
77,
53,
67,
67,
69,
79,
67,
51,
51,
67,
64,
81,
75
],
"distinct_targets": [
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3
],
"bb_reset": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
]
}
}
}
@@ -0,0 +1,69 @@
# melee A/B session: common_libs/tests/fixtures/melee_bitbrain_ab
# arms: bb_learn, bb_ret, bb_round, pattern reference: pattern
# commit=0f5cfe37b24952ae07fee0a7db526317ae127e6c binary_sha256=11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca
ARM SUMMARY (melee: score=server round score dmg+survival bonus)
arm runs wins/rd score surv rank meanrank score share targets tchanges
-----------------------------------------------------------------------------------------
bb_learn 16 112/112 2945 1050 1.00 1.000 60.2% 3.00 66.75
bb_ret 16 112/112 2903 1047 1.00 1.000 59.4% 3.00 68.06
bb_round 16 111/112 2998 1034 1.00 1.009 60.8% 3.00 68.75
pattern 16 109/112 2965 1031 1.00 1.000 59.5% 3.00 66.44
PER-RUN VALUES (never just the mean)
bb_learn wins: r1=7 r10=7 r11=7 r12=7 r13=7 r14=7 r15=7 r16=7 r2=7 r3=7 r4=7 r5=7 r6=7 r7=7 r8=7 r9=7
score: r1=2883 r10=2757 r11=2906 r12=3145 r13=2911 r14=3068 r15=2758 r16=2715 r2=3107 r3=2848 r4=3190 r5=2912 r6=2859 r7=3092 r8=2907 r9=3066
surv: r1=1050 r10=1050 r11=1050 r12=1050 r13=1050 r14=1050 r15=1050 r16=1050 r2=1050 r3=1050 r4=1050 r5=1050 r6=1050 r7=1050 r8=1050 r9=1050
mrank: r1=1.00 r10=1.00 r11=1.00 r12=1.00 r13=1.00 r14=1.00 r15=1.00 r16=1.00 r2=1.00 r3=1.00 r4=1.00 r5=1.00 r6=1.00 r7=1.00 r8=1.00 r9=1.00
bb_ret wins: r1=7 r10=7 r11=7 r12=7 r13=7 r14=7 r15=7 r16=7 r2=7 r3=7 r4=7 r5=7 r6=7 r7=7 r8=7 r9=7
score: r1=2891 r10=2770 r11=2792 r12=2934 r13=2943 r14=2890 r15=2817 r16=2999 r2=2994 r3=2913 r4=2920 r5=2890 r6=3011 r7=2945 r8=2943 r9=2802
surv: r1=1050 r10=1050 r11=1050 r12=1050 r13=1050 r14=1050 r15=1050 r16=1050 r2=1050 r3=1050 r4=1050 r5=1000 r6=1050 r7=1050 r8=1050 r9=1050
mrank: r1=1.00 r10=1.00 r11=1.00 r12=1.00 r13=1.00 r14=1.00 r15=1.00 r16=1.00 r2=1.00 r3=1.00 r4=1.00 r5=1.00 r6=1.00 r7=1.00 r8=1.00 r9=1.00
bb_round wins: r1=7 r10=6 r11=7 r12=7 r13=7 r14=7 r15=7 r16=7 r2=7 r3=7 r4=7 r5=7 r6=7 r7=7 r8=7 r9=7
score: r1=3040 r10=2944 r11=3125 r12=3110 r13=3037 r14=2993 r15=2985 r16=2842 r2=2835 r3=3045 r4=3180 r5=2952 r6=3126 r7=2927 r8=3021 r9=2804
surv: r1=1050 r10=900 r11=1050 r12=1050 r13=1050 r14=1050 r15=1050 r16=1050 r2=1050 r3=1050 r4=1050 r5=1050 r6=1050 r7=1050 r8=1050 r9=950
mrank: r1=1.00 r10=1.14 r11=1.00 r12=1.00 r13=1.00 r14=1.00 r15=1.00 r16=1.00 r2=1.00 r3=1.00 r4=1.00 r5=1.00 r6=1.00 r7=1.00 r8=1.00 r9=1.00
pattern wins: r1=7 r10=7 r11=7 r12=7 r13=7 r14=7 r15=7 r16=7 r2=7 r3=6 r4=7 r5=6 r6=7 r7=6 r8=7 r9=7
score: r1=3082 r10=2795 r11=2897 r12=2915 r13=3176 r14=2922 r15=2860 r16=2878 r2=3261 r3=2957 r4=3106 r5=2869 r6=3194 r7=2728 r8=2869 r9=2931
surv: r1=1050 r10=1050 r11=1050 r12=1050 r13=1050 r14=950 r15=1050 r16=1050 r2=1050 r3=1000 r4=1050 r5=1050 r6=1050 r7=900 r8=1050 r9=1050
mrank: r1=1.00 r10=1.00 r11=1.00 r12=1.00 r13=1.00 r14=1.00 r15=1.00 r16=1.00 r2=1.00 r3=1.00 r4=1.00 r5=1.00 r6=1.00 r7=1.00 r8=1.00 r9=1.00
PAIRWISE PERMUTATION TEST (per-run) + MANN-WHITNEY CROSS-CHECK
perm: exact when C(n,na) <= 20,000,000; else Monte-Carlo 1,000,000 draws seed=0x5eed5eed
metric A B diff(A-B) perm p method MW p MW U
----------------------------------------------------------------------------------------
score pattern bb_learn +19.7500 0.7117 MC/B=1,000,000 0.6109 114.0
score pattern bb_ret +61.6250 0.1594 MC/B=1,000,000 0.5590 112.0
score pattern bb_round -32.8750 0.4900 MC/B=1,000,000 0.3365 102.0
survival pattern bb_learn -18.7500 0.2254 MC/B=1,000,000 0.0800 104.0
survival pattern bb_ret -15.6250 0.3507 MC/B=1,000,000 0.2791 111.0
survival pattern bb_round -3.1250 1.0000 MC/B=1,000,000 0.6982 121.0
wins pattern bb_learn -0.1875 0.2251 MC/B=1,000,000 0.0795 104.0
wins pattern bb_ret -0.1875 0.2251 MC/B=1,000,000 0.0795 104.0
wins pattern bb_round -0.1250 0.5984 MC/B=1,000,000 0.3080 112.0
mean_rank pattern bb_learn +0.0000 1.0000 MC/B=1,000,000 1.0000 128.0
mean_rank pattern bb_ret +0.0000 1.0000 MC/B=1,000,000 1.0000 128.0
mean_rank pattern bb_round -0.0089 1.0000 MC/B=1,000,000 0.3485 120.0
rank pattern bb_learn +0.0000 1.0000 MC/B=1,000,000 1.0000 128.0
rank pattern bb_ret +0.0000 1.0000 MC/B=1,000,000 1.0000 128.0
rank pattern bb_round +0.0000 1.0000 MC/B=1,000,000 1.0000 128.0
score_share pattern bb_learn -0.0071 0.5082 MC/B=1,000,000 0.6109 114.0
score_share pattern bb_ret +0.0012 0.9046 MC/B=1,000,000 0.8653 123.0
score_share pattern bb_round -0.0128 0.2908 MC/B=1,000,000 0.2662 98.0
MINIMUM DETECTABLE EFFECT (two-sample, alpha=0.05 two-sided, 80% power; MDE = 2.8016*sd*sqrt(2/n))
metric n/arm sd(ref) MDE ref mean
----------------------------------------------------
score 16 152.85 151.40 2965.000
survival 16 44.25 43.83 1031.250
wins 16 0.40 0.40 6.812
mean_rank 16 0.00 0.00 1.000
LIVENESS (per arm, from the bot's own boot report + log)
arm rack_melee mem targets tchanges bb-reset OK
bb_learn BITBRAIN decay 3.00 66.75 66.75 yes
bb_ret BITBRAIN retained 3.00 68.06 68.19 yes
bb_round BITBRAIN perRound 3.00 68.75 68.75 yes
pattern PATTERN perRound 3.00 66.44 0.00 yes
# machine-readable: common_libs/tests/fixtures/melee_bitbrain_ab/analysis.json
@@ -0,0 +1 @@
{"arm":"bb_learn","run":1,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2883,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":1016,"rank":2,"firstPlaces":0,"survivalCount":450},{"name":"PatternMover","totalScore":550,"rank":3,"firstPlaces":0,"survivalCount":250},{"name":"RandomMover","totalScore":460,"rank":4,"firstPlaces":0,"survivalCount":350}],"perRound":[{"round":1,"score":377,"rank":1,"survived":true},{"round":2,"score":836,"rank":1,"survived":true},{"round":3,"score":1178,"rank":1,"survived":true},{"round":4,"score":1548,"rank":1,"survived":true},{"round":5,"score":1929,"rank":1,"survived":true},{"round":6,"score":2393,"rank":1,"survived":true},{"round":7,"score":2883,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"decay","env_TR_BITBRAIN_GAINS":"1.0,1.25,1.5,2.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":11,"config_lines":82,"distinct_targets":3,"target_changes":63,"bb_reset_target_change":63,"bb_lines":14,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"bb_learn","run":10,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2757,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":933,"rank":2,"firstPlaces":0,"survivalCount":500},{"name":"RandomMover","totalScore":570,"rank":3,"firstPlaces":0,"survivalCount":350},{"name":"PatternMover","totalScore":530,"rank":4,"firstPlaces":0,"survivalCount":200}],"perRound":[{"round":1,"score":404,"rank":1,"survived":true},{"round":2,"score":823,"rank":1,"survived":true},{"round":3,"score":1122,"rank":1,"survived":true},{"round":4,"score":1595,"rank":1,"survived":true},{"round":5,"score":1974,"rank":1,"survived":true},{"round":6,"score":2359,"rank":1,"survived":true},{"round":7,"score":2757,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"decay","env_TR_BITBRAIN_GAINS":"1.0,1.25,1.5,2.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":11,"config_lines":81,"distinct_targets":3,"target_changes":68,"bb_reset_target_change":68,"bb_lines":28,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"bb_learn","run":11,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2906,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":694,"rank":2,"firstPlaces":0,"survivalCount":300},{"name":"RandomMover","totalScore":678,"rank":3,"firstPlaces":0,"survivalCount":500},{"name":"PatternMover","totalScore":439,"rank":4,"firstPlaces":0,"survivalCount":250}],"perRound":[{"round":1,"score":438,"rank":1,"survived":true},{"round":2,"score":870,"rank":1,"survived":true},{"round":3,"score":1284,"rank":1,"survived":true},{"round":4,"score":1708,"rank":1,"survived":true},{"round":5,"score":2062,"rank":1,"survived":true},{"round":6,"score":2532,"rank":1,"survived":true},{"round":7,"score":2906,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"decay","env_TR_BITBRAIN_GAINS":"1.0,1.25,1.5,2.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":10,"config_lines":79,"distinct_targets":3,"target_changes":68,"bb_reset_target_change":68,"bb_lines":25,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_learn","run":12,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3145,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"RandomMover","totalScore":690,"rank":2,"firstPlaces":0,"survivalCount":500},{"name":"WaveSurfer","totalScore":648,"rank":3,"firstPlaces":0,"survivalCount":250},{"name":"PatternMover","totalScore":547,"rank":4,"firstPlaces":0,"survivalCount":300}],"perRound":[{"round":1,"score":460,"rank":1,"survived":true},{"round":2,"score":858,"rank":1,"survived":true},{"round":3,"score":1293,"rank":1,"survived":true},{"round":4,"score":1778,"rank":1,"survived":true},{"round":5,"score":2227,"rank":1,"survived":true},{"round":6,"score":2698,"rank":1,"survived":true},{"round":7,"score":3145,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"decay","env_TR_BITBRAIN_GAINS":"1.0,1.25,1.5,2.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":10,"config_lines":82,"distinct_targets":3,"target_changes":72,"bb_reset_target_change":72,"bb_lines":17,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_learn","run":13,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2911,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":814,"rank":2,"firstPlaces":0,"survivalCount":250},{"name":"PatternMover","totalScore":644,"rank":3,"firstPlaces":0,"survivalCount":400},{"name":"RandomMover","totalScore":563,"rank":4,"firstPlaces":0,"survivalCount":400}],"perRound":[{"round":1,"score":399,"rank":1,"survived":true},{"round":2,"score":841,"rank":1,"survived":true},{"round":3,"score":1233,"rank":1,"survived":true},{"round":4,"score":1635,"rank":1,"survived":true},{"round":5,"score":2106,"rank":1,"survived":true},{"round":6,"score":2521,"rank":1,"survived":true},{"round":7,"score":2911,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"decay","env_TR_BITBRAIN_GAINS":"1.0,1.25,1.5,2.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":11,"config_lines":93,"distinct_targets":3,"target_changes":80,"bb_reset_target_change":80,"bb_lines":10,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_learn","run":14,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3068,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":694,"rank":2,"firstPlaces":0,"survivalCount":250},{"name":"RandomMover","totalScore":636,"rank":3,"firstPlaces":0,"survivalCount":500},{"name":"PatternMover","totalScore":553,"rank":4,"firstPlaces":0,"survivalCount":300}],"perRound":[{"round":1,"score":450,"rank":1,"survived":true},{"round":2,"score":855,"rank":1,"survived":true},{"round":3,"score":1409,"rank":1,"survived":true},{"round":4,"score":1797,"rank":1,"survived":true},{"round":5,"score":2235,"rank":1,"survived":true},{"round":6,"score":2645,"rank":1,"survived":true},{"round":7,"score":3068,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"decay","env_TR_BITBRAIN_GAINS":"1.0,1.25,1.5,2.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":12,"config_lines":70,"distinct_targets":3,"target_changes":55,"bb_reset_target_change":55,"bb_lines":20,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_learn","run":15,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2758,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":765,"rank":2,"firstPlaces":0,"survivalCount":300},{"name":"RandomMover","totalScore":666,"rank":3,"firstPlaces":0,"survivalCount":400},{"name":"PatternMover","totalScore":635,"rank":4,"firstPlaces":0,"survivalCount":350}],"perRound":[{"round":1,"score":387,"rank":1,"survived":true},{"round":2,"score":709,"rank":1,"survived":true},{"round":3,"score":1100,"rank":1,"survived":true},{"round":4,"score":1554,"rank":1,"survived":true},{"round":5,"score":1909,"rank":1,"survived":true},{"round":6,"score":2321,"rank":1,"survived":true},{"round":7,"score":2758,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"decay","env_TR_BITBRAIN_GAINS":"1.0,1.25,1.5,2.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":10,"config_lines":69,"distinct_targets":3,"target_changes":58,"bb_reset_target_change":58,"bb_lines":39,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_learn","run":16,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2715,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"RandomMover","totalScore":803,"rank":2,"firstPlaces":0,"survivalCount":500},{"name":"WaveSurfer","totalScore":665,"rank":3,"firstPlaces":0,"survivalCount":300},{"name":"PatternMover","totalScore":491,"rank":4,"firstPlaces":0,"survivalCount":250}],"perRound":[{"round":1,"score":368,"rank":1,"survived":true},{"round":2,"score":751,"rank":1,"survived":true},{"round":3,"score":1173,"rank":1,"survived":true},{"round":4,"score":1551,"rank":1,"survived":true},{"round":5,"score":1985,"rank":1,"survived":true},{"round":6,"score":2356,"rank":1,"survived":true},{"round":7,"score":2715,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"decay","env_TR_BITBRAIN_GAINS":"1.0,1.25,1.5,2.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":10,"config_lines":95,"distinct_targets":3,"target_changes":77,"bb_reset_target_change":77,"bb_lines":36,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"bb_learn","run":2,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3107,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":738,"rank":2,"firstPlaces":0,"survivalCount":400},{"name":"PatternMover","totalScore":486,"rank":3,"firstPlaces":0,"survivalCount":300},{"name":"RandomMover","totalScore":479,"rank":4,"firstPlaces":0,"survivalCount":350}],"perRound":[{"round":1,"score":462,"rank":1,"survived":true},{"round":2,"score":881,"rank":1,"survived":true},{"round":3,"score":1392,"rank":1,"survived":true},{"round":4,"score":1829,"rank":1,"survived":true},{"round":5,"score":2327,"rank":1,"survived":true},{"round":6,"score":2719,"rank":1,"survived":true},{"round":7,"score":3107,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"decay","env_TR_BITBRAIN_GAINS":"1.0,1.25,1.5,2.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":8,"config_lines":90,"distinct_targets":3,"target_changes":78,"bb_reset_target_change":78,"bb_lines":26,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_learn","run":3,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2848,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"RandomMover","totalScore":684,"rank":2,"firstPlaces":0,"survivalCount":550},{"name":"WaveSurfer","totalScore":634,"rank":3,"firstPlaces":0,"survivalCount":150},{"name":"PatternMover","totalScore":580,"rank":4,"firstPlaces":0,"survivalCount":350}],"perRound":[{"round":1,"score":497,"rank":1,"survived":true},{"round":2,"score":935,"rank":1,"survived":true},{"round":3,"score":1286,"rank":1,"survived":true},{"round":4,"score":1635,"rank":1,"survived":true},{"round":5,"score":2041,"rank":1,"survived":true},{"round":6,"score":2417,"rank":1,"survived":true},{"round":7,"score":2848,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"decay","env_TR_BITBRAIN_GAINS":"1.0,1.25,1.5,2.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":8,"config_lines":90,"distinct_targets":3,"target_changes":72,"bb_reset_target_change":72,"bb_lines":16,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_learn","run":4,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3190,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":984,"rank":2,"firstPlaces":0,"survivalCount":450},{"name":"PatternMover","totalScore":648,"rank":3,"firstPlaces":0,"survivalCount":400},{"name":"RandomMover","totalScore":391,"rank":4,"firstPlaces":0,"survivalCount":200}],"perRound":[{"round":1,"score":453,"rank":1,"survived":true},{"round":2,"score":905,"rank":1,"survived":true},{"round":3,"score":1366,"rank":1,"survived":true},{"round":4,"score":1868,"rank":1,"survived":true},{"round":5,"score":2211,"rank":1,"survived":true},{"round":6,"score":2670,"rank":1,"survived":true},{"round":7,"score":3190,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"decay","env_TR_BITBRAIN_GAINS":"1.0,1.25,1.5,2.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":8,"config_lines":79,"distinct_targets":3,"target_changes":66,"bb_reset_target_change":66,"bb_lines":13,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"bb_learn","run":5,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2912,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":713,"rank":2,"firstPlaces":0,"survivalCount":100},{"name":"RandomMover","totalScore":709,"rank":3,"firstPlaces":0,"survivalCount":550},{"name":"PatternMover","totalScore":690,"rank":4,"firstPlaces":0,"survivalCount":400}],"perRound":[{"round":1,"score":393,"rank":1,"survived":true},{"round":2,"score":726,"rank":1,"survived":true},{"round":3,"score":1126,"rank":1,"survived":true},{"round":4,"score":1564,"rank":1,"survived":true},{"round":5,"score":2062,"rank":1,"survived":true},{"round":6,"score":2467,"rank":1,"survived":true},{"round":7,"score":2912,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"decay","env_TR_BITBRAIN_GAINS":"1.0,1.25,1.5,2.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":12,"config_lines":78,"distinct_targets":3,"target_changes":62,"bb_reset_target_change":62,"bb_lines":5,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_learn","run":6,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2859,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":1033,"rank":2,"firstPlaces":0,"survivalCount":450},{"name":"PatternMover","totalScore":634,"rank":3,"firstPlaces":0,"survivalCount":250},{"name":"RandomMover","totalScore":579,"rank":4,"firstPlaces":0,"survivalCount":350}],"perRound":[{"round":1,"score":511,"rank":1,"survived":true},{"round":2,"score":932,"rank":1,"survived":true},{"round":3,"score":1271,"rank":1,"survived":true},{"round":4,"score":1689,"rank":1,"survived":true},{"round":5,"score":2011,"rank":1,"survived":true},{"round":6,"score":2426,"rank":1,"survived":true},{"round":7,"score":2859,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"decay","env_TR_BITBRAIN_GAINS":"1.0,1.25,1.5,2.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":10,"config_lines":75,"distinct_targets":3,"target_changes":62,"bb_reset_target_change":62,"bb_lines":7,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_learn","run":7,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3092,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":802,"rank":2,"firstPlaces":0,"survivalCount":450},{"name":"PatternMover","totalScore":491,"rank":3,"firstPlaces":0,"survivalCount":300},{"name":"RandomMover","totalScore":400,"rank":4,"firstPlaces":0,"survivalCount":300}],"perRound":[{"round":1,"score":455,"rank":1,"survived":true},{"round":2,"score":934,"rank":1,"survived":true},{"round":3,"score":1338,"rank":1,"survived":true},{"round":4,"score":1776,"rank":1,"survived":true},{"round":5,"score":2233,"rank":1,"survived":true},{"round":6,"score":2652,"rank":1,"survived":true},{"round":7,"score":3092,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"decay","env_TR_BITBRAIN_GAINS":"1.0,1.25,1.5,2.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":11,"config_lines":79,"distinct_targets":3,"target_changes":64,"bb_reset_target_change":64,"bb_lines":19,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_learn","run":8,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2907,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":1139,"rank":2,"firstPlaces":0,"survivalCount":550},{"name":"PatternMover","totalScore":554,"rank":3,"firstPlaces":0,"survivalCount":350},{"name":"RandomMover","totalScore":364,"rank":4,"firstPlaces":0,"survivalCount":150}],"perRound":[{"round":1,"score":416,"rank":1,"survived":true},{"round":2,"score":836,"rank":1,"survived":true},{"round":3,"score":1210,"rank":1,"survived":true},{"round":4,"score":1569,"rank":1,"survived":true},{"round":5,"score":2081,"rank":1,"survived":true},{"round":6,"score":2542,"rank":1,"survived":true},{"round":7,"score":2907,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"decay","env_TR_BITBRAIN_GAINS":"1.0,1.25,1.5,2.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":12,"config_lines":76,"distinct_targets":3,"target_changes":60,"bb_reset_target_change":60,"bb_lines":10,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"bb_learn","run":9,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3066,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"RandomMover","totalScore":642,"rank":2,"firstPlaces":0,"survivalCount":450},{"name":"WaveSurfer","totalScore":624,"rank":3,"firstPlaces":0,"survivalCount":300},{"name":"PatternMover","totalScore":479,"rank":4,"firstPlaces":0,"survivalCount":300}],"perRound":[{"round":1,"score":362,"rank":1,"survived":true},{"round":2,"score":836,"rank":1,"survived":true},{"round":3,"score":1247,"rank":1,"survived":true},{"round":4,"score":1666,"rank":1,"survived":true},{"round":5,"score":2122,"rank":1,"survived":true},{"round":6,"score":2552,"rank":1,"survived":true},{"round":7,"score":3066,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"decay","env_TR_BITBRAIN_GAINS":"1.0,1.25,1.5,2.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":12,"config_lines":77,"distinct_targets":3,"target_changes":63,"bb_reset_target_change":63,"bb_lines":15,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_ret","run":1,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2891,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":780,"rank":2,"firstPlaces":0,"survivalCount":300},{"name":"RandomMover","totalScore":674,"rank":3,"firstPlaces":0,"survivalCount":450},{"name":"PatternMover","totalScore":596,"rank":4,"firstPlaces":0,"survivalCount":300}],"perRound":[{"round":1,"score":441,"rank":1,"survived":true},{"round":2,"score":876,"rank":1,"survived":true},{"round":3,"score":1243,"rank":1,"survived":true},{"round":4,"score":1640,"rank":1,"survived":true},{"round":5,"score":2042,"rank":1,"survived":true},{"round":6,"score":2442,"rank":1,"survived":true},{"round":7,"score":2891,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"retained","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":9,"config_lines":73,"distinct_targets":3,"target_changes":60,"bb_reset_target_change":62,"bb_lines":42,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_ret","run":10,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2770,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":1234,"rank":2,"firstPlaces":0,"survivalCount":500},{"name":"RandomMover","totalScore":472,"rank":3,"firstPlaces":0,"survivalCount":350},{"name":"PatternMover","totalScore":467,"rank":4,"firstPlaces":0,"survivalCount":200}],"perRound":[{"round":1,"score":396,"rank":1,"survived":true},{"round":2,"score":861,"rank":1,"survived":true},{"round":3,"score":1235,"rank":1,"survived":true},{"round":4,"score":1620,"rank":1,"survived":true},{"round":5,"score":1969,"rank":1,"survived":true},{"round":6,"score":2368,"rank":1,"survived":true},{"round":7,"score":2770,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"retained","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":13,"config_lines":82,"distinct_targets":3,"target_changes":67,"bb_reset_target_change":67,"bb_lines":35,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_ret","run":11,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2792,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":953,"rank":2,"firstPlaces":0,"survivalCount":400},{"name":"RandomMover","totalScore":592,"rank":3,"firstPlaces":0,"survivalCount":400},{"name":"PatternMover","totalScore":498,"rank":4,"firstPlaces":0,"survivalCount":250}],"perRound":[{"round":1,"score":435,"rank":1,"survived":true},{"round":2,"score":825,"rank":1,"survived":true},{"round":3,"score":1185,"rank":1,"survived":true},{"round":4,"score":1596,"rank":1,"survived":true},{"round":5,"score":2030,"rank":1,"survived":true},{"round":6,"score":2397,"rank":1,"survived":true},{"round":7,"score":2792,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"retained","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":13,"config_lines":87,"distinct_targets":3,"target_changes":73,"bb_reset_target_change":73,"bb_lines":32,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_ret","run":12,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2934,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"PatternMover","totalScore":656,"rank":2,"firstPlaces":0,"survivalCount":450},{"name":"RandomMover","totalScore":600,"rank":3,"firstPlaces":0,"survivalCount":400},{"name":"WaveSurfer","totalScore":568,"rank":4,"firstPlaces":0,"survivalCount":200}],"perRound":[{"round":1,"score":410,"rank":1,"survived":true},{"round":2,"score":859,"rank":1,"survived":true},{"round":3,"score":1205,"rank":1,"survived":true},{"round":4,"score":1572,"rank":1,"survived":true},{"round":5,"score":1950,"rank":1,"survived":true},{"round":6,"score":2458,"rank":1,"survived":true},{"round":7,"score":2934,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"retained","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":11,"config_lines":69,"distinct_targets":3,"target_changes":54,"bb_reset_target_change":54,"bb_lines":49,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"bb_ret","run":13,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2943,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":812,"rank":2,"firstPlaces":0,"survivalCount":250},{"name":"PatternMover","totalScore":701,"rank":3,"firstPlaces":0,"survivalCount":400},{"name":"RandomMover","totalScore":579,"rank":4,"firstPlaces":0,"survivalCount":400}],"perRound":[{"round":1,"score":539,"rank":1,"survived":true},{"round":2,"score":914,"rank":1,"survived":true},{"round":3,"score":1287,"rank":1,"survived":true},{"round":4,"score":1676,"rank":1,"survived":true},{"round":5,"score":2071,"rank":1,"survived":true},{"round":6,"score":2517,"rank":1,"survived":true},{"round":7,"score":2943,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"retained","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":13,"config_lines":76,"distinct_targets":3,"target_changes":63,"bb_reset_target_change":63,"bb_lines":49,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"bb_ret","run":14,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2890,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":883,"rank":2,"firstPlaces":0,"survivalCount":400},{"name":"PatternMover","totalScore":752,"rank":3,"firstPlaces":0,"survivalCount":450},{"name":"RandomMover","totalScore":340,"rank":4,"firstPlaces":0,"survivalCount":200}],"perRound":[{"round":1,"score":454,"rank":1,"survived":true},{"round":2,"score":914,"rank":1,"survived":true},{"round":3,"score":1344,"rank":1,"survived":true},{"round":4,"score":1725,"rank":1,"survived":true},{"round":5,"score":2092,"rank":1,"survived":true},{"round":6,"score":2498,"rank":1,"survived":true},{"round":7,"score":2890,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"retained","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":10,"config_lines":84,"distinct_targets":3,"target_changes":70,"bb_reset_target_change":70,"bb_lines":43,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_ret","run":15,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2817,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":875,"rank":2,"firstPlaces":0,"survivalCount":400},{"name":"RandomMover","totalScore":578,"rank":3,"firstPlaces":0,"survivalCount":400},{"name":"PatternMover","totalScore":561,"rank":4,"firstPlaces":0,"survivalCount":250}],"perRound":[{"round":1,"score":402,"rank":1,"survived":true},{"round":2,"score":845,"rank":1,"survived":true},{"round":3,"score":1271,"rank":1,"survived":true},{"round":4,"score":1581,"rank":1,"survived":true},{"round":5,"score":1928,"rank":1,"survived":true},{"round":6,"score":2373,"rank":1,"survived":true},{"round":7,"score":2817,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"retained","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":9,"config_lines":102,"distinct_targets":3,"target_changes":83,"bb_reset_target_change":83,"bb_lines":46,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_ret","run":16,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2999,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":973,"rank":2,"firstPlaces":0,"survivalCount":450},{"name":"PatternMover","totalScore":498,"rank":3,"firstPlaces":0,"survivalCount":300},{"name":"RandomMover","totalScore":448,"rank":4,"firstPlaces":0,"survivalCount":300}],"perRound":[{"round":1,"score":485,"rank":1,"survived":true},{"round":2,"score":854,"rank":1,"survived":true},{"round":3,"score":1243,"rank":1,"survived":true},{"round":4,"score":1706,"rank":1,"survived":true},{"round":5,"score":2171,"rank":1,"survived":true},{"round":6,"score":2569,"rank":1,"survived":true},{"round":7,"score":2999,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"retained","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":12,"config_lines":79,"distinct_targets":3,"target_changes":65,"bb_reset_target_change":65,"bb_lines":47,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"bb_ret","run":2,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2994,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":938,"rank":2,"firstPlaces":0,"survivalCount":450},{"name":"RandomMover","totalScore":582,"rank":3,"firstPlaces":0,"survivalCount":400},{"name":"PatternMover","totalScore":370,"rank":4,"firstPlaces":0,"survivalCount":200}],"perRound":[{"round":1,"score":477,"rank":1,"survived":true},{"round":2,"score":816,"rank":1,"survived":true},{"round":3,"score":1326,"rank":1,"survived":true},{"round":4,"score":1795,"rank":1,"survived":true},{"round":5,"score":2226,"rank":1,"survived":true},{"round":6,"score":2651,"rank":1,"survived":true},{"round":7,"score":2994,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"retained","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":11,"config_lines":92,"distinct_targets":3,"target_changes":73,"bb_reset_target_change":73,"bb_lines":43,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_ret","run":3,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2913,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":1024,"rank":2,"firstPlaces":0,"survivalCount":500},{"name":"PatternMover","totalScore":640,"rank":3,"firstPlaces":0,"survivalCount":400},{"name":"RandomMover","totalScore":358,"rank":4,"firstPlaces":0,"survivalCount":150}],"perRound":[{"round":1,"score":413,"rank":1,"survived":true},{"round":2,"score":728,"rank":1,"survived":true},{"round":3,"score":1173,"rank":1,"survived":true},{"round":4,"score":1678,"rank":1,"survived":true},{"round":5,"score":2095,"rank":1,"survived":true},{"round":6,"score":2509,"rank":1,"survived":true},{"round":7,"score":2913,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"retained","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":8,"config_lines":89,"distinct_targets":3,"target_changes":71,"bb_reset_target_change":71,"bb_lines":37,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_ret","run":4,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2920,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":813,"rank":2,"firstPlaces":0,"survivalCount":200},{"name":"PatternMover","totalScore":762,"rank":3,"firstPlaces":0,"survivalCount":550},{"name":"RandomMover","totalScore":531,"rank":4,"firstPlaces":0,"survivalCount":300}],"perRound":[{"round":1,"score":467,"rank":1,"survived":true},{"round":2,"score":876,"rank":1,"survived":true},{"round":3,"score":1205,"rank":1,"survived":true},{"round":4,"score":1597,"rank":1,"survived":true},{"round":5,"score":2062,"rank":1,"survived":true},{"round":6,"score":2487,"rank":1,"survived":true},{"round":7,"score":2920,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"retained","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":10,"config_lines":69,"distinct_targets":3,"target_changes":55,"bb_reset_target_change":55,"bb_lines":45,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_ret","run":5,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2890,"rank":1,"firstPlaces":7,"survivalCount":1000,"found":true},"field":[{"name":"RandomMover","totalScore":624,"rank":2,"firstPlaces":0,"survivalCount":450},{"name":"PatternMover","totalScore":614,"rank":3,"firstPlaces":0,"survivalCount":400},{"name":"WaveSurfer","totalScore":530,"rank":4,"firstPlaces":0,"survivalCount":100}],"perRound":[{"round":1,"score":525,"rank":1,"survived":true},{"round":2,"score":918,"rank":1,"survived":true},{"round":3,"score":1249,"rank":1,"survived":true},{"round":4,"score":1684,"rank":1,"survived":true},{"round":5,"score":2075,"rank":1,"survived":true},{"round":6,"score":2553,"rank":1,"survived":true},{"round":7,"score":2890,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"retained","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":13,"config_lines":96,"distinct_targets":3,"target_changes":82,"bb_reset_target_change":82,"bb_lines":43,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"bb_ret","run":6,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3011,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":725,"rank":2,"firstPlaces":0,"survivalCount":300},{"name":"RandomMover","totalScore":598,"rank":3,"firstPlaces":0,"survivalCount":450},{"name":"PatternMover","totalScore":542,"rank":4,"firstPlaces":0,"survivalCount":300}],"perRound":[{"round":1,"score":506,"rank":1,"survived":true},{"round":2,"score":906,"rank":1,"survived":true},{"round":3,"score":1281,"rank":1,"survived":true},{"round":4,"score":1743,"rank":1,"survived":true},{"round":5,"score":2179,"rank":1,"survived":true},{"round":6,"score":2587,"rank":1,"survived":true},{"round":7,"score":3011,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"retained","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":11,"config_lines":93,"distinct_targets":3,"target_changes":74,"bb_reset_target_change":74,"bb_lines":43,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_ret","run":7,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2945,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"PatternMover","totalScore":730,"rank":2,"firstPlaces":0,"survivalCount":500},{"name":"WaveSurfer","totalScore":674,"rank":3,"firstPlaces":0,"survivalCount":350},{"name":"RandomMover","totalScore":315,"rank":4,"firstPlaces":0,"survivalCount":200}],"perRound":[{"round":1,"score":401,"rank":1,"survived":true},{"round":2,"score":884,"rank":1,"survived":true},{"round":3,"score":1285,"rank":1,"survived":true},{"round":4,"score":1706,"rank":1,"survived":true},{"round":5,"score":2119,"rank":1,"survived":true},{"round":6,"score":2494,"rank":1,"survived":true},{"round":7,"score":2945,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"retained","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":12,"config_lines":99,"distinct_targets":3,"target_changes":84,"bb_reset_target_change":84,"bb_lines":51,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_ret","run":8,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2943,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":1003,"rank":2,"firstPlaces":0,"survivalCount":250},{"name":"PatternMover","totalScore":938,"rank":3,"firstPlaces":0,"survivalCount":550},{"name":"RandomMover","totalScore":308,"rank":4,"firstPlaces":0,"survivalCount":250}],"perRound":[{"round":1,"score":560,"rank":1,"survived":true},{"round":2,"score":977,"rank":1,"survived":true},{"round":3,"score":1462,"rank":1,"survived":true},{"round":4,"score":1806,"rank":1,"survived":true},{"round":5,"score":2130,"rank":1,"survived":true},{"round":6,"score":2583,"rank":1,"survived":true},{"round":7,"score":2943,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"retained","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":9,"config_lines":71,"distinct_targets":3,"target_changes":56,"bb_reset_target_change":56,"bb_lines":30,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"bb_ret","run":9,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2802,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":773,"rank":2,"firstPlaces":0,"survivalCount":150},{"name":"RandomMover","totalScore":732,"rank":3,"firstPlaces":0,"survivalCount":600},{"name":"PatternMover","totalScore":614,"rank":4,"firstPlaces":0,"survivalCount":300}],"perRound":[{"round":1,"score":413,"rank":1,"survived":true},{"round":2,"score":835,"rank":1,"survived":true},{"round":3,"score":1231,"rank":1,"survived":true},{"round":4,"score":1653,"rank":1,"survived":true},{"round":5,"score":2130,"rank":1,"survived":true},{"round":6,"score":2414,"rank":1,"survived":true},{"round":7,"score":2802,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"retained","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":12,"config_lines":71,"distinct_targets":3,"target_changes":59,"bb_reset_target_change":59,"bb_lines":36,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_round","run":1,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3040,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":671,"rank":2,"firstPlaces":0,"survivalCount":250},{"name":"PatternMover","totalScore":652,"rank":3,"firstPlaces":0,"survivalCount":400},{"name":"RandomMover","totalScore":578,"rank":4,"firstPlaces":0,"survivalCount":400}],"perRound":[{"round":1,"score":416,"rank":1,"survived":true},{"round":2,"score":893,"rank":1,"survived":true},{"round":3,"score":1372,"rank":1,"survived":true},{"round":4,"score":1756,"rank":1,"survived":true},{"round":5,"score":2188,"rank":1,"survived":true},{"round":6,"score":2653,"rank":1,"survived":true},{"round":7,"score":3040,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":10,"config_lines":75,"distinct_targets":3,"target_changes":62,"bb_reset_target_change":62,"bb_lines":70,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_round","run":10,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2944,"rank":1,"firstPlaces":6,"survivalCount":900,"found":true},"field":[{"name":"WaveSurfer","totalScore":899,"rank":2,"firstPlaces":0,"survivalCount":400},{"name":"RandomMover","totalScore":742,"rank":3,"firstPlaces":0,"survivalCount":550},{"name":"PatternMover","totalScore":569,"rank":4,"firstPlaces":1,"survivalCount":250}],"perRound":[{"round":1,"score":223,"rank":2,"survived":false},{"round":2,"score":719,"rank":1,"survived":true},{"round":3,"score":1162,"rank":1,"survived":true},{"round":4,"score":1615,"rank":1,"survived":true},{"round":5,"score":2025,"rank":1,"survived":true},{"round":6,"score":2515,"rank":1,"survived":true},{"round":7,"score":2944,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":10,"config_lines":77,"distinct_targets":3,"target_changes":60,"bb_reset_target_change":60,"bb_lines":24,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_round","run":11,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3125,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":775,"rank":2,"firstPlaces":0,"survivalCount":400},{"name":"RandomMover","totalScore":589,"rank":3,"firstPlaces":0,"survivalCount":450},{"name":"PatternMover","totalScore":466,"rank":4,"firstPlaces":0,"survivalCount":200}],"perRound":[{"round":1,"score":454,"rank":1,"survived":true},{"round":2,"score":890,"rank":1,"survived":true},{"round":3,"score":1396,"rank":1,"survived":true},{"round":4,"score":1859,"rank":1,"survived":true},{"round":5,"score":2277,"rank":1,"survived":true},{"round":6,"score":2709,"rank":1,"survived":true},{"round":7,"score":3125,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":11,"config_lines":91,"distinct_targets":3,"target_changes":81,"bb_reset_target_change":81,"bb_lines":48,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_round","run":12,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3110,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":804,"rank":2,"firstPlaces":0,"survivalCount":300},{"name":"PatternMover","totalScore":749,"rank":3,"firstPlaces":0,"survivalCount":450},{"name":"RandomMover","totalScore":513,"rank":4,"firstPlaces":0,"survivalCount":300}],"perRound":[{"round":1,"score":488,"rank":1,"survived":true},{"round":2,"score":947,"rank":1,"survived":true},{"round":3,"score":1371,"rank":1,"survived":true},{"round":4,"score":1879,"rank":1,"survived":true},{"round":5,"score":2236,"rank":1,"survived":true},{"round":6,"score":2612,"rank":1,"survived":true},{"round":7,"score":3110,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":13,"config_lines":72,"distinct_targets":3,"target_changes":62,"bb_reset_target_change":62,"bb_lines":24,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_round","run":13,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3037,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":807,"rank":2,"firstPlaces":0,"survivalCount":450},{"name":"RandomMover","totalScore":664,"rank":3,"firstPlaces":0,"survivalCount":500},{"name":"PatternMover","totalScore":206,"rank":4,"firstPlaces":0,"survivalCount":100}],"perRound":[{"round":1,"score":390,"rank":1,"survived":true},{"round":2,"score":840,"rank":1,"survived":true},{"round":3,"score":1301,"rank":1,"survived":true},{"round":4,"score":1746,"rank":1,"survived":true},{"round":5,"score":2196,"rank":1,"survived":true},{"round":6,"score":2658,"rank":1,"survived":true},{"round":7,"score":3037,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":11,"config_lines":81,"distinct_targets":3,"target_changes":69,"bb_reset_target_change":69,"bb_lines":50,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"bb_round","run":14,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2993,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":801,"rank":2,"firstPlaces":0,"survivalCount":400},{"name":"PatternMover","totalScore":592,"rank":3,"firstPlaces":0,"survivalCount":350},{"name":"RandomMover","totalScore":443,"rank":4,"firstPlaces":0,"survivalCount":300}],"perRound":[{"round":1,"score":453,"rank":1,"survived":true},{"round":2,"score":904,"rank":1,"survived":true},{"round":3,"score":1265,"rank":1,"survived":true},{"round":4,"score":1729,"rank":1,"survived":true},{"round":5,"score":2186,"rank":1,"survived":true},{"round":6,"score":2557,"rank":1,"survived":true},{"round":7,"score":2993,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":13,"config_lines":73,"distinct_targets":3,"target_changes":61,"bb_reset_target_change":61,"bb_lines":42,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"bb_round","run":15,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2985,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":796,"rank":2,"firstPlaces":0,"survivalCount":350},{"name":"RandomMover","totalScore":606,"rank":3,"firstPlaces":0,"survivalCount":450},{"name":"PatternMover","totalScore":545,"rank":4,"firstPlaces":0,"survivalCount":250}],"perRound":[{"round":1,"score":440,"rank":1,"survived":true},{"round":2,"score":812,"rank":1,"survived":true},{"round":3,"score":1299,"rank":1,"survived":true},{"round":4,"score":1750,"rank":1,"survived":true},{"round":5,"score":2211,"rank":1,"survived":true},{"round":6,"score":2613,"rank":1,"survived":true},{"round":7,"score":2985,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":11,"config_lines":87,"distinct_targets":3,"target_changes":73,"bb_reset_target_change":73,"bb_lines":54,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_round","run":16,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2842,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":774,"rank":2,"firstPlaces":0,"survivalCount":350},{"name":"PatternMover","totalScore":702,"rank":3,"firstPlaces":0,"survivalCount":400},{"name":"RandomMover","totalScore":503,"rank":4,"firstPlaces":0,"survivalCount":300}],"perRound":[{"round":1,"score":457,"rank":1,"survived":true},{"round":2,"score":857,"rank":1,"survived":true},{"round":3,"score":1205,"rank":1,"survived":true},{"round":4,"score":1638,"rank":1,"survived":true},{"round":5,"score":1982,"rank":1,"survived":true},{"round":6,"score":2414,"rank":1,"survived":true},{"round":7,"score":2842,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":10,"config_lines":86,"distinct_targets":3,"target_changes":70,"bb_reset_target_change":70,"bb_lines":39,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_round","run":2,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2835,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":996,"rank":2,"firstPlaces":0,"survivalCount":450},{"name":"PatternMover","totalScore":655,"rank":3,"firstPlaces":0,"survivalCount":350},{"name":"RandomMover","totalScore":485,"rank":4,"firstPlaces":0,"survivalCount":250}],"perRound":[{"round":1,"score":352,"rank":1,"survived":true},{"round":2,"score":753,"rank":1,"survived":true},{"round":3,"score":1094,"rank":1,"survived":true},{"round":4,"score":1478,"rank":1,"survived":true},{"round":5,"score":1907,"rank":1,"survived":true},{"round":6,"score":2366,"rank":1,"survived":true},{"round":7,"score":2835,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":9,"config_lines":84,"distinct_targets":3,"target_changes":67,"bb_reset_target_change":67,"bb_lines":38,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"bb_round","run":3,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3045,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":828,"rank":2,"firstPlaces":0,"survivalCount":350},{"name":"PatternMover","totalScore":662,"rank":3,"firstPlaces":0,"survivalCount":400},{"name":"RandomMover","totalScore":525,"rank":4,"firstPlaces":0,"survivalCount":300}],"perRound":[{"round":1,"score":452,"rank":1,"survived":true},{"round":2,"score":939,"rank":1,"survived":true},{"round":3,"score":1453,"rank":1,"survived":true},{"round":4,"score":1801,"rank":1,"survived":true},{"round":5,"score":2245,"rank":1,"survived":true},{"round":6,"score":2611,"rank":1,"survived":true},{"round":7,"score":3045,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":8,"config_lines":79,"distinct_targets":3,"target_changes":63,"bb_reset_target_change":63,"bb_lines":15,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_round","run":4,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3180,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":646,"rank":2,"firstPlaces":0,"survivalCount":350},{"name":"PatternMover","totalScore":512,"rank":3,"firstPlaces":0,"survivalCount":400},{"name":"RandomMover","totalScore":417,"rank":4,"firstPlaces":0,"survivalCount":300}],"perRound":[{"round":1,"score":452,"rank":1,"survived":true},{"round":2,"score":948,"rank":1,"survived":true},{"round":3,"score":1381,"rank":1,"survived":true},{"round":4,"score":1823,"rank":1,"survived":true},{"round":5,"score":2276,"rank":1,"survived":true},{"round":6,"score":2716,"rank":1,"survived":true},{"round":7,"score":3180,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":8,"config_lines":78,"distinct_targets":3,"target_changes":66,"bb_reset_target_change":66,"bb_lines":39,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"bb_round","run":5,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2952,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"PatternMover","totalScore":719,"rank":2,"firstPlaces":0,"survivalCount":400},{"name":"RandomMover","totalScore":675,"rank":3,"firstPlaces":0,"survivalCount":500},{"name":"WaveSurfer","totalScore":639,"rank":4,"firstPlaces":0,"survivalCount":150}],"perRound":[{"round":1,"score":357,"rank":1,"survived":true},{"round":2,"score":776,"rank":1,"survived":true},{"round":3,"score":1161,"rank":1,"survived":true},{"round":4,"score":1571,"rank":1,"survived":true},{"round":5,"score":2053,"rank":1,"survived":true},{"round":6,"score":2469,"rank":1,"survived":true},{"round":7,"score":2952,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":9,"config_lines":81,"distinct_targets":3,"target_changes":70,"bb_reset_target_change":70,"bb_lines":51,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"bb_round","run":6,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3126,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"RandomMover","totalScore":659,"rank":2,"firstPlaces":0,"survivalCount":550},{"name":"PatternMover","totalScore":539,"rank":3,"firstPlaces":0,"survivalCount":350},{"name":"WaveSurfer","totalScore":379,"rank":4,"firstPlaces":0,"survivalCount":150}],"perRound":[{"round":1,"score":461,"rank":1,"survived":true},{"round":2,"score":920,"rank":1,"survived":true},{"round":3,"score":1355,"rank":1,"survived":true},{"round":4,"score":1826,"rank":1,"survived":true},{"round":5,"score":2303,"rank":1,"survived":true},{"round":6,"score":2699,"rank":1,"survived":true},{"round":7,"score":3126,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":13,"config_lines":89,"distinct_targets":3,"target_changes":71,"bb_reset_target_change":71,"bb_lines":45,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"bb_round","run":7,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2927,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"RandomMover","totalScore":793,"rank":2,"firstPlaces":0,"survivalCount":550},{"name":"WaveSurfer","totalScore":689,"rank":3,"firstPlaces":0,"survivalCount":150},{"name":"PatternMover","totalScore":640,"rank":4,"firstPlaces":0,"survivalCount":350}],"perRound":[{"round":1,"score":538,"rank":1,"survived":true},{"round":2,"score":938,"rank":1,"survived":true},{"round":3,"score":1296,"rank":1,"survived":true},{"round":4,"score":1704,"rank":1,"survived":true},{"round":5,"score":2099,"rank":1,"survived":true},{"round":6,"score":2543,"rank":1,"survived":true},{"round":7,"score":2927,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":10,"config_lines":86,"distinct_targets":3,"target_changes":75,"bb_reset_target_change":75,"bb_lines":65,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"bb_round","run":8,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3021,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":726,"rank":2,"firstPlaces":0,"survivalCount":350},{"name":"PatternMover","totalScore":690,"rank":3,"firstPlaces":0,"survivalCount":500},{"name":"RandomMover","totalScore":364,"rank":4,"firstPlaces":0,"survivalCount":200}],"perRound":[{"round":1,"score":421,"rank":1,"survived":true},{"round":2,"score":832,"rank":1,"survived":true},{"round":3,"score":1298,"rank":1,"survived":true},{"round":4,"score":1681,"rank":1,"survived":true},{"round":5,"score":2114,"rank":1,"survived":true},{"round":6,"score":2533,"rank":1,"survived":true},{"round":7,"score":3021,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":12,"config_lines":101,"distinct_targets":3,"target_changes":83,"bb_reset_target_change":83,"bb_lines":30,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"bb_round","run":9,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2804,"rank":1,"firstPlaces":7,"survivalCount":950,"found":true},"field":[{"name":"WaveSurfer","totalScore":1173,"rank":2,"firstPlaces":0,"survivalCount":500},{"name":"PatternMover","totalScore":758,"rank":3,"firstPlaces":0,"survivalCount":450},{"name":"RandomMover","totalScore":452,"rank":4,"firstPlaces":0,"survivalCount":200}],"perRound":[{"round":1,"score":433,"rank":1,"survived":true},{"round":2,"score":854,"rank":1,"survived":true},{"round":3,"score":1285,"rank":1,"survived":true},{"round":4,"score":1656,"rank":1,"survived":true},{"round":5,"score":1999,"rank":1,"survived":true},{"round":6,"score":2453,"rank":1,"survived":true},{"round":7,"score":2804,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"off","env_TR_RACK_BITBRAIN":"melee","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"BITBRAIN","rack_active_1v1":"FULL","rack_melee_lines":9,"config_lines":81,"distinct_targets":3,"target_changes":67,"bb_reset_target_change":67,"bb_lines":60,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"pattern","run":1,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3082,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"PatternMover","totalScore":817,"rank":2,"firstPlaces":0,"survivalCount":550},{"name":"RandomMover","totalScore":706,"rank":3,"firstPlaces":0,"survivalCount":450},{"name":"WaveSurfer","totalScore":558,"rank":4,"firstPlaces":0,"survivalCount":50}],"perRound":[{"round":1,"score":440,"rank":1,"survived":true},{"round":2,"score":903,"rank":1,"survived":true},{"round":3,"score":1364,"rank":1,"survived":true},{"round":4,"score":1753,"rank":1,"survived":true},{"round":5,"score":2123,"rank":1,"survived":true},{"round":6,"score":2547,"rank":1,"survived":true},{"round":7,"score":3082,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"both","env_TR_RACK_BITBRAIN":"off","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"PATTERN","rack_active_1v1":"PATTERN","rack_melee_lines":9,"config_lines":76,"distinct_targets":3,"target_changes":66,"bb_reset_target_change":0,"bb_lines":0,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"pattern","run":10,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2795,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":964,"rank":2,"firstPlaces":0,"survivalCount":500},{"name":"PatternMover","totalScore":698,"rank":3,"firstPlaces":0,"survivalCount":350},{"name":"RandomMover","totalScore":471,"rank":4,"firstPlaces":0,"survivalCount":200}],"perRound":[{"round":1,"score":364,"rank":1,"survived":true},{"round":2,"score":768,"rank":1,"survived":true},{"round":3,"score":1198,"rank":1,"survived":true},{"round":4,"score":1624,"rank":1,"survived":true},{"round":5,"score":1950,"rank":1,"survived":true},{"round":6,"score":2373,"rank":1,"survived":true},{"round":7,"score":2795,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"both","env_TR_RACK_BITBRAIN":"off","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"PATTERN","rack_active_1v1":"PATTERN","rack_melee_lines":10,"config_lines":74,"distinct_targets":3,"target_changes":56,"bb_reset_target_change":0,"bb_lines":0,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"pattern","run":11,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2897,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"PatternMover","totalScore":642,"rank":2,"firstPlaces":0,"survivalCount":400},{"name":"RandomMover","totalScore":635,"rank":3,"firstPlaces":0,"survivalCount":500},{"name":"WaveSurfer","totalScore":609,"rank":4,"firstPlaces":0,"survivalCount":150}],"perRound":[{"round":1,"score":389,"rank":1,"survived":true},{"round":2,"score":810,"rank":1,"survived":true},{"round":3,"score":1297,"rank":1,"survived":true},{"round":4,"score":1645,"rank":1,"survived":true},{"round":5,"score":2047,"rank":1,"survived":true},{"round":6,"score":2434,"rank":1,"survived":true},{"round":7,"score":2897,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"both","env_TR_RACK_BITBRAIN":"off","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"PATTERN","rack_active_1v1":"PATTERN","rack_melee_lines":13,"config_lines":87,"distinct_targets":3,"target_changes":73,"bb_reset_target_change":0,"bb_lines":0,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"pattern","run":12,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2915,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":798,"rank":2,"firstPlaces":0,"survivalCount":450},{"name":"RandomMover","totalScore":509,"rank":3,"firstPlaces":0,"survivalCount":350},{"name":"PatternMover","totalScore":441,"rank":4,"firstPlaces":0,"survivalCount":250}],"perRound":[{"round":1,"score":411,"rank":1,"survived":true},{"round":2,"score":789,"rank":1,"survived":true},{"round":3,"score":1225,"rank":1,"survived":true},{"round":4,"score":1611,"rank":1,"survived":true},{"round":5,"score":1992,"rank":1,"survived":true},{"round":6,"score":2475,"rank":1,"survived":true},{"round":7,"score":2915,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"both","env_TR_RACK_BITBRAIN":"off","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"PATTERN","rack_active_1v1":"PATTERN","rack_melee_lines":11,"config_lines":91,"distinct_targets":3,"target_changes":77,"bb_reset_target_change":0,"bb_lines":0,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"pattern","run":13,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3176,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":867,"rank":2,"firstPlaces":0,"survivalCount":400},{"name":"PatternMover","totalScore":624,"rank":3,"firstPlaces":0,"survivalCount":250},{"name":"RandomMover","totalScore":563,"rank":4,"firstPlaces":0,"survivalCount":400}],"perRound":[{"round":1,"score":463,"rank":1,"survived":true},{"round":2,"score":876,"rank":1,"survived":true},{"round":3,"score":1244,"rank":1,"survived":true},{"round":4,"score":1766,"rank":1,"survived":true},{"round":5,"score":2201,"rank":1,"survived":true},{"round":6,"score":2620,"rank":1,"survived":true},{"round":7,"score":3176,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"both","env_TR_RACK_BITBRAIN":"off","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"PATTERN","rack_active_1v1":"PATTERN","rack_melee_lines":10,"config_lines":71,"distinct_targets":3,"target_changes":53,"bb_reset_target_change":0,"bb_lines":0,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"pattern","run":14,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2922,"rank":1,"firstPlaces":7,"survivalCount":950,"found":true},"field":[{"name":"WaveSurfer","totalScore":799,"rank":2,"firstPlaces":0,"survivalCount":350},{"name":"PatternMover","totalScore":676,"rank":3,"firstPlaces":0,"survivalCount":400},{"name":"RandomMover","totalScore":581,"rank":4,"firstPlaces":0,"survivalCount":400}],"perRound":[{"round":1,"score":424,"rank":1,"survived":true},{"round":2,"score":892,"rank":1,"survived":true},{"round":3,"score":1312,"rank":1,"survived":true},{"round":4,"score":1792,"rank":1,"survived":true},{"round":5,"score":2209,"rank":1,"survived":true},{"round":6,"score":2600,"rank":1,"survived":true},{"round":7,"score":2922,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"both","env_TR_RACK_BITBRAIN":"off","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"PATTERN","rack_active_1v1":"PATTERN","rack_melee_lines":10,"config_lines":79,"distinct_targets":3,"target_changes":67,"bb_reset_target_change":0,"bb_lines":0,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"pattern","run":15,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2860,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":988,"rank":2,"firstPlaces":0,"survivalCount":350},{"name":"RandomMover","totalScore":681,"rank":3,"firstPlaces":0,"survivalCount":450},{"name":"PatternMover","totalScore":521,"rank":4,"firstPlaces":0,"survivalCount":250}],"perRound":[{"round":1,"score":379,"rank":1,"survived":true},{"round":2,"score":762,"rank":1,"survived":true},{"round":3,"score":1196,"rank":1,"survived":true},{"round":4,"score":1630,"rank":1,"survived":true},{"round":5,"score":2050,"rank":1,"survived":true},{"round":6,"score":2464,"rank":1,"survived":true},{"round":7,"score":2860,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"both","env_TR_RACK_BITBRAIN":"off","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"PATTERN","rack_active_1v1":"PATTERN","rack_melee_lines":13,"config_lines":79,"distinct_targets":3,"target_changes":67,"bb_reset_target_change":0,"bb_lines":0,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"pattern","run":16,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2878,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"PatternMover","totalScore":725,"rank":2,"firstPlaces":0,"survivalCount":400},{"name":"RandomMover","totalScore":725,"rank":3,"firstPlaces":0,"survivalCount":450},{"name":"WaveSurfer","totalScore":557,"rank":4,"firstPlaces":0,"survivalCount":200}],"perRound":[{"round":1,"score":401,"rank":1,"survived":true},{"round":2,"score":781,"rank":1,"survived":true},{"round":3,"score":1131,"rank":1,"survived":true},{"round":4,"score":1524,"rank":1,"survived":true},{"round":5,"score":1957,"rank":1,"survived":true},{"round":6,"score":2466,"rank":1,"survived":true},{"round":7,"score":2878,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"both","env_TR_RACK_BITBRAIN":"off","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"PATTERN","rack_active_1v1":"PATTERN","rack_melee_lines":12,"config_lines":82,"distinct_targets":3,"target_changes":69,"bb_reset_target_change":0,"bb_lines":0,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"pattern","run":2,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3261,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":643,"rank":2,"firstPlaces":0,"survivalCount":350},{"name":"PatternMover","totalScore":515,"rank":3,"firstPlaces":0,"survivalCount":350},{"name":"RandomMover","totalScore":472,"rank":4,"firstPlaces":0,"survivalCount":350}],"perRound":[{"round":1,"score":456,"rank":1,"survived":true},{"round":2,"score":898,"rank":1,"survived":true},{"round":3,"score":1360,"rank":1,"survived":true},{"round":4,"score":1881,"rank":1,"survived":true},{"round":5,"score":2268,"rank":1,"survived":true},{"round":6,"score":2746,"rank":1,"survived":true},{"round":7,"score":3261,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"both","env_TR_RACK_BITBRAIN":"off","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"PATTERN","rack_active_1v1":"PATTERN","rack_melee_lines":8,"config_lines":90,"distinct_targets":3,"target_changes":79,"bb_reset_target_change":0,"bb_lines":0,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"pattern","run":3,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2957,"rank":1,"firstPlaces":6,"survivalCount":1000,"found":true},"field":[{"name":"WaveSurfer","totalScore":911,"rank":2,"firstPlaces":1,"survivalCount":400},{"name":"RandomMover","totalScore":614,"rank":3,"firstPlaces":0,"survivalCount":350},{"name":"PatternMover","totalScore":613,"rank":4,"firstPlaces":0,"survivalCount":350}],"perRound":[{"round":1,"score":490,"rank":1,"survived":true},{"round":2,"score":915,"rank":1,"survived":true},{"round":3,"score":1375,"rank":1,"survived":true},{"round":4,"score":1802,"rank":1,"survived":true},{"round":5,"score":2307,"rank":1,"survived":true},{"round":6,"score":2694,"rank":1,"survived":true},{"round":7,"score":2957,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"both","env_TR_RACK_BITBRAIN":"off","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"PATTERN","rack_active_1v1":"PATTERN","rack_melee_lines":8,"config_lines":80,"distinct_targets":3,"target_changes":67,"bb_reset_target_change":0,"bb_lines":0,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"pattern","run":4,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3106,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"PatternMover","totalScore":673,"rank":2,"firstPlaces":0,"survivalCount":400},{"name":"RandomMover","totalScore":644,"rank":3,"firstPlaces":0,"survivalCount":400},{"name":"WaveSurfer","totalScore":566,"rank":4,"firstPlaces":0,"survivalCount":250}],"perRound":[{"round":1,"score":386,"rank":1,"survived":true},{"round":2,"score":867,"rank":1,"survived":true},{"round":3,"score":1290,"rank":1,"survived":true},{"round":4,"score":1739,"rank":1,"survived":true},{"round":5,"score":2192,"rank":1,"survived":true},{"round":6,"score":2660,"rank":1,"survived":true},{"round":7,"score":3106,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"both","env_TR_RACK_BITBRAIN":"off","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"PATTERN","rack_active_1v1":"PATTERN","rack_melee_lines":9,"config_lines":65,"distinct_targets":3,"target_changes":51,"bb_reset_target_change":0,"bb_lines":0,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"pattern","run":5,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2869,"rank":1,"firstPlaces":6,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":971,"rank":2,"firstPlaces":1,"survivalCount":450},{"name":"PatternMover","totalScore":661,"rank":3,"firstPlaces":0,"survivalCount":300},{"name":"RandomMover","totalScore":477,"rank":4,"firstPlaces":0,"survivalCount":300}],"perRound":[{"round":1,"score":398,"rank":1,"survived":true},{"round":2,"score":881,"rank":1,"survived":true},{"round":3,"score":1173,"rank":1,"survived":true},{"round":4,"score":1546,"rank":1,"survived":true},{"round":5,"score":2030,"rank":1,"survived":true},{"round":6,"score":2432,"rank":1,"survived":true},{"round":7,"score":2869,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"both","env_TR_RACK_BITBRAIN":"off","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"PATTERN","rack_active_1v1":"PATTERN","rack_melee_lines":13,"config_lines":67,"distinct_targets":3,"target_changes":51,"bb_reset_target_change":0,"bb_lines":0,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"pattern","run":6,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":3194,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":964,"rank":2,"firstPlaces":0,"survivalCount":450},{"name":"RandomMover","totalScore":473,"rank":3,"firstPlaces":0,"survivalCount":350},{"name":"PatternMover","totalScore":447,"rank":4,"firstPlaces":0,"survivalCount":250}],"perRound":[{"round":1,"score":378,"rank":1,"survived":true},{"round":2,"score":878,"rank":1,"survived":true},{"round":3,"score":1347,"rank":1,"survived":true},{"round":4,"score":1886,"rank":1,"survived":true},{"round":5,"score":2279,"rank":1,"survived":true},{"round":6,"score":2716,"rank":1,"survived":true},{"round":7,"score":3194,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"both","env_TR_RACK_BITBRAIN":"off","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"PATTERN","rack_active_1v1":"PATTERN","rack_melee_lines":9,"config_lines":79,"distinct_targets":3,"target_changes":67,"bb_reset_target_change":0,"bb_lines":0,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"pattern","run":7,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2728,"rank":1,"firstPlaces":6,"survivalCount":900,"found":true},"field":[{"name":"PatternMover","totalScore":1012,"rank":2,"firstPlaces":0,"survivalCount":600},{"name":"WaveSurfer","totalScore":854,"rank":3,"firstPlaces":0,"survivalCount":300},{"name":"RandomMover","totalScore":604,"rank":4,"firstPlaces":1,"survivalCount":300}],"perRound":[{"round":1,"score":396,"rank":1,"survived":true},{"round":2,"score":863,"rank":1,"survived":true},{"round":3,"score":1282,"rank":1,"survived":true},{"round":4,"score":1649,"rank":1,"survived":true},{"round":5,"score":2097,"rank":1,"survived":true},{"round":6,"score":2550,"rank":1,"survived":true},{"round":7,"score":2728,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"both","env_TR_RACK_BITBRAIN":"off","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"PATTERN","rack_active_1v1":"PATTERN","rack_melee_lines":10,"config_lines":76,"distinct_targets":3,"target_changes":64,"bb_reset_target_change":0,"bb_lines":0,"result_end_won":"7/7"}}
@@ -0,0 +1 @@
{"arm":"pattern","run":8,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2869,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":736,"rank":2,"firstPlaces":0,"survivalCount":300},{"name":"PatternMover","totalScore":707,"rank":3,"firstPlaces":0,"survivalCount":450},{"name":"RandomMover","totalScore":547,"rank":4,"firstPlaces":0,"survivalCount":300}],"perRound":[{"round":1,"score":388,"rank":1,"survived":true},{"round":2,"score":886,"rank":1,"survived":true},{"round":3,"score":1262,"rank":1,"survived":true},{"round":4,"score":1665,"rank":1,"survived":true},{"round":5,"score":2074,"rank":1,"survived":true},{"round":6,"score":2461,"rank":1,"survived":true},{"round":7,"score":2869,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"both","env_TR_RACK_BITBRAIN":"off","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"PATTERN","rack_active_1v1":"PATTERN","rack_melee_lines":12,"config_lines":94,"distinct_targets":3,"target_changes":81,"bb_reset_target_change":0,"bb_lines":0,"result_end_won":""}}
@@ -0,0 +1 @@
{"arm":"pattern","run":9,"rounds":7,"commit":"0f5cfe37b24952ae07fee0a7db526317ae127e6c","binary_sha256":"11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca","ok":true,"modularbot":{"name":"ModularBot","totalScore":2931,"rank":1,"firstPlaces":7,"survivalCount":1050,"found":true},"field":[{"name":"WaveSurfer","totalScore":791,"rank":2,"firstPlaces":0,"survivalCount":250},{"name":"PatternMover","totalScore":711,"rank":3,"firstPlaces":0,"survivalCount":350},{"name":"RandomMover","totalScore":578,"rank":4,"firstPlaces":0,"survivalCount":450}],"perRound":[{"round":1,"score":465,"rank":1,"survived":true},{"round":2,"score":917,"rank":1,"survived":true},{"round":3,"score":1315,"rank":1,"survived":true},{"round":4,"score":1712,"rank":1,"survived":true},{"round":5,"score":2129,"rank":1,"survived":true},{"round":6,"score":2565,"rank":1,"survived":true},{"round":7,"score":2931,"rank":1,"survived":true}],"live":{"env_TR_RACK_PATTERN":"both","env_TR_RACK_BITBRAIN":"off","env_TR_BITBRAIN_MEM":"perRound","env_TR_BITBRAIN_GAINS":"0.0,0.25,0.5,0.75,1.0","env_TR_MOVEMENT":"tfil","rack_active_melee":"PATTERN","rack_active_1v1":"PATTERN","rack_melee_lines":11,"config_lines":84,"distinct_targets":3,"target_changes":75,"bb_reset_target_change":0,"bb_lines":0,"result_end_won":""}}
@@ -0,0 +1,404 @@
## MELEE A/B: is BitBrain actually better than Pattern in melee?
##
## The repo's FIRST melee measurement. Runs a 4-bot Free-For-All
## (ModularBot + WaveSurfer + PatternMover + RandomMover) for each arm, where
## the ONLY thing that differs between arms is ModularBot's gun-rack environment
## (`TR_RACK_*` / `TR_BITBRAIN_*`). Every other bot is held fixed.
##
## Why melee needs its own measurement: Pattern's advantage comes from
## accumulating history with ONE enemy. Melee rotates targets, fragmenting
## per-enemy history, so a gun that resets per target and re-adapts fast
## (BitBrain, `TR_BITBRAIN_RESET_ON_TARGET=on` by default) could gain exactly
## where Pattern loses. That is the hypothesis; this runner produces the number.
##
## Design (see docs/melee_bitbrain_ab.md):
## * arms differ ONLY in the ModularBot wrapper script's exported env;
## * each run gets its own ModularBot bot-dir + stdout/stderr log, so liveness
## (`[env] rack active melee = ...`) and target-switching evidence
## (`[config] ... target=#N`, `[bb-reset] reason=target_change`) are captured;
## * the runner is driven in one process per arm from a shell driver; each
## process gets its own Tank Royale server (ephemeral port).
##
## Usage:
## nim c -r --nimcache:/tmp/nc_j116 --path:common_libs \
## common_libs/tests/measure_melee_bitbrain_ab.nim --list-arms
##
## MELEE_SERVER_JAR=<jar> \
## common_libs/tests/measure_melee_bitbrain_ab.nim \
## --outdir /tmp/melee_ab --build-only
##
## common_libs/tests/measure_melee_bitbrain_ab.nim \
## --outdir /tmp/melee_ab --arm pattern --run-start 1 --run-count 16
##
## Arm env (verbatim, from the arms table below) is written into the per-run
## wrapper script; the runner process' own environment is NOT mutated for the
## bot, so parallel arm processes cannot leak into each other.
import std/[os, osproc, strutils, strformat, json, sequtils]
import test_framework/server_manager
import test_framework/runner_process
import test_framework/battle_result
# ── the field (fixed across arms) ────────────────────────────────────────────
const
repoSuffix = "common_libs" / "test_framework" / "adversaries"
AdversaryNames = ["WaveSurfer", "PatternMover", "RandomMover"]
## Mixed field: one strong reactive mover (WaveSurfer, linear gun), one
## deterministic pattern mover (PatternMover), one erratic mover
## (RandomMover). All three shoot.
# ── the arms (ONLY ModularBot's gun rack differs) ────────────────────────────
type
Arm = object
name*: string
env*: seq[string] ## "KEY=VALUE", exported in the per-run wrapper script
note*: string
const Arms*: array[4, Arm] = [
Arm(name: "pattern", env: @[],
note: "shipped default: Pattern-only rack, no env"),
Arm(name: "bb_round",
env: @["TR_RACK_PATTERN=off", "TR_RACK_BITBRAIN=melee",
"TR_BITBRAIN_MEM=perRound", "TR_BITBRAIN_LOG=1"],
note: "BitBrain-only melee rack, perRound memory"),
Arm(name: "bb_ret",
env: @["TR_RACK_PATTERN=off", "TR_RACK_BITBRAIN=melee",
"TR_BITBRAIN_MEM=retained", "TR_BITBRAIN_LOG=1"],
note: "BitBrain-only melee rack, retained memory"),
Arm(name: "bb_learn",
env: @["TR_RACK_PATTERN=off", "TR_RACK_BITBRAIN=melee",
"TR_BITBRAIN_MEM=decay", "TR_BITBRAIN_GAINS=1.0,1.25,1.5,2.0",
"TR_BITBRAIN_LOG=1"],
note: "BitBrain-only melee rack, decay memory + learned gains (user config)"),
]
const
ModularBotJson = """{
"name": "ModularBot",
"version": "0.1.0",
"authors": ["Davide Cappellini"],
"description": "frozen melee A/B build of ModularBot",
"homepage": "",
"countryCodes": ["IT"],
"gameTypes": ["classic", "1v1"],
"platform": "Nim",
"programmingLang": "Nim"
}
"""
# ANSI SGR sequences (the bot's config line color-highlights changed fields).
const AnsiRe = "\x1b\\[[0-9;]*m"
proc stripAnsi(s: string): string =
result = newStringOfCap(s.len)
var i = 0
while i < s.len:
if s[i] == '\x1b' and i + 1 < s.len and s[i+1] == '[':
i += 2
while i < s.len and s[i] notin {'m'}: inc i
if i < s.len: inc i # skip the terminating 'm'
else:
result.add s[i]
inc i
proc repoRoot(): string =
currentSourcePath().parentDir.parentDir.parentDir
proc quote(s: string): string = quoteShell(s)
proc params(): seq[string] =
for i in 1 .. paramCount(): result.add paramStr(i)
proc findParam(args: seq[string], name: string, default = ""): string =
for i in 0 ..< args.len:
if args[i] == name and i + 1 < args.len: return args[i+1]
default
proc hasFlag(args: seq[string], name: string): bool =
for a in args:
if a == name: return true
false
# ── frozen ModularBot build (from `git archive HEAD`, like tools/ab/ab_run.sh) ─
proc binarySha(bin: string): string =
let (outp, rc) = execCmdEx("sha256sum " & quote(bin))
if rc == 0: outp.strip().split(' ')[0] else: "unknown"
proc headCommit(repo: string): string =
let (outp, rc) = execCmdEx("git -C " & quote(repo) & " rev-parse HEAD")
if rc == 0: outp.strip() else: "unknown"
proc buildFrozen(repo, outdir: string): string =
## Compile ONE frozen ModularBot from the committed HEAD snapshot and return
## its path. A dirty tree cannot leak into the measurement.
let bin = outdir / "frozen" / "ModularBot_bin"
if fileExists(bin): return bin
createDir(outdir / "frozen")
let snapshot = outdir / "frozen" / "head"
createDir(snapshot)
let (arcOut, arcRc) = execCmdEx(
"git -C " & quote(repo) & " archive HEAD | tar -x -C " & quote(snapshot))
if arcRc != 0:
raise newException(IOError, "git archive HEAD failed:\n" & arcOut)
let garage = snapshot / "ModularBot_garage"
if not dirExists(garage):
raise newException(IOError, "no ModularBot_garage in HEAD snapshot")
let nimcache = outdir / "nimcache"
let cmd = "nim c -d:release --nimcache:" & quote(nimcache) &
" --out:" & quote(bin) & " src/ModularBot.nim"
let (outp, rc) = execCmdEx(cmd, workingDir = garage)
if rc != 0 or not fileExists(bin):
raise newException(OSError, "frozen ModularBot build failed:\n" & outp)
result = bin
# ── per-run wrapper bot dir ──────────────────────────────────────────────────
proc writeWrapper(botDir: string, env: seq[string], bin, stdoutLog, stderrLog: string) =
createDir(botDir)
writeFile(botDir / "ModularBot.json", ModularBotJson)
var sh = "#!/bin/sh\ncd \"$(dirname \"$0\")\"\n"
for kv in env:
let p = kv.split('=', 1)
sh.add("export " & p[0] & "=\"" & p[1] & "\"\n")
sh.add("exec ./ModularBot_bin > " & quote(stdoutLog) &
" 2> " & quote(stderrLog) & "\n")
writeFile(botDir / "ModularBot.sh", sh)
discard execCmdEx("chmod +x " & quote(botDir / "ModularBot.sh"))
if fileExists(botDir / "ModularBot_bin"): removeFile(botDir / "ModularBot_bin")
createSymlink(bin, botDir / "ModularBot_bin")
# ── liveness / target-switching extraction from the bot's stdout ─────────────
type Live = object
envRackPattern: string
envRackBitbrain: string
envBitbrainMem: string
envBitbrainGains: string
envMovement: string
rackActiveMelee: string
rackActive1v1: string
rackMeleeLines: int
configLines: int
distinctTargets: int
targetChanges: int
bbResetTargetChange: int
bbLines: int
resultEndWon: string
proc envLine(text, key: string): string =
## Value of an `[env] KEY = VALUE` (or `[env] KEY=VALUE`) boot-report line,
## with the `(source: ...)` annotation stripped. Empty when absent.
let prefix = "[env] " & key
for line in text.splitLines():
let s = line.strip()
if not s.startsWith(prefix): continue
var rest = s[prefix.len .. ^1].strip()
if rest.len == 0 or rest[0] != '=': continue
rest = rest[1 .. ^1].strip()
let si = rest.find("(source:")
if si >= 0: rest = rest[0 ..< si].strip()
return rest
proc parseLive(text: string): Live =
var lastTarget = -1
var seen: seq[int]
for raw in text.splitLines():
let s = stripAnsi(raw).strip()
if s.startsWith("[config] "):
inc result.configLines
let i = s.find("target=#")
if i >= 0:
var j = i + "target=#".len
var neg = false
if j < s.len and s[j] == '-': neg = true; inc j
var num = 0
var any = false
while j < s.len and s[j] in {'0'..'9'}:
num = num * 10 + (ord(s[j]) - ord('0')); inc j; any = true
if any and not neg:
if lastTarget >= 0 and num != lastTarget: inc result.targetChanges
lastTarget = num
if num notin seen: seen.add num
elif s.startsWith("[rack] "):
if " mode=melee " in s or s.endsWith(" mode=melee"):
inc result.rackMeleeLines
elif s.startsWith("[bb-reset] ") and "reason=target_change" in s:
inc result.bbResetTargetChange
elif s.startsWith("[bb] "):
inc result.bbLines
elif s.startsWith("[result] battle END:"):
let i = s.find("rounds won ")
if i >= 0: result.resultEndWon = s[i + "rounds won ".len .. ^1].strip()
result.distinctTargets = seen.len
result.envRackPattern = envLine(text, "TR_RACK_PATTERN")
result.envRackBitbrain = envLine(text, "TR_RACK_BITBRAIN")
result.envBitbrainMem = envLine(text, "TR_BITBRAIN_MEM")
result.envBitbrainGains = envLine(text, "TR_BITBRAIN_GAINS")
result.envMovement = envLine(text, "TR_MOVEMENT")
result.rackActiveMelee = envLine(text, "rack active melee")
result.rackActive1v1 = envLine(text, "rack active 1v1")
# ── one run ──────────────────────────────────────────────────────────────────
proc runOne(repo, outdir, bin, armName: string, env: seq[string],
run, rounds, timeout: int, commit, binsha: string): bool =
let armDir = outdir / armName
createDir(armDir)
let work = outdir / "work" / armName / ("run" & $run)
let botDir = work / "ModularBot"
let outLog = armDir / ("run" & $run & ".bot.stdout.log")
let errLog = armDir / ("run" & $run & ".bot.stderr.log")
let runLog = armDir / ("run" & $run & ".runner.log")
let jsonPath = armDir / ("run" & $run & ".json")
if fileExists(outLog): removeFile(outLog)
if fileExists(errLog): removeFile(errLog)
writeWrapper(botDir, env, bin, outLog, errLog)
var advDirs: seq[string]
for a in AdversaryNames: advDirs.add repo / repoSuffix / a
var ok = true
var raw = ""
try:
raw = runBattleRunner(getServerUrl(), @[botDir] & advDirs, rounds, timeout, true)
except CatchableError as e:
ok = false
raw = "EXCEPTION: " & e.msg
writeFile(runLog, raw)
if not ok:
writeFile(jsonPath, $(%*{"arm": armName, "run": run, "rounds": rounds,
"commit": commit, "binary_sha256": binsha,
"ok": false, "error": raw}))
stderr.writeLine(fmt"[melee] {armName} run {run}: FAILED")
return false
let r = parseServerOutput(raw)
var perRound: seq[tuple[round, score, rank: int, survived: bool]]
var botRd: seq[JsonNode]
for rr in r.rounds:
for br in rr.results:
if br.name == "ModularBot":
perRound.add (rr.round, br.score, br.rank, br.survived)
var modJ = %*{"name": "ModularBot", "found": false}
for b in r.results:
if b.name == "ModularBot":
modJ = %*{"name": b.name, "totalScore": b.totalScore, "rank": b.rank,
"firstPlaces": b.firstPlaces, "survivalCount": b.survivalCount,
"found": true}
var field = newJArray()
for b in r.results:
if b.name == "ModularBot": continue
field.add %*{"name": b.name, "totalScore": b.totalScore, "rank": b.rank,
"firstPlaces": b.firstPlaces, "survivalCount": b.survivalCount}
for pr in perRound:
botRd.add %*{"round": pr.round, "score": pr.score, "rank": pr.rank,
"survived": pr.survived}
var live = Live()
if fileExists(outLog):
live = parseLive(readFile(outLog))
let row = %*{
"arm": armName, "run": run, "rounds": rounds,
"commit": commit, "binary_sha256": binsha,
"ok": true,
"modularbot": modJ,
"field": field,
"perRound": botRd,
"live": %*{
"env_TR_RACK_PATTERN": live.envRackPattern,
"env_TR_RACK_BITBRAIN": live.envRackBitbrain,
"env_TR_BITBRAIN_MEM": live.envBitbrainMem,
"env_TR_BITBRAIN_GAINS": live.envBitbrainGains,
"env_TR_MOVEMENT": live.envMovement,
"rack_active_melee": live.rackActiveMelee,
"rack_active_1v1": live.rackActive1v1,
"rack_melee_lines": live.rackMeleeLines,
"config_lines": live.configLines,
"distinct_targets": live.distinctTargets,
"target_changes": live.targetChanges,
"bb_reset_target_change": live.bbResetTargetChange,
"bb_lines": live.bbLines,
"result_end_won": live.resultEndWon
}
}
writeFile(jsonPath, $(row))
let mb = r.results.filterIt(it.name == "ModularBot")
let wins = if mb.len > 0: mb[0].firstPlaces else: 0
let rk = if mb.len > 0: mb[0].rank else: 0
let sc = if mb.len > 0: mb[0].totalScore else: 0
echo fmt"[melee] {armName} run {run}: wins={wins}/{rounds} rank={rk} score={sc} " &
fmt"targets={live.distinctTargets} changes={live.targetChanges} " &
fmt"rackMelee={live.rackActiveMelee} bbreset={live.bbResetTargetChange}"
result = true
# ── main ─────────────────────────────────────────────────────────────────────
proc main() =
let repo = repoRoot()
let args = params()
if hasFlag(args, "--list-arms") or hasFlag(args, "--help") or args.len == 0:
echo "arms:"
for a in Arms:
echo a.name & "\t" & a.env.join(" ") & "\t" & a.note
return
let outdir = findParam(args, "--outdir", "/tmp/melee_bitbrain_ab")
createDir(outdir)
let commit = headCommit(repo)
let bin = buildFrozen(repo, outdir)
let binsha = binarySha(bin)
echo "[melee] commit=", commit, " binary_sha256=", binsha
if hasFlag(args, "--build-only"): return
let armName = findParam(args, "--arm")
if armName.len == 0:
stderr.writeLine("--arm is required (or --list-arms / --build-only)")
quit(1)
var arm: Arm
var found = false
for a in Arms:
if a.name == armName: arm = a; found = true
if not found:
stderr.writeLine("unknown arm: " & armName)
quit(1)
let runStart = parseInt(findParam(args, "--run-start", "1"))
let runCount = parseInt(findParam(args, "--run-count", "15"))
let rounds = parseInt(findParam(args, "--rounds", "7"))
let timeout = parseInt(findParam(args, "--timeout", "900000"))
let retries = parseInt(findParam(args, "--retries", "2"))
# `--runs 1,3,5` overrides the contiguous range (used to fill failed runs).
var runList: seq[int]
let runsSpec = findParam(args, "--runs", "")
if runsSpec.len > 0:
for t in runsSpec.split(','):
let s = t.strip()
if s.len > 0: runList.add parseInt(s)
else:
for run in runStart ..< runStart + runCount: runList.add run
ensureServer()
echo "[melee] server=", getServerUrl(), " arm=", armName,
" runs=", runList.len, " rounds=", rounds, " retries=", retries
var ok = 0
for run in runList:
var done = false
for attempt in 1 .. retries + 1:
if runOne(repo, outdir, bin, armName, arm.env, run, rounds, timeout, commit, binsha):
done = true
break
if attempt <= retries:
stderr.writeLine(fmt"[melee] {armName} run {run}: retry {attempt}/{retries} in 8s")
sleep(8000)
if done: inc ok
echo fmt"[melee] {armName}: {ok}/{runList.len} runs ok"
when isMainModule:
main()
+64
View File
@@ -0,0 +1,64 @@
#!/usr/bin/env bash
# run_melee_bitbrain_ab.sh — drive the melee A/B (see measure_melee_bitbrain_ab.nim).
#
# Builds ONE frozen ModularBot (from `git archive HEAD`), then runs one process
# per arm in parallel; each process owns its own Tank Royale server on an
# ephemeral port. Output: <outdir>/<arm>/run<N>.json (+ .bot.stdout.log).
#
# common_libs/tests/run_melee_bitbrain_ab.sh [outdir]
#
# Env: MELEE_RUNS (default 16), MELEE_ROUNDS (default 7), MELEE_ARMS (space list).
# Kills its own process groups on EXIT/INT/TERM (setsid per arm).
set -euo pipefail
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO="$(cd "$HERE/../.." && pwd)"
OUTDIR="${1:-/tmp/melee_bitbrain_ab}"
RUNS="${MELEE_RUNS:-16}"
ROUNDS="${MELEE_ROUNDS:-7}"
ARMS_STR="${MELEE_ARMS:-pattern bb_round bb_ret bb_learn}"
BIN="$HERE/measure_melee_bitbrain_ab"
[[ -x "$BIN" ]] || { echo "ERROR: build the runner first: nim c --path:common_libs $HERE/measure_melee_bitbrain_ab.nim" >&2; exit 1; }
mkdir -p "$OUTDIR"
echo "[driver] building frozen ModularBot…"
"$BIN" --outdir "$OUTDIR" --build-only
read -r -a ARMS <<< "$ARMS_STR"
PIDS=()
cleanup() {
local rc=$?
trap - EXIT INT TERM
for p in "${PIDS[@]:-}"; do
[[ -n "$p" ]] || continue
kill -TERM -- "-$p" 2>/dev/null || true
done
sleep 1
for p in "${PIDS[@]:-}"; do
[[ -n "$p" ]] || continue
kill -KILL -- "-$p" 2>/dev/null || true
done
# backstop: anything from this run's process group that outlived the runner
pkill -f "[m]easure_melee_bitbrain_ab.*$OUTDIR" 2>/dev/null || true
exit "$rc"
}
trap cleanup EXIT INT TERM
for arm in "${ARMS[@]}"; do
echo "[driver] launching arm $arm (runs=$RUNS rounds=$ROUNDS)"
setsid "$BIN" --outdir "$OUTDIR" --arm "$arm" \
--run-start 1 --run-count "$RUNS" --rounds "$ROUNDS" \
> "$OUTDIR/$arm.driver.log" 2>&1 &
PIDS+=("$!")
sleep 3 # stagger so concurrent servers do not race for the same free port
done
echo "[driver] all arms launched; waiting…"
FAIL=0
for p in "${PIDS[@]}"; do
wait "$p" || FAIL=$((FAIL + 1))
done
PIDS=()
echo "[driver] done (failed arm processes: $FAIL)"
exit "$FAIL"