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:
@@ -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()
|
||||||
Executable
+64
@@ -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"
|
||||||
@@ -0,0 +1,262 @@
|
|||||||
|
# Is BitBrain actually better than Pattern in melee?
|
||||||
|
|
||||||
|
**This is the repository's FIRST melee measurement.** Every A/B before this one
|
||||||
|
was 1v1 vs DrussGT. This doc answers one question with a real number:
|
||||||
|
|
||||||
|
> *"btw bitbrain gun is crushing in melee, the fast adaptation is a killer
|
||||||
|
> feature there"* — the owner.
|
||||||
|
|
||||||
|
## TL;DR (direct answer)
|
||||||
|
|
||||||
|
**Not detectable at this sample size.** On the metric that matters most in a
|
||||||
|
melee (the server's round score = damage + survival bonus), the three BitBrain
|
||||||
|
arms land within ±62 points of the shipped Pattern rack, and every difference is
|
||||||
|
well inside the noise: permutation **p = 0.16 – 0.71**, all **< the MDE of ±151
|
||||||
|
score points (~5.1 %)**. Placement is saturated: every arm finishes **rank 1**
|
||||||
|
(ModularBot's TFIL movement beats this field regardless of gun). Round wins
|
||||||
|
*hint* in BitBrain's favour — **112/112** (retained, learned) and **111/112**
|
||||||
|
(perRound) vs Pattern's **109/112** — but that +0.19 rounds/run is not
|
||||||
|
significant (**perm p = 0.225, Mann-Whitney p = 0.080**) and is half the
|
||||||
|
**MDE of 0.40 rounds/run**. So:
|
||||||
|
|
||||||
|
| claim | verdict |
|
||||||
|
|---|---|
|
||||||
|
| BitBrain beats Pattern on **round wins** in melee | **hint only, not significant** (p=0.225; MDE=0.40 wins/run) |
|
||||||
|
| BitBrain beats Pattern on **survival** in melee | **not detectable** (p=0.23–1.00) |
|
||||||
|
| BitBrain beats Pattern on **placement** in melee | **no — every arm sweeps** (rank 1 everywhere) |
|
||||||
|
| BitBrain beats Pattern on **score/damage** in melee | **no — not detectable** (p=0.16–0.71; all diffs << MDE) |
|
||||||
|
|
||||||
|
**MEASURED** (this doc): the numbers above. **INFERRED** (not measured): the
|
||||||
|
mechanism (Pattern loses history across a target switch; BitBrain resets and
|
||||||
|
re-adapts). The mechanism is real and was exercised — see the target-switching
|
||||||
|
liveness — but at this sample it buys no detectable score.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Why melee is a different question
|
||||||
|
|
||||||
|
Pattern's strength comes from accumulating history with **one** enemy. Melee
|
||||||
|
rotates targets, so per-enemy histories fragment; a gun that **resets per target
|
||||||
|
and re-adapts fast** should gain exactly where Pattern loses. BitBrain is built
|
||||||
|
for that: `TR_BITBRAIN_RESET_ON_TARGET` defaults to **on**, and its memory modes
|
||||||
|
(`perRound` / `retained` / `decay`) exist for changing targets. That is a
|
||||||
|
plausible mechanism — but a plausible mechanism is not a measurement, and
|
||||||
|
**melee is higher-variance than 1v1** (where a 6-4 result already had P=0.353),
|
||||||
|
so an impression is worth even less here. This is the first real number.
|
||||||
|
|
||||||
|
## Melee scoring caveat
|
||||||
|
|
||||||
|
Melee is scored differently from 1v1 and the framework does **not** expose raw
|
||||||
|
damage. All numbers below come from the framework's own fields
|
||||||
|
(`BattleResult` / `BotResult` / `BotRoundResult`):
|
||||||
|
|
||||||
|
* **`firstPlaces`** — rounds won (rank 1 in a round). The run's primary outcome.
|
||||||
|
* **`survivalCount`** — total ticks survived across the run's 7 rounds.
|
||||||
|
* **`rank` / round `rank`** — final placement and per-round placement (1 = best).
|
||||||
|
* **`totalScore`** — the **server's round score**, which is **damage dealt plus
|
||||||
|
the survival bonus**, *not raw damage*. It is the closest available proxy for
|
||||||
|
damage; treat it as "score", not "damage". `score share` = ModularBot's score
|
||||||
|
÷ (all four bots' scores).
|
||||||
|
|
||||||
|
## Method
|
||||||
|
|
||||||
|
*Field (fixed across arms):* 4-bot Free-For-All — **ModularBot + WaveSurfer +
|
||||||
|
PatternMover + RandomMover**. Mixed by design: WaveSurfer is the strong reactive
|
||||||
|
mover (linear gun), PatternMover the deterministic pattern (Pattern's home turf),
|
||||||
|
RandomMover the erratic one. All three shoot.
|
||||||
|
|
||||||
|
*Arms (only ModularBot's gun rack differs):*
|
||||||
|
|
||||||
|
| arm | env |
|
||||||
|
|---|---|
|
||||||
|
| `pattern` | *(no env — shipped default: Pattern-only rack)* |
|
||||||
|
| `bb_round` | `TR_RACK_PATTERN=off TR_RACK_BITBRAIN=melee TR_BITBRAIN_MEM=perRound TR_BITBRAIN_LOG=1` |
|
||||||
|
| `bb_ret` | `TR_RACK_PATTERN=off TR_RACK_BITBRAIN=melee TR_BITBRAIN_MEM=retained TR_BITBRAIN_LOG=1` |
|
||||||
|
| `bb_learn` | `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` |
|
||||||
|
|
||||||
|
*Protocol:* **16 independent runs × 7 rounds per arm = 112 rounds/arm.** Each
|
||||||
|
run is its own battle with fresh random initial positions (server
|
||||||
|
`--enable-initial-position`); runs are not paired. A dirty tree cannot leak in:
|
||||||
|
the frozen ModularBot is built with `git archive HEAD`.
|
||||||
|
|
||||||
|
```
|
||||||
|
commit = 0f5cfe37b24952ae07fee0a7db526317ae127e6c
|
||||||
|
binary sha256 = 11bba2735413bc35ab3b61ead711c51d2223183ad9da510799bc7d76b99b22ca
|
||||||
|
movement = tfil (shipped default) in every run — the A/B isolates the gun rack
|
||||||
|
n = 16 runs/arm, 7 rounds/run
|
||||||
|
```
|
||||||
|
|
||||||
|
`TR_RACK_BITBRAIN=melee` was verified as *melee-rack-only* (not `both`): the
|
||||||
|
boot line reads `[env] rack active 1v1 = FULL` and
|
||||||
|
`[env] rack active melee = BITBRAIN`, i.e. BitBrain is admitted **only** in the
|
||||||
|
melee rack. The `pattern` arm reads `[env] rack active melee = PATTERN`.
|
||||||
|
|
||||||
|
## Results
|
||||||
|
|
||||||
|
### Arm summary
|
||||||
|
|
||||||
|
```
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
`score` / `surv` are per-run means; `wins/rd` is pooled round wins.
|
||||||
|
|
||||||
|
### 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 … (all 1050)
|
||||||
|
mrank: all 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: r5=1000, all others 1050
|
||||||
|
mrank: all 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: r10=900, r9=950, all others 1050
|
||||||
|
mrank: r10=1.14, all others 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: r3=1000, r7=900, r14=950, all others 1050
|
||||||
|
mrank: all 1.00
|
||||||
|
```
|
||||||
|
|
||||||
|
The only structural difference is that Pattern lost three rounds (r3, r5, r7) and
|
||||||
|
`bb_round` one (r10); every other round is a ModularBot sweep. `surv` < 1050
|
||||||
|
marks the runs where ModularBot died at least once. The raw per-run JSON for all
|
||||||
|
64 runs is committed at
|
||||||
|
`common_libs/tests/fixtures/melee_bitbrain_ab/<arm>/run<N>.json`.
|
||||||
|
|
||||||
|
### Statistics (per-run, two-sided)
|
||||||
|
|
||||||
|
Permutation test (Monte-Carlo, 1,000,000 draws, seed `0x5eed5eed`, `p=(cnt+1)/(B+1)`)
|
||||||
|
and Mann-Whitney U cross-check, reused verbatim from `tools/ab/ab_analyze.py`.
|
||||||
|
`diff(A-B)` is `pattern − bitbrain`.
|
||||||
|
|
||||||
|
```
|
||||||
|
metric A B diff(A-B) perm p MW p
|
||||||
|
score pattern bb_learn +19.75 0.7117 0.6109
|
||||||
|
score pattern bb_ret +61.63 0.1594 0.5590
|
||||||
|
score pattern bb_round -32.88 0.4900 0.3365
|
||||||
|
survival pattern bb_learn -18.75 0.2254 0.0800
|
||||||
|
survival pattern bb_ret -15.63 0.3507 0.2791
|
||||||
|
survival pattern bb_round -3.13 1.0000 0.6982
|
||||||
|
wins pattern bb_learn -0.188 0.2251 0.0795
|
||||||
|
wins pattern bb_ret -0.188 0.2251 0.0795
|
||||||
|
wins pattern bb_round -0.125 0.5984 0.3080
|
||||||
|
mean_rank pattern bb_* ±0.000 1.0000 0.35–1.00
|
||||||
|
rank pattern bb_* ±0.000 1.0000 1.0000
|
||||||
|
score_share pattern bb_learn -0.007 0.5082 0.6109
|
||||||
|
score_share pattern bb_ret +0.001 0.9046 0.8653
|
||||||
|
score_share pattern bb_round -0.013 0.2908 0.2662
|
||||||
|
```
|
||||||
|
|
||||||
|
### Minimum detectable effect (α=0.05 two-sided, 80 % power)
|
||||||
|
|
||||||
|
`MDE = 2.8016 · sd(pattern) · sqrt(2/n)`, n=16/arm.
|
||||||
|
|
||||||
|
```
|
||||||
|
metric sd(ref) MDE ref mean MDE as % of mean
|
||||||
|
score 152.85 151.40 2965.0 5.1 %
|
||||||
|
survival 44.25 43.83 1031.3 4.3 %
|
||||||
|
wins 0.40 0.40 6.81 5.9 %
|
||||||
|
mean_rank 0.00 0.00 1.000 —
|
||||||
|
```
|
||||||
|
|
||||||
|
Every observed effect is **below its MDE**, so this is a *powered null*, not an
|
||||||
|
under-powered one — at least for effects ≥ ~5 % of the score.
|
||||||
|
|
||||||
|
## Liveness — the melee premise WAS exercised
|
||||||
|
|
||||||
|
Target switching is the whole mechanism, so it had to be proven, not assumed.
|
||||||
|
|
||||||
|
* **Arm applied:** the per-run boot report shows the rack actually flipped —
|
||||||
|
`pattern`: `[env] rack active melee = PATTERN`; `bb_*`:
|
||||||
|
`[env] rack active melee = BITBRAIN` with `TR_RACK_PATTERN=off`,
|
||||||
|
`TR_RACK_BITBRAIN=melee`. All 64 runs passed the liveness check (16/16 per arm).
|
||||||
|
* **Movement held fixed:** `[env] TR_MOVEMENT = tfil (source: default)` in every
|
||||||
|
run, so the difference is the gun rack alone.
|
||||||
|
* **Every run faced all three enemies and switched targets repeatedly.** From
|
||||||
|
the bot's own `[config] … target=#N` lines: **3.00 distinct targets/run** and
|
||||||
|
**66–69 target changes/run** (about 10 per round). Example transitions from one
|
||||||
|
run: `#1 → #4 → #2 → #4 → #1 → #2 → …`.
|
||||||
|
* **BitBrain really reset on every switch.** `[bb-reset] reason=target_change`
|
||||||
|
fires once per target change: **66.75** (perRound), **68.19** (retained),
|
||||||
|
**66.75** (decay) per run — equal, within rounding, to the target-change count.
|
||||||
|
Example `[bb]` line from a live run:
|
||||||
|
`[bb] t=440 band=450.+ gain=0.25 shift=-3.39deg rate=0.818 n=11. ncand=5 trained=11 pend=29 dropped=95 mode=perRound`.
|
||||||
|
The `pattern` arm logs **zero** `[bb]`/`[bb-reset]` lines (BitBrain never
|
||||||
|
spawned), confirming the arms are cleanly separated.
|
||||||
|
|
||||||
|
**So the premise held** (targets rotated, the gun reset), but the fast adaptation
|
||||||
|
bought no measurable edge over Pattern's per-round wipe in this field.
|
||||||
|
|
||||||
|
## Direct answer
|
||||||
|
|
||||||
|
At **16 runs/arm (112 rounds/arm)**, in a 4-bot melee against
|
||||||
|
WaveSurfer + PatternMover + RandomMover:
|
||||||
|
|
||||||
|
* **Round wins:** BitBrain is *slightly* ahead (112/112 and 111/112 vs 109/112),
|
||||||
|
but the difference is **not significant** (perm p=0.225; MW p=0.080) and is
|
||||||
|
below the 0.40-wins/run MDE. Do **not** claim a win-rate gain from this.
|
||||||
|
* **Survival:** **not detectable** (p=0.23–1.00).
|
||||||
|
* **Placement:** **no difference** — ModularBot is rank 1 in every arm.
|
||||||
|
* **Score/damage:** **not detectable** — differences of −63 to +33 points
|
||||||
|
(p=0.16–0.71) against an MDE of ±151 (≈5 %).
|
||||||
|
|
||||||
|
The mechanism is plausible and was demonstrably exercised, but the owner's claim
|
||||||
|
that BitBrain is "crushing in melee" is **not supported by this measurement**.
|
||||||
|
The honest reading is the opposite of spin in either direction: **the first
|
||||||
|
melee number is a null.**
|
||||||
|
|
||||||
|
### Why the null is weak evidence in one direction
|
||||||
|
|
||||||
|
The field is not discriminating enough to separate the guns on *outcome*:
|
||||||
|
ModularBot's TFIL movement wins 97–100 % of rounds no matter which gun is in the
|
||||||
|
rack, so wins/rank hit a ceiling. Only the score margin can move, and its MDE is
|
||||||
|
~5 %. A smaller true gun effect (<5 % score) would be invisible here; a larger
|
||||||
|
one would not.
|
||||||
|
|
||||||
|
## Reproduce
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# build the runner (once)
|
||||||
|
nim c --nimcache:/tmp/nc_j116 --path:common_libs \
|
||||||
|
common_libs/tests/measure_melee_bitbrain_ab.nim
|
||||||
|
|
||||||
|
# run the session (needs TR_SERVER_JAR + the TR runner jar; ~15–25 min under load)
|
||||||
|
MELEE_RUNS=16 MELEE_ROUNDS=7 \
|
||||||
|
common_libs/tests/run_melee_bitbrain_ab.sh /tmp/melee_bitbrain_ab
|
||||||
|
|
||||||
|
# analyze the committed fixtures (no Java needed)
|
||||||
|
python3 common_libs/tests/analyze_melee_ab.py \
|
||||||
|
common_libs/tests/fixtures/melee_bitbrain_ab
|
||||||
|
```
|
||||||
|
|
||||||
|
## Files
|
||||||
|
|
||||||
|
* `common_libs/tests/measure_melee_bitbrain_ab.nim` — the runner (4-bot melee,
|
||||||
|
per-arm env, per-run liveness/JSON, binary built from `git archive HEAD`).
|
||||||
|
* `common_libs/tests/run_melee_bitbrain_ab.sh` — parallel arm driver.
|
||||||
|
* `common_libs/tests/analyze_melee_ab.py` — per-run table + permutation + MW +
|
||||||
|
MDE (reuses `tools/ab/ab_analyze.py`'s stats functions).
|
||||||
|
* `common_libs/tests/fixtures/melee_bitbrain_ab/` — the 64 committed per-run
|
||||||
|
JSONs + `analysis.json` + `analysis_report.txt`.
|
||||||
|
|
||||||
|
## MEASURED vs INFERRED
|
||||||
|
|
||||||
|
**MEASURED:** commit `0f5cfe3`, binary `11bba27`; 4-bot melee, 4 arms × 16 runs
|
||||||
|
× 7 rounds; the wins/survival/rank/score means and per-run values; the
|
||||||
|
permutation p-values, Mann-Whitney p-values and MDEs; the rack boot lines, the
|
||||||
|
3 distinct targets/run, 66–69 target changes/run and the per-switch `[bb-reset]`.
|
||||||
|
All of the above are reproducible from the committed per-run JSON.
|
||||||
|
|
||||||
|
**INFERRED:** that Pattern's history fragmentation is *the* reason to expect a
|
||||||
|
melee gain; that `perRound`/`retained`/`decay` differ in adaptation speed in a
|
||||||
|
way this test could resolve; that a stronger field (or a >5 % effect) is where a
|
||||||
|
difference would show. None of these are claimed as measured.
|
||||||
Reference in New Issue
Block a user