/* LEADBOARD 문자열 사전.
*
* 문자열은 전부 여기에만 둔다. 화면 코드에 한국어가 섞이면 영어판이 조용히 뒤처진다.
* 작은따옴표를 쓰지 않는다 - 영문 축약형(don't) 하나가 문자열을 끊어 사전 전체를
* 무너뜨린 전례가 있다. 축약형은 풀어 쓴다.
*/
window.T = {
ko: {
htmlLang: "ko",
title: "LEADBOARD — 신약 예측 도구 시험대",
navSpec: "규격",
login: "HF 로그인", logout: "로그아웃",
langBtn: "EN",
heroKicker: "AI 신약 개발 벤치마크",
heroTag: "신약 예측 도구를
분야별로, 동일한 기준으로 평가합니다",
heroLede: "본 시험대는 정답을 배포하지 않습니다. 대신 학습하지 않은 기준선과 " +
"해당 종목의 실험실 간 재현 오차를 사전에 공시하여, 보고된 성능이 " +
"측정 한계 대비 어디에 위치하는지 판정할 수 있게 합니다.",
statBoards: "개설 부문", statCompounds: "테스트 화합물", statFields: "분야",
statClauses: "규격 조항", statPlanned: "계획 부문",
secLeaders: "부문별 1위",
secLeadersLead: "각 부문의 현재 선두입니다. 참가 제출이 없는 부문은 비워 둡니다 — 기준선은 넘어야 할 선이지 우승자가 아닙니다.",
thBoard: "부문", thBest: "1위", thScore: "점수", thVs: "기준선 대비", thN: "테스트",
noLeader: "아직 없음",
leadersEmpty: n => `${n}개 부문 모두 참가 제출을 기다리고 있습니다.`,
leadersSome: (a, b) => `${b}개 부문 중 ${a}개에 선두가 있습니다.`,
secBrowse: "분야", secBrowseLead: "분야를 선택하면 소속 부문의 순위표와 제출 창구로 이동합니다.",
prizeH: "상금",
prizeLead: (amt,close)=>`마감일에 한 분에게 미화 ${amt}달러를 드립니다. 마감 ${close}.`,
prizeRule: (n)=>`1위 부문을 가장 많이 가진 한 분께 드립니다. 참가는 한 부문이면 되고, 몇 개를 내셨는지는 따지지 않습니다.
부문마다 지표가 달라 점수를 합산할 수 없으므로 1위 부문의 개수로 셉니다. 동수이면 먼저 도달한 분이 우선합니다.`,
statSubs: "제출",
prizeElig: "",
prizeMissing: (n)=>"",
prizeHost: "🔸 주최측 제출(SeaWolf-AI 등)은 상금 집계에서 제외됩니다. 표에는 넘어야 할 기준선으로 남지만, 상금 순위에서는 없는 것으로 봅니다 — 어느 부문의 상금 선두인지는 참가자 중 최상위로 정합니다. 주최측이 표시상 1위여도 그 부문의 상금 선두는 그 다음 참가자입니다.",
prizeNone: "아직 수상 후보가 없습니다. 부문 하나에서 1위를 하면 이름이 여기 올라갑니다.",
prizeStanding: "현재 후보",
prizeFirsts: (n)=>`1위 ${n}개 부문`,
starterTag: "입문",
starterLead: "처음이시면 입문 표시가 붙은 부문부터 보세요. 시험셋이 150~200개로 작고, 학습 데이터를 ChEMBL 조회 한 번으로 받을 수 있습니다.",
secEvidence: "측정 한계 지형",
secEvidenceLead: "가로축은 기준선 오차 ÷ 실험 재현 오차입니다. 1.0 에 근접할수록 " +
"모델을 개선해도 측정의 산포를 예측하는 일에 가까워집니다.",
secMethod: "채점 규격 8개 조항",
secMethodLead: "참가자에게 부과하는 요건이 아니라, 채점자가 스스로에게 부과하는 제약입니다.",
secData: "데이터와 라이선스",
terrLeft: "실험 오차 안쪽", terrRight: "모델 오차가 더 큼",
insideCount: n => `${n}개 부문이 1.3배 안쪽에 위치합니다.`,
lostNote: n => `${n}개 부문에서 학습 기준선이 상수 예측에 미달했습니다. ` +
"학습하지 않은 예측이 더 정확했다는 의미입니다. 기준선을 순위표에 상주시키지 " +
"않으면(3조) 이 사실은 어떤 지표에도 나타나지 않습니다.",
openN: n => `${n} 개설`, prep: "준비 중",
cardBoards: (o, p) => `부문 ${o}/${p}`,
cardCompounds: n => `${n} 화합물`,
clauses: [
["정답은 배포하지 않는다", "부문마다 분할 등급과 정답 등급을 공시한다"],
["점수마다 두 개의 지문", "데이터 판본과 채점 코드의 SHA-256 을 각인한다"],
["기준선은 순위표에서 내려가지 않는다", "상수 예측 · 최근접 이웃 · Morgan+LightGBM 영구 등재"],
["실험 오차를 사전 공시한다", "동일 화합물의 논문 간 측정 차이로 산출한다"],
["누출은 매 제출마다 검사한다", "정답과 소수 자리까지 일치하는 항목의 과밀도를 공시한다"],
["결과 제출과 모델 제출을 구분한다", "직접 재실행하여 확인한 제출에만 [검증됨]을 부여한다"],
["미산출은 0점이 아니다", "측정하지 못한 것과 측정하여 나쁜 것은 다르다"],
["반복 제출로 순위가 오르지 않는다", "Ladder · Blum & Hardt, ICML 2015"]
],
all: "전체",
tabRank: "순위", tabSubmit: "제출", tabInfo: "부문 정보",
thRank: "#", thMethod: "방법", thUser: "제출자", thLeak: "누출", thGrade: "등급",
baseline: "기준선", submitted: "제출됨", verified: "검증됨", reference: "참조 도구",
leakHigh: "조회 흔적", leakElev: "근접 과밀",
noiseNote: v => `실험 재현 오차 ${v}. 이 폭 안의 차이는 순위 차이로 주장하지 ` +
"않습니다 (4조). 기준선 3종은 순위표에서 내려가지 않습니다 (3조).",
noEntries: "참가 제출이 아직 없습니다. 표에 표시된 것은 기준선입니다.",
updated: t => `순위 갱신 ${t}`,
gradeH: "등급", holdoutH: "홀드아웃", noiseH: "실험 재현 오차", baseH: "기준선",
splitGrade: "분할 등급", answerGrade: "정답 등급",
gradeNote: {
T: "시간 분할 — 최초 보고 연도 기준. 기준일 이후 처음 등장한 화합물만 평가한다",
S: "스캐폴드 분할 — 골격이 훈련에 없는 화합물만 평가한다",
P1: "정답이 공개 데이터베이스에 존재한다. 조회 방어는 8조가 담당한다",
P2: "원자료는 공개지만 선별과 환산이 본 판본을 구성한다. 공개 DB 조회로는 동일 값이 나오지 않는다",
P3: "파트너로부터 제공받은 미공표 실측",
P4: "부문 개설 이후 생성된 측정. 개설 시점에 존재하지 않았다"
},
kSource: "출처", kCut: "분할 기준일", kTrainTest: "훈련 / 테스트",
kOverlap: "구조 겹침", kThr: "분류 임계", kSha: "데이터 지문", kLicense: "라이선스",
cutNote: "최초 보고 연도 기준", overlapNote: "0 (시간 분할 정의상)",
posRate: p => `양성 ${p}%`,
noisePairs: (p, c) => `비교쌍 ${p} · 화합물 ${c}`,
noiseDesc: "동일 화합물을 서로 다른 논문에서 측정한 값의 차이",
noiseSd: "단일 측정 표준편차 추정",
nearNote: (p, hi) => `분류 임계선에서 실험 오차 1 표준편차 안에 있는 테스트 화합물이 ` +
`${p}% 입니다. ` + (hi ? "재측정 시 라벨이 반전될 수 있어 회귀를 주지표로 둡니다."
: "분류 지표를 함께 사용합니다."),
beatsYes: "학습 기준선이 상수 예측을 상회했습니다.",
beatsNo: "학습 기준선이 상수 예측에 미달했습니다. 학습하지 않은 예측이 더 정확했습니다.",
noiseFloorRow: "실험 오차 바닥",
step1: "테스트셋 수령", step2: "예측 제출", step3: "컨테이너 제출 (선택)",
step1d: n => `화합물 ${n}개의 구조(SMILES)만 포함합니다. 라벨은 본 서버에 존재하지 않습니다.`,
licLine: "ChEMBL 파생 · CC BY-SA 3.0 — 재배포 시 출처와 동일 라이선스를 유지하십시오.",
dl: "테스트셋 내려받기",
fMethod: "방법 이름", fMethodH: "순위표에 표시될 명칭",
fTrain: "학습에 사용한 데이터", fTrainH: "5조 누출 검사에 사용합니다",
fPred: "예측값", fPredH: "JSON 또는 CSV (compound_id, prediction)",
fPredAx: n => `이 부문은 축이 ${n}개다 — 화합물마다 숫자 ${n}개짜리 배열을 JSON 으로 올린다`,
drop: "파일을 끌어다 놓거나 클릭하여 선택",
send: "제출", needLogin: "제출하려면 HF 계정 로그인이 필요합니다.",
step3d: "모델과 추론 환경을 함께 제출하면 직접 재실행하여 동일 결과를 확인하고 " +
"[검증됨]을 부여합니다 (6조).",
ladderNote: (v, c) => `8조. 반복 제출로는 순위가 오르지 않습니다. 직전 최고 점수를 ` +
`실험 오차 ${v} 이상 개선한 경우에만 새 점수가 공개됩니다. 일일 제출 한도 ${c}회.`,
accepted: id => `접수 완료 · 제출 번호 ${id}`,
parseFail: m => `예측값을 해석하지 못했습니다: ${m}`,
sending: n => `${n}개 항목 전송 중`,
emptyCat: "본 분야는 아직 개설된 부문이 없습니다.",
loadFail: "화면을 불러오지 못했습니다.",
dataNote: "모든 부문은 ChEMBL_37 에서 구축했으며 최초 보고 연도를 기준으로 시간 분할했습니다. " +
"배포되는 테스트셋은 구조만 포함하며 라벨은 포함하지 않습니다.",
srcLabel: "데이터 출처",
sib: "자매 시험대",
sibOdc: "AI가 찾아낸 신약 후보 물질을 계산 검증합니다",
sibOmc: "전고체 배터리 신소재를 찾는 시험대입니다",
secWhy: "왜 만들었는가",
why1: "AI가 신약 후보를 쏟아내는 만큼, 그 후보를 판정하는 예측 도구도 쏟아집니다. " +
"흡수 · 대사 · 독성 · 표적 결합마다 도구가 수십 개씩 있습니다. 그런데 그 도구들의 " +
"성능은 개발자가 자기 논문에서, 자기가 고른 데이터로 보고합니다. " +
"같은 문제로 잰 것이 아니므로 비교가 성립하지 않습니다.",
why2: "2026년 2월, 널리 쓰이는 ADMET 리더보드 22개 종목의 상위 모델을 전수 검증한 결과가 " +
"보고되었습니다. 검증 대상 66개 중 완전히 재현된 것은 3개였고, 테스트셋에 맞춘 모델은 " +
"22개 종목 중 10개에서 3위 안에 진입했습니다. 같은 설계를 정직하게 구성한 모델은 2개였습니다.",
why3: "문제는 특정 연구실이 아니라 시험 방식입니다. " +
"정답을 함께 배포하는 시험은, 아무리 성실히 치러도 예측력과 노출을 분리하지 못합니다.",
whyCite: "Koleiev 외, Critical Assessment of ML models for ADMET Prediction in TDC leaderboards, bioRxiv 2026",
secFound: "본 시험대가 실측한 것",
secFoundLead: "아래는 인용이 아니라 본 시험대가 19개 부문에서 직접 산출한 결과입니다.",
ratioLabel: "오차 ÷ 실험오차",
found1t: "분할 방식만으로 AUROC 가 0.21 이동한다",
found1d: "동일 데이터 · 동일 모델(Morgan+LightGBM 기본값) · 동일 테스트 비율에서 분할만 교체했습니다. " +
"hERG 기준 무작위 분할 0.818 → 시간 분할 0.606. " +
"분할 방식이 공시되지 않은 순위표의 수치는 비교가 불가능합니다.",
found2t: "19개 부문 중 7개에서 학습 기준선이 상수 예측에 미달했다",
found2d: "훈련 데이터의 중앙값을 그대로 내놓는 예측이 학습한 모델보다 정확했습니다. " +
"기준선을 순위표에 상주시키지 않으면 이 사실은 어떤 지표에도 나타나지 않습니다.",
found3t: "모델 오차가 실험 오차의 0.91 ~ 2.79 배 구간에 있다",
found3d: "동일 화합물을 서로 다른 논문에서 측정한 값의 차이로 각 부문의 실험 재현 오차를 " +
"산출했습니다. 7개 부문은 그 오차의 1.3배 안쪽에 있습니다.",
secHow: "참여 방법",
how1t: "테스트셋을 받습니다",
how1d: "부문을 선택하면 화합물 구조(SMILES)와 식별자만 담긴 파일을 내려받습니다. " +
"라벨은 포함되지 않으며, 본 서버에도 존재하지 않습니다.",
how2t: "원하는 도구로 예측합니다",
how2d: "자체 모델 · 상용 도구 · 공개 가중치 · 물리 기반 계산 무엇이든 무방합니다. 제한하지 않습니다. " +
"학습에 사용한 데이터만 기재해 주십시오 (5조 누출 검사에 사용합니다).",
how3t: "예측값을 제출하면 자동 채점됩니다",
how3d: "JSON 또는 CSV 로 올리면 채점 · 누출 검사 · 지문 각인이 자동 수행되고, " +
"기준선 3종 및 실험 오차와 함께 순위표에 표시됩니다.",
secMetric: "채점 기준",
mMae: "주지표. 예측값과 실측값의 평균 절대 오차입니다. 낮을수록 좋습니다.",
mAuroc: "분류 지표. 임계선 위아래를 가르는 능력입니다. 0.5 는 무작위와 같습니다.",
mPrauc: "양성이 드문 부문에서 AUROC 보다 실태를 잘 드러냅니다.",
mNoise: "동일 화합물의 논문 간 측정 차이로 산출한 재현 오차입니다. 이 폭 안의 차이는 순위로 인정하지 않습니다.",
mRatio: "최선 기준선 오차 ÷ 실험 오차. 1.0 에 근접하면 측정 한계에 도달한 것입니다.",
mLeak: "예측값이 실측값과 소수 자리까지 일치하는 항목의 밀도입니다. 의도를 판정하지 않고 사실만 표시합니다.",
secOwn: "제출물의 취급",
own1: "제출한 예측값은 제출자의 것입니다. VIDRAFT 는 채점과 순위표 표시에 필요한 " +
"범위에서만 사용하며, 개별 제출을 자사 파이프라인에 투입하지 않고 제3자에게 제공하지 않습니다.",
own2: "다만 부문 단위 집계는 공개할 수 있습니다 — 전 제출의 합의 예측, 모든 방법이 " +
"실패한 화합물 목록, 접근법별 성능 지형 등입니다. 개별 제출자의 예측값은 식별되지 않으며, " +
"집계 결과는 참가자를 포함한 모두에게 공개됩니다.",
own3: "방법 이름과 순위는 공개됩니다. 모델 내부 구조나 가중치를 요구하지 않습니다.",
secOpen: "개설 예정",
openLead: "각 부문은 홀드아웃과 실험 오차가 확보된 뒤에 엽니다. 확보되지 않은 부문은 열지 않습니다.",
learnMore: "자세히",
tabGuide: "참여 가이드",
gdIntro: "예측 도구를 처음 만드신다면 아래 순서대로 하시면 됩니다. " +
"직접 코딩하셔도 되고, 아래 프롬프트를 언어모델에 그대로 붙여 넣으셔도 됩니다.",
gdWhat: "무엇을 만드는가",
gdWhatD: "화합물 구조(SMILES)를 받아 값 하나를 내놓는 함수입니다. " +
"그 값이 실측과 얼마나 가까운지로 채점합니다.",
gdPrompt: "언어모델용 프롬프트",
gdPromptD: "아래를 통째로 복사해 Claude · GPT · Gemini 등에 붙여 넣으십시오. " +
"이 부문의 값이 이미 채워져 있습니다.",
gdCopy: "복사", gdCopied: "복사됨",
gdStarter: "바로 돌려볼 수 있는 뼈대",
gdStarterD: "직접 짜시려면 이 뼈대에서 시작하십시오. 훈련 자료를 받아 지문을 만들고 " +
"모델을 학습해 제출 파일까지 씁니다.",
gdRules: "지켜야 할 것",
gdR1: "기준일 이후 최초 보고된 화합물은 학습에 쓰지 마십시오. 그것이 테스트셋입니다.",
gdR2: "같은 화합물이 여러 논문에 있으면 InChIKey 로 접어 중앙값을 쓰십시오. " +
"문자열로 접으면 같은 분자가 여러 번 들어갑니다.",
gdR3: "정답을 조회해 채우지 마십시오. 예측값이 실측과 소수 자리까지 일치하는 밀도를 " +
"검사해 순위표에 함께 표시합니다.",
gdR4: "방법에는 제한이 없습니다. 지문+트리 · 그래프 신경망 · 사전학습 모델 · 물리 계산 " +
"무엇이든 좋습니다.",
gdTarget: "넘어야 할 선",
gdTargetD: "기준선을 넘지 못하면 순위표에서 그 아래에 표시됩니다.",
},
en: {
htmlLang: "en",
title: "LEADBOARD — Benchmark for Drug Prediction Tools",
navSpec: "spec",
login: "Sign in with HF", logout: "Sign out",
langBtn: "한국어",
heroKicker: "AI Drug Discovery Benchmark",
heroTag: "One yardstick, per discipline,
for drug prediction tools",
heroLede: "We do not release the answer key. Instead we publish, in advance, " +
"baselines that learned nothing and the inter-laboratory reproducibility " +
"of each endpoint — so that any reported score can be judged against the " +
"measurement limit itself.",
statBoards: "open boards", statCompounds: "test compounds", statFields: "disciplines",
statClauses: "spec clauses", statPlanned: "planned boards",
secLeaders: "Current leaders",
secLeadersLead: "The leading entry on each board. Boards without an entrant are left blank — a baseline is a line to cross, not a winner.",
thBoard: "Board", thBest: "Leader", thScore: "Score", thVs: "vs baseline", thN: "Test",
noLeader: "none yet",
leadersEmpty: n => `All ${n} boards are awaiting their first entry.`,
leadersSome: (a, b) => `${a} of ${b} boards have a leader.`,
secBrowse: "Disciplines",
prizeH: "Prize",
prizeLead: (amt,close)=>`At the closing date one entrant receives USD ${amt}. Closes ${close}.`,
prizeRule: (n)=>`It goes to the entrant leading the most boards. One board is enough to enter, and how many you submit to is not counted against you.
Boards use different metrics, so scores cannot be summed: what counts is the number of boards you lead. Ties go to whoever got there first.`,
statSubs: "submissions",
prizeElig: "",
prizeMissing: (n)=>"",
prizeHost: "🔸 Host submissions (SeaWolf-AI and others) are excluded from the prize count. They stay on the tables as the line to beat, but for the prize they are treated as absent — a board is led, for prize purposes, by the top entrant. Where a host entry shows first, the prize lead on that board is the next entrant down.",
prizeNone: "No contenders yet. Take first place on any board and your name appears here.",
prizeStanding: "Current contenders",
prizeFirsts: (n)=>`${n} board${n===1?"":"s"} led`,
starterTag: "start here",
starterLead: "New here? Begin with the boards marked start here. Their test sets are 150-200 compounds and the training data comes from a single ChEMBL query.",
secBrowseLead: "Select a discipline to reach its boards, leaderboards and submission desk.",
secEvidence: "Measurement-limit landscape",
secEvidenceLead: "The axis is baseline error divided by experimental error. " +
"The closer to 1.0, the more that further tuning amounts to " +
"predicting measurement scatter.",
secMethod: "Eight clauses the scorer imposes on itself",
secMethodLead: "These are not requirements placed on entrants. They are constraints we accept.",
secData: "Data and licence",
terrLeft: "inside experimental error", terrRight: "model error larger",
insideCount: n => `${n} boards sit within 1.3x.`,
lostNote: n => `On ${n} boards the trained baseline failed to beat constant prediction. ` +
"A prediction that learned nothing was more accurate. Without baselines resident on the " +
"leaderboard (clause 3), this fact appears in no metric.",
openN: n => `${n} open`, prep: "in preparation",
cardBoards: (o, p) => `boards ${o}/${p}`,
cardCompounds: n => `${n} compounds`,
clauses: [
["The answer key is not distributed", "Each board declares its split grade and answer grade"],
["Every score carries two fingerprints", "SHA-256 of the data revision and of the scoring code"],
["Baselines never leave the table", "Constant, nearest-neighbour and Morgan+LightGBM stay resident"],
["Experimental error is published first", "Derived from cross-publication measurements of the same compound"],
["Leakage is screened on every submission", "We report the density of predictions matching labels to the decimal"],
["Result submission and model submission are distinct", "Only re-executed submissions receive [verified]"],
["An unmeasured axis is not a zero", "Failing to measure differs from measuring a poor result"],
["Repeated submission does not raise rank", "Ladder · Blum & Hardt, ICML 2015"]
],
all: "All",
tabRank: "Leaderboard", tabSubmit: "Submit", tabInfo: "Board detail",
thRank: "#", thMethod: "Method", thUser: "Entrant", thLeak: "Leakage", thGrade: "Grade",
baseline: "baseline", submitted: "submitted", verified: "verified", reference: "reference tool",
leakHigh: "lookup trace", leakElev: "near-exact density",
noiseNote: v => `Experimental error ${v}. Differences within this band are not ` +
"claimed as rank differences (clause 4). The three baselines stay resident (clause 3).",
noEntries: "No entrant submissions yet. The rows shown are baselines.",
updated: t => `Leaderboard updated ${t}`,
gradeH: "Grades", holdoutH: "Holdout", noiseH: "Experimental error", baseH: "Baselines",
splitGrade: "Split grade", answerGrade: "Answer grade",
gradeNote: {
T: "Time split by year of first report. Only compounds first reported after the cut are scored",
S: "Scaffold split. Only compounds whose scaffold is absent from training are scored",
P1: "The answer exists in a public database. Clause 8 carries the defence against lookup",
P2: "The source is public, but selection and unit conversion define this revision. " +
"Querying the public database does not reproduce these values",
P3: "Unpublished measurements provided by a partner",
P4: "Measured after the board opened. It did not exist at opening"
},
kSource: "Source", kCut: "Split year", kTrainTest: "Train / test",
kOverlap: "Structure overlap", kThr: "Classification threshold", kSha: "Data fingerprint",
kLicense: "Licence",
cutNote: "by year of first report", overlapNote: "0 (by construction of the time split)",
posRate: p => `positives ${p}%`,
noisePairs: (p, c) => `${p} pairs · ${c} compounds`,
noiseDesc: "Difference between measurements of the same compound in different publications",
noiseSd: "Estimated single-measurement SD",
nearNote: (p, hi) => `${p}% of test compounds lie within one experimental SD of the ` +
"classification threshold. " + (hi ? "Labels there can invert on re-measurement, so " +
"regression is the primary metric." : "Classification metrics are reported alongside."),
beatsYes: "The trained baseline beat constant prediction.",
beatsNo: "The trained baseline failed to beat constant prediction. " +
"A prediction that learned nothing was more accurate.",
noiseFloorRow: "experimental error floor",
step1: "Obtain the test set", step2: "Submit predictions", step3: "Submit a container (optional)",
step1d: n => `Structures (SMILES) for ${n} compounds. No labels — they do not exist on this server.`,
licLine: "Derived from ChEMBL · CC BY-SA 3.0 — retain attribution and the same licence on redistribution.",
dl: "Download test set",
fMethod: "Method name", fMethodH: "as it will appear on the leaderboard",
fTrain: "Training data used", fTrainH: "used for the clause 5 leakage screen",
fPred: "Predictions", fPredH: "JSON or CSV (compound_id, prediction)",
fPredAx: n => `This board has ${n} axes — upload JSON with an array of ${n} numbers per compound`,
drop: "Drop a file here, or click to choose",
send: "Submit", needLogin: "Signing in with a Hugging Face account is required to submit.",
step3d: "Submit the model with its inference environment and we re-execute it, confirm the " +
"same numbers, and mark it [verified] (clause 6).",
ladderNote: (v, c) => `Clause 8. Repeated submission does not raise rank. A new score is ` +
`released only when it improves on your previous best by more than the experimental error ` +
`${v}. Daily limit ${c}.`,
accepted: id => `Accepted · submission ${id}`,
parseFail: m => `Could not parse the predictions: ${m}`,
sending: n => `sending ${n} entries`,
emptyCat: "No boards are open in this discipline yet.",
loadFail: "The page could not be loaded.",
dataNote: "Every board is built from ChEMBL_37 and split by year of first report. " +
"Distributed test sets contain structures only; labels are not included.",
srcLabel: "Data source",
sib: "Sister benchmarks",
sibOdc: "Computational validation of AI-generated drug candidates",
sibOmc: "A benchmark for solid-state battery materials",
secWhy: "Why this exists",
why1: "As AI produces drug candidates, it also produces the prediction tools that judge " +
"them. Absorption, metabolism, toxicity, target binding — each has dozens of tools. " +
"Yet their performance is reported by their own authors, on data of their own choosing. " +
"They were not measured on the same problem, so the comparison does not hold.",
why2: "In February 2026 an audit of the top-ranked models across 22 endpoints of a widely used " +
"ADMET leaderboard was published. Of 66 models examined, three reproduced fully. Models " +
"deliberately tuned on the public test set reached the top three on 10 of 22 endpoints; " +
"the same design built honestly reached it on two.",
why3: "The fault lies not with any laboratory but with the format of the examination. " +
"A test distributed together with its answer key cannot separate predictive power from exposure.",
whyCite: "Koleiev et al., Critical Assessment of ML models for ADMET Prediction in TDC leaderboards, bioRxiv 2026",
secFound: "What this benchmark measured",
secFoundLead: "These are not citations. They were produced here, across 19 boards.",
ratioLabel: "error / experimental error",
found1t: "The split alone moves AUROC by 0.21",
found1d: "Same data, same model (Morgan+LightGBM at defaults), same test fraction — only the split " +
"changed. On hERG: random split 0.818, time split 0.606. " +
"A leaderboard that does not declare its split cannot be compared against.",
found2t: "On 7 of 19 boards the trained baseline failed to beat constant prediction",
found2d: "Returning the training median outperformed a trained model. Without baselines resident " +
"on the leaderboard, this fact appears in no metric.",
found3t: "Model error sits between 0.91x and 2.79x the experimental error",
found3d: "Each board carries an experimental error derived from measurements of the same compound " +
"in different publications. Seven boards lie within 1.3x of that error.",
secHow: "How to take part",
how1t: "Obtain the test set",
how1d: "Choose a board and download a file containing structures (SMILES) and identifiers only. " +
"No labels are included, and none exist on this server.",
how2t: "Predict with any tool you like",
how2d: "Proprietary models, commercial tools, open weights, physics-based calculation — all are " +
"permitted. We impose no restriction. Only declare the data you trained on, which is used " +
"for the clause 5 leakage screen.",
how3t: "Submit predictions for automatic scoring",
how3d: "Upload JSON or CSV. Scoring, leakage screening and fingerprinting run automatically, and " +
"the result appears on the leaderboard beside the three baselines and the experimental error.",
secMetric: "What is scored",
mMae: "Primary metric. Mean absolute error against the measured value. Lower is better.",
mAuroc: "Classification metric. Ability to separate above and below the threshold. 0.5 equals chance.",
mPrauc: "More informative than AUROC where positives are rare.",
mNoise: "Reproducibility derived from cross-publication measurements of the same compound. " +
"Differences within this band are not recognised as rank differences.",
mRatio: "Best baseline error divided by experimental error. Approaching 1.0 means the measurement " +
"limit has been reached.",
mLeak: "Density of predictions matching the measured value to the decimal. We do not adjudicate " +
"intent; we report the fact.",
secOwn: "How submissions are handled",
own1: "Your predictions remain yours. VIDRAFT uses them only as required for scoring and " +
"leaderboard display. Individual submissions are not fed into our own pipeline and are not " +
"provided to third parties.",
own2: "We may publish board-level aggregates — a consensus prediction across all entries, " +
"the compounds every method failed, the performance landscape by approach. Individual " +
"predictions are not identifiable in these, and the aggregates are released to everyone, " +
"entrants included.",
own3: "Method names and ranks are public. We do not ask for model internals or weights.",
secOpen: "Opening next",
openLead: "A board opens only once its holdout and experimental error are established. " +
"Boards without them are not opened.",
learnMore: "Detail",
tabGuide: "Guide",
gdIntro: "If this is your first predictor, follow the steps below. Write it yourself, " +
"or paste the prompt into a language model as it is.",
gdWhat: "What you are building",
gdWhatD: "A function that takes a structure (SMILES) and returns one number. " +
"We score how close that number is to the measured value.",
gdPrompt: "Prompt for a language model",
gdPromptD: "Copy the whole block into Claude, GPT, Gemini or similar. " +
"The values for this board are already filled in.",
gdCopy: "Copy", gdCopied: "Copied",
gdStarter: "A skeleton you can run",
gdStarterD: "If you would rather write it yourself, start here. It pulls the training data, " +
"builds fingerprints, fits a model and writes the submission file.",
gdRules: "Rules to observe",
gdR1: "Do not train on compounds first reported on or after the split year. That is the test set.",
gdR2: "Fold duplicate measurements by InChIKey and take the median. Folding by SMILES string " +
"leaves the same molecule in several times.",
gdR3: "Do not fill predictions by looking up the answer. We measure how many predictions match " +
"the measured value to the decimal and show it on the leaderboard.",
gdR4: "There is no restriction on method. Fingerprints and trees, graph networks, pretrained " +
"models, physics-based calculation — all are fine.",
gdTarget: "Lines to cross",
gdTargetD: "A submission that does not clear a baseline is shown below it on the leaderboard.",
}
};