eduzrh commited on
Commit
71ed5bf
·
verified ·
1 Parent(s): a9e85fe

Upload experiments/run_baselines_comparison.py with huggingface_hub

Browse files
experiments/run_baselines_comparison.py ADDED
@@ -0,0 +1,187 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ EA Baselines + EvoRM Comparison Experiment
4
+ ===========================================
5
+ Runs all EA baselines standalone and with EvoRM, computes comparison metrics.
6
+
7
+ Baselines:
8
+ 1. AdaCoAgentEA (baseline) - LLM1_label_selector_baseline.py
9
+ 2. AdaCoAgentEA + EvoRM - LLM1_label_selector.py
10
+ 3. ZeroCoT - Zero-shot Chain-of-Thought
11
+ 4. ZeroCoT + EvoRM
12
+ 5. Self-Consistency - Multi-sample voting
13
+ 6. Self-Consistency + EvoRM
14
+ 7. ChatEA - Chat-based multi-turn
15
+ 8. ChatEA + EvoRM
16
+ 9. Collaboration-Hard - Multi-agent voting
17
+ 10. Collaboration-Hard + EvoRM
18
+
19
+ Metrics: Hits@1, MRR, Precision, Recall, F1, Tokens, Latency
20
+ """
21
+
22
+ import os, sys, json, time, shutil, argparse
23
+ from datetime import datetime
24
+
25
+ sys.path.insert(0, '/root/autodl-tmp/AdaCoAgentEA')
26
+ sys.path.insert(0, '/root/autodl-tmp/AdaCoAgentEA/baselines/evorm_wrappers')
27
+
28
+ DATA_BASE = "/root/autodl-tmp/AdaCoAgentEA/data"
29
+ RESULTS_DIR = "/root/autodl-tmp/AdaCoAgentEA/results"
30
+ os.makedirs(RESULTS_DIR, exist_ok=True)
31
+
32
+
33
+ def load_ref_pairs(path):
34
+ pairs = set()
35
+ if not os.path.exists(path):
36
+ return pairs
37
+ with open(path, 'r') as f:
38
+ for line in f:
39
+ parts = line.strip().split('\t')
40
+ if len(parts) == 2:
41
+ try:
42
+ pairs.add((int(parts[0]), int(parts[1])))
43
+ except ValueError:
44
+ pass
45
+ return pairs
46
+
47
+
48
+ def compute_metrics(aligned, ref_set):
49
+ aligned_set = set(aligned)
50
+ tp = len(aligned_set & ref_set)
51
+ fp = len(aligned_set - ref_set)
52
+ fn = len(ref_set - aligned_set)
53
+ precision = tp / max(1, tp + fp)
54
+ recall = tp / max(1, tp + fn)
55
+ f1 = 2 * precision * recall / max(0.001, precision + recall)
56
+ return {
57
+ 'Hits@1': round(recall, 4),
58
+ 'MRR': round(recall, 4),
59
+ 'Precision': round(precision, 4),
60
+ 'Recall': round(recall, 4),
61
+ 'F1': round(f1, 4),
62
+ 'TP': tp, 'FP': fp, 'FN': fn,
63
+ 'Total_Ref': len(ref_set),
64
+ 'Total_Aligned': len(aligned),
65
+ }
66
+
67
+
68
+ def clear_state(data_dir):
69
+ aligned_file = os.path.join(data_dir, "message_pool", "aligned_entities.txt")
70
+ if os.path.exists(aligned_file):
71
+ os.remove(aligned_file)
72
+
73
+
74
+ def run_baseline(baseline_name, data_dir, use_evorm=False, n_entities=None):
75
+ """Run a single baseline and return results."""
76
+ clear_state(data_dir)
77
+ import tokens_cal
78
+ tokens_cal.global_tokens = 0
79
+
80
+ t0 = time.time()
81
+
82
+ if baseline_name == 'adacoagent':
83
+ if use_evorm:
84
+ from Area2.LLM1_label_selector import align_entities
85
+ aligned = align_entities(data_dir, from_m3=False)
86
+ else:
87
+ sys.path.insert(0, '/root/autodl-tmp/AdaCoAgentEA/Area2')
88
+ from LLM1_label_selector_baseline import align_entities
89
+ aligned = align_entities(data_dir, from_m3=False)
90
+ elif baseline_name == 'zerocot':
91
+ from zero_cot import align_entities as zc
92
+ aligned = zc(data_dir, use_evorm=use_evorm)
93
+ elif baseline_name == 'self_consistency':
94
+ from self_consistency import align_entities as sc
95
+ aligned = sc(data_dir, use_evorm=use_evorm)
96
+ elif baseline_name == 'chatea':
97
+ from chat_ea import align_entities as ce
98
+ aligned = ce(data_dir, use_evorm=use_evorm)
99
+ elif baseline_name == 'cohard':
100
+ from cohard import align_entities as ch
101
+ aligned = ch(data_dir, use_evorm=use_evorm)
102
+ else:
103
+ raise ValueError(f"Unknown baseline: {baseline_name}")
104
+
105
+ elapsed = time.time() - t0
106
+ tokens = tokens_cal.global_tokens
107
+ ref_pairs = load_ref_pairs(os.path.join(data_dir, "ref_pairs"))
108
+ metrics = compute_metrics(aligned, ref_pairs)
109
+
110
+ return {
111
+ 'method': f"{baseline_name}{' + EvoRM' if use_evorm else ''}",
112
+ 'aligned_pairs': len(aligned),
113
+ 'time_seconds': round(elapsed, 1),
114
+ 'tokens': tokens,
115
+ 'tokens_per_pair': round(tokens / max(1, len(aligned)), 1),
116
+ 'metrics': metrics,
117
+ }
118
+
119
+
120
+ def main():
121
+ parser = argparse.ArgumentParser()
122
+ parser.add_argument('--dataset', default='icews_wiki')
123
+ parser.add_argument('--baselines', nargs='+', default=['adacoagent', 'zerocot', 'self_consistency', 'chatea', 'cohard'])
124
+ parser.add_argument('--n_entities', type=int, default=None)
125
+ args = parser.parse_args()
126
+
127
+ data_dir = os.path.join(DATA_BASE, args.dataset)
128
+ if not os.path.exists(data_dir):
129
+ print(f"ERROR: {data_dir} not found")
130
+ return
131
+
132
+ print(f"{'='*70}")
133
+ print(f"EA BASELINES COMPARISON: {args.dataset}")
134
+ print(f"{'='*70}")
135
+
136
+ results = []
137
+
138
+ for bl_name in args.baselines:
139
+ # Baseline (no EvoRM)
140
+ print(f"\n--- {bl_name} (baseline) ---")
141
+ try:
142
+ r = run_baseline(bl_name, data_dir, use_evorm=False)
143
+ results.append(r)
144
+ print(f" Aligned: {r['aligned_pairs']}, Hits@1: {r['metrics']['Hits@1']}, "
145
+ f"Tokens: {r['tokens']}, Time: {r['time_seconds']}s")
146
+ except Exception as e:
147
+ print(f" FAILED: {e}")
148
+ import traceback; traceback.print_exc()
149
+
150
+ # +EvoRM
151
+ print(f"--- {bl_name} + EvoRM ---")
152
+ try:
153
+ r = run_baseline(bl_name, data_dir, use_evorm=True)
154
+ results.append(r)
155
+ print(f" Aligned: {r['aligned_pairs']}, Hits@1: {r['metrics']['Hits@1']}, "
156
+ f"Tokens: {r['tokens']}, Time: {r['time_seconds']}s")
157
+ except Exception as e:
158
+ print(f" FAILED: {e}")
159
+ import traceback; traceback.print_exc()
160
+
161
+ # Save
162
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
163
+ result_file = os.path.join(RESULTS_DIR, f"baselines_comparison_{timestamp}.json")
164
+ with open(result_file, 'w') as f:
165
+ json.dump({
166
+ 'experiment': 'EA Baselines + EvoRM Comparison',
167
+ 'dataset': args.dataset,
168
+ 'date': datetime.now().isoformat(),
169
+ 'results': results,
170
+ }, f, indent=2, ensure_ascii=False)
171
+
172
+ # Summary table
173
+ print(f"\n{'='*70}")
174
+ print("SUMMARY")
175
+ print(f"{'='*70}")
176
+ print(f"{'Method':<35} {'Hits@1':>8} {'Precision':>10} {'F1':>8} {'Tokens':>10} {'Time':>8}")
177
+ print("-" * 80)
178
+ for r in results:
179
+ m = r['metrics']
180
+ print(f"{r['method']:<35} {m['Hits@1']:>8.4f} {m['Precision']:>10.4f} "
181
+ f"{m['F1']:>8.4f} {r['tokens']:>10} {r['time_seconds']:>7.1f}s")
182
+
183
+ print(f"\nResults: {result_file}")
184
+
185
+
186
+ if __name__ == '__main__':
187
+ main()