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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120 | class AuthorRanking(BaseModel):
"""Author ranking entry combining artifact contributions, citation impact, and AE committee service."""
rank: int = Field(
ge=1, description="Ranking position (with ties). Minimum combined_score of 3 to appear.", examples=[1]
)
author_id: int | None = Field(
default=None,
ge=1,
description="Stable integer ID referencing the canonical author_index. Null for authors not yet indexed.",
examples=[42],
)
name: str = Field(
description="Full author name including DBLP disambiguation suffix, e.g. 'Jing Liu 0074'.",
examples=["Mathias Payer"],
)
display_name: str = Field(
description="Human-readable name without DBLP disambiguation suffix, e.g. 'Jing Liu'.",
examples=["Mathias Payer"],
)
affiliation: str = Field(
description="Raw affiliation string as returned from DBLP, e.g. 'EPFL, Lausanne, Switzerland'.",
examples=["ETH Zurich"],
)
display_affiliation: str = Field(
description="Normalized institution name, e.g. 'EPFL', 'University of Illinois Urbana-Champaign'.",
examples=["ETH Zurich"],
)
artifact_count: int = Field(
ge=0, description="Total number of artifacts authored across all tracked conferences.", examples=[5]
)
artifact_score: int = Field(
ge=0,
description="Points from artifacts. Scoring: 1 pt (available) + 1 pt (functional) + 1 pt (reproduced) per artifact.",
examples=[9],
)
artifact_citations: int = Field(
ge=0,
description="Sum of artifact citation counts. Currently 0 for all authors (tracking in progress).",
examples=[3],
)
citation_score: int = Field(
ge=0,
description="Points from artifact citations. Currently 0 for all authors (tracking in progress).",
examples=[0],
)
total_papers: int = Field(
ge=0, description="Total papers published at tracked conferences, sourced from DBLP.", examples=[42]
)
artifact_pct: float = Field(
ge=0,
le=100,
description="Percentage of papers with artifacts: (artifact_count / total_papers) * 100.",
examples=[71.4],
)
repro_pct: int = Field(
ge=0,
le=100,
description="Percentage of artifacts with a 'reproduced' badge: (reproduced / artifact_count) * 100.",
examples=[66.7],
)
ae_memberships: int = Field(
ge=0,
description="Total number of AE committee memberships across all conferences and years.",
examples=[4],
)
chair_count: int = Field(ge=0, description="Number of times served as AE chair.", examples=[1])
ae_score: int = Field(ge=0, description="Points from AE service: (memberships × 3) + (chairs × 2).", examples=[6])
ae_ratio: float | None = Field(
default=None,
description="Artifact-to-AE score ratio (artifact_score / ae_score). Null if ae_score is 0.",
examples=[1.5],
)
combined_score: int = Field(
ge=3,
description="Total score: artifact_score + citation_score + ae_score. Only authors with ≥3 appear.",
examples=[15],
)
badges_available: int = Field(
ge=0,
description="Total number of 'available' badges across this author's artifacts.",
examples=[12],
)
badges_functional: int = Field(
ge=0,
description="Total number of 'functional' badges across this author's artifacts.",
examples=[10],
)
badges_reproducible: int = Field(
ge=0,
description="Total number of 'reproduced' badges across this author's artifacts.",
examples=[8],
)
conferences: list[str] = Field(
description="Distinct conference abbreviations where author contributed, e.g. ['ATC', 'OSDI', 'USENIXSEC'].",
examples=[["OSDI", "ATC", "USENIXSEC"]],
)
years: dict[str, int] = Field(
description="Year (as string) → activity count for that year, e.g. {'2023': 5, '2024': 7}.",
examples=[[2021, 2022, 2023]],
)
first_year: int | None = Field(
default=None, description="Earliest year of activity, e.g. 2020. Null if unknown.", examples=[2019]
)
last_year: int | None = Field(
default=None, description="Most recent year of activity, e.g. 2026. Null if unknown.", examples=[2025]
)
model_config = {"extra": "forbid"}
|