-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathndcg-table.typ
More file actions
82 lines (71 loc) · 2.29 KB
/
ndcg-table.typ
File metadata and controls
82 lines (71 loc) · 2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#import "@preview/tabut:1.0.2": tabut, records-from-csv
#import "@preview/oxifmt:0.2.1": strfmt
#set page(margin: 1em, flipped: true)
#set align(center)
// map_range for color mapping
#let map_range(
value: float,
from_min: float,
from_max: float,
to_min: float,
to_max: float
) = {
(value - from_min) * (to_max - to_min) / (from_max - from_min) + to_min
}
// Load the CSV data
#let results = records-from-csv(csv("results.csv"))
#let test = results.filter(r => r.dataset == "fiqa")
#let transform_data(data) = {
let datasets = data.map(row => row.dataset).dedup().sorted()
let models = data.map(row => row.model).dedup().sorted()
let transformed = ()
for model in models {
let entry = (
"model": model
)
for dataset in datasets {
let matching_row = data.find(row => row.dataset == dataset and row.model == model)
entry.insert(dataset, matching_row.at("NDCG@10"))
}
transformed.push(entry)
}
return transformed
}
#let data = transform_data(results)
#let datasets = data.at(0).keys().slice(1,)
#let models = data.map(r => r.model)
// Find maximum values for each metric (including ties)
#let minmax_values = datasets.fold((:), (acc, dataset) => acc + (
(dataset): {
let model_results = results.filter(test => test.dataset == dataset).map(res => res.at("NDCG@10")).sorted();
(model_results.first(), model_results.last())
}
))
#let colDefs = (
(header: [*Models*], func: r => [#r.model]),
..datasets.map(dataset => (
header: /* rotate(90deg, reflow: true) */[#dataset],
func: r => {
let value = float(r.at(dataset))
let rounded_value = calc.round(value, digits: 3)
let min_value = minmax_values.at(dataset).first()
let max_value = minmax_values.at(dataset).last()
let color = int(map_range(value: rounded_value, from_min: min_value - 0.01, from_max: max_value + 0.01, to_min: 120, to_max: 0))
text(13pt)[#if rounded_value == calc.round(max_value, digits:3) {
[*#rounded_value*] // Bold the value
} else {
text(luma(color))[#rounded_value]
}]
}
))
)
#set text(11pt)
#tabut(
data,
colDefs,
inset: 0.7em,
columns: (auto,) + models.map(_ => auto),
align: center + horizon,
fill: (_, row) => if calc.odd(row) { luma(240) } else { luma(220) },
stroke: none
)