File size: 3,397 Bytes
89faec9
3b0d98a
 
df95987
 
 
5fe6cc0
 
5f78296
3b0d98a
3c32d85
89faec9
 
 
 
3b0d98a
 
1485b15
89faec9
 
 
 
 
 
 
 
 
 
 
 
 
 
3b0d98a
5fe6cc0
2100e49
5fe6cc0
3b0d98a
2100e49
55346d5
1485b15
 
 
 
 
5f78296
 
fcaf71c
3b0d98a
 
 
 
 
 
 
89faec9
3b0d98a
 
89faec9
 
 
 
 
 
 
 
558b4d7
1485b15
89faec9
140be5e
558b4d7
cc648f8
3c32d85
89faec9
 
 
5fe6cc0
5f78296
 
df95987
5f78296
 
 
 
55346d5
 
5f78296
 
 
55346d5
 
5f78296
 
 
5fe6cc0
 
 
89faec9
 
623f47a
5fe6cc0
89faec9
 
 
 
 
623f47a
 
 
 
89faec9
 
623f47a
89faec9
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
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
import importlib
from pathlib import Path

import pandas as pd
import streamlit as st

from mlip_arena.models import REGISTRY as MODELS
from mlip_arena.tasks import REGISTRY as TASKS

DATA_DIR = Path("mlip_arena/tasks/diatomics")

dfs = [
    pd.read_json(DATA_DIR / MODELS[model].get("family") / "homonuclear-diatomics.json")
    for model in MODELS
]
df = pd.concat(dfs, ignore_index=True)


table = pd.DataFrame(
    columns=[
        "Model",
        "Element Coverage",
        # "No. of reversed forces",
        # "Energy-consistent forces",
        "Prediction",
        "NVT",
        "NPT",
        "Code",
        "Paper",
        "First Release",
    ]
)

for model in MODELS:
    rows = df[df["method"] == model]
    metadata = MODELS.get(model, {})
    new_row = {
        "Model": model,
        "Element Coverage": len(rows["name"].unique()),
        # "No. of reversed forces": None,  # Replace with actual logic if available
        # "Energy-consistent forces": None,  # Replace with actual logic if available
        "Prediction": metadata.get("prediction", None),
        "NVT": "✅" if metadata.get("nvt", False) else "❌",
        "NPT": "✅" if metadata.get("npt", False) else "❌",
        "Code": metadata.get("github", None) if metadata else None,
        "Paper": metadata.get("doi", None) if metadata else None,
        "First Release": metadata.get("date", None),
    }
    table = pd.concat([table, pd.DataFrame([new_row])], ignore_index=True)

table.set_index("Model", inplace=True)


s = table.style.background_gradient(
    cmap="PuRd", subset=["Element Coverage"], vmin=0, vmax=120
)

st.warning(
    "MLIP Arena is currently in **pre-alpha**. The results are not stable. Please interpret them with care.",
    icon="⚠️",
)
st.info(
    "Contributions are welcome. For more information, visit https://github.com/atomind-ai/mlip-arena.",
    icon="🤗",
)

st.markdown(
    """
<h1 style='text-align: center;'>⚔️ MLIP Arena Leaderboard ⚔️</h1>

MLIP Arena is a platform for benchmarking foundation machine learning interatomic potentials (MLIPs), mainly for disclosing the learned physics and chemistry of the models and their performance on molecular dynamics (MD) simulations.
The benchmarks are designed to evaluate the readiness and reliability of open-source, open-weight models to reproduce the qualitatively or quantitatively correct physics.
""",
    unsafe_allow_html=True,
)


st.dataframe(
    s,
    use_container_width=True,
    column_config={
        "Code": st.column_config.LinkColumn(
            # validate="^https://[a-z]+\.streamlit\.app$",
            width="medium",
            display_text="Link",
        ),
        "Paper": st.column_config.LinkColumn(
            # validate="^https://[a-z]+\.streamlit\.app$",
            width="medium",
            display_text="Link",
        ),
    },
)


for task in TASKS:
    if TASKS[task]["rank-page"] is None:
        continue

    st.header(task, divider=True)
    st.page_link(
        f"tasks/{TASKS[task]['task-page']}.py",
        label="Link to task page",
        icon=":material/link:",
    )

    task_module = importlib.import_module(f"ranks.{TASKS[task]['rank-page']}")

    #  Call the function from the imported module
    if hasattr(task_module, "render"):
        task_module.render()
    else:
        st.write("Results for the task are not available yet.")