tardellirs commited on
Commit
0cbddb7
·
verified ·
1 Parent(s): 84ddb77

add reproducible eval script

Browse files
Files changed (1) hide show
  1. run_random_baseline.py +69 -0
run_random_baseline.py ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python
2
+ """MTEB(por, v2) random baseline encoder — the FLOOR reference.
3
+
4
+ Design: each text -> a deterministic L2-normalized random vector, seeded by
5
+ sha256(SEED|text). Deterministic-per-text => reproducible + zero semantic signal
6
+ (textually-different but semantically-similar sentences get unrelated vectors).
7
+ Gives chance-level performance across STS / retrieval / classification / clustering.
8
+ No GPU. Runs locally with the same pinned-SHA mteb_pt tasks as the real models.
9
+ """
10
+ import os
11
+ import hashlib
12
+ import numpy as np
13
+ import mteb
14
+ import mteb_pt # noqa: F401 (registers task modules)
15
+ import mteb_pt.register as register
16
+ from mteb.models.abs_encoder import AbsEncoder
17
+ from mteb.models.model_meta import ModelMeta
18
+
19
+ DIM = 768
20
+ SEED = 42
21
+ _EXCLUDED = {"OffComBR", "CSTNewsClustering", "BBCNewsPTClustering", "TweetSentBR"}
22
+
23
+
24
+ class RandomEncoder(AbsEncoder):
25
+ def __init__(self):
26
+ self.mteb_model_meta = ModelMeta(
27
+ loader=None,
28
+ name="mteb-pt/baseline-random-encoder",
29
+ revision="1.0",
30
+ release_date="2026-06-28",
31
+ languages=["por-Latn"],
32
+ n_parameters=0,
33
+ memory_usage_mb=None,
34
+ max_tokens=None,
35
+ embed_dim=DIM,
36
+ license=None,
37
+ open_weights=True,
38
+ public_training_code=None,
39
+ public_training_data=None,
40
+ framework=[],
41
+ similarity_fn_name="cosine",
42
+ use_instructions=False,
43
+ training_datasets=None,
44
+ )
45
+
46
+ def encode(self, inputs, *, task_metadata, hf_split, hf_subset, prompt_type=None, **kwargs):
47
+ texts = [t for batch in inputs for t in batch["text"]]
48
+ out = np.empty((len(texts), DIM), dtype=np.float32)
49
+ for i, t in enumerate(texts):
50
+ h = int(hashlib.sha256((str(SEED) + "|" + (t or "")).encode("utf-8")).hexdigest(), 16) % (2**32)
51
+ v = np.random.default_rng(h).standard_normal(DIM).astype(np.float32)
52
+ out[i] = v / (np.linalg.norm(v) + 1e-9)
53
+ return out
54
+
55
+
56
+ def load_tasks(only=None):
57
+ tasks = [cls() for cls in register._TASKS_TO_REGISTER if cls.metadata.name not in _EXCLUDED]
58
+ tasks.append(mteb.get_task("Assin2STS"))
59
+ if only:
60
+ keep = {x.strip() for x in only.split(",")}
61
+ tasks = [t for t in tasks if t.metadata.name in keep]
62
+ return tasks
63
+
64
+
65
+ if __name__ == "__main__":
66
+ tasks = load_tasks(os.environ.get("RB_TASKS"))
67
+ print(f"[random-baseline] {len(tasks)} tasks: {sorted(t.metadata.name for t in tasks)}", flush=True)
68
+ mteb.evaluate(RandomEncoder(), tasks=tasks, overwrite_strategy="always", raise_error=False, show_progress_bar=False)
69
+ print("[random-baseline] DONE", flush=True)