from pathlib import Path import pandas as pd import plotly.colors as pcolors import plotly.graph_objects as go import streamlit as st from mlip_arena.models import REGISTRY DATA_DIR = Path("mlip_arena/tasks/combustion") st.markdown(""" # Combustion """) st.markdown("### Methods") container = st.container(border=True) valid_models = [model for model, metadata in REGISTRY.items() if Path(__file__).stem in metadata.get("gpu-tasks", [])] models = container.multiselect("MLIPs", valid_models, ["MACE-MP(M)", "CHGNet", "M3GNet", "EquiformerV2(OC22)", "SevenNet"]) st.markdown("### Settings") vis = st.container(border=True) # Get all attributes from pcolors.qualitative all_attributes = dir(pcolors.qualitative) color_palettes = { attr: getattr(pcolors.qualitative, attr) for attr in all_attributes if isinstance(getattr(pcolors.qualitative, attr), list) } color_palettes.pop("__all__", None) palette_names = list(color_palettes.keys()) palette_colors = list(color_palettes.values()) palette_name = vis.selectbox("Color sequence", options=palette_names, index=22) color_sequence = color_palettes[palette_name] if not models: st.stop() families = [REGISTRY[str(model)]["family"] for model in models] dfs = [ pd.read_json(DATA_DIR / family.lower() / "hydrogen.json") for family in families ] df = pd.concat(dfs, ignore_index=True) df.drop_duplicates(inplace=True, subset=["formula", "method"]) method_color_mapping = { method: color_sequence[i % len(color_sequence)] for i, method in enumerate(df["method"].unique()) } ### # Number of products fig = go.Figure() for method in df["method"].unique(): row = df[df["method"] == method].iloc[0] fig.add_trace( go.Scatter( x=row["timesteps"], y=row["nproducts"], mode="lines", name=method, line=dict(color=method_color_mapping[method]), showlegend=True, ), ) fig.update_layout( title="Hydrogen Combustion (2H2 + O2 -> 2H2O, 64 units)", xaxis_title="Timesteps", yaxis_title="Number of water molecules", ) st.plotly_chart(fig) # tempearture fig = go.Figure() for method in df["method"].unique(): row = df[df["method"] == method].iloc[0] fig.add_trace( go.Scatter( x=row["timesteps"], y=row["temperatures"], mode="markers", name=method, line=dict(color=method_color_mapping[method]), showlegend=True, ), ) target_steps = df["target_steps"].iloc[0] fig.add_trace( go.Line( x=[0, target_steps/3, target_steps/3*2, target_steps], y=[300, 3000, 3000, 300], mode="lines", name="Target", line=dict( dash="dash", ), showlegend=True, ), ) fig.update_layout( title="Hydrogen Combustion (2H2 + O2 -> 2H2O, 64 units)", xaxis_title="Timesteps", yaxis_title="Temperatures", yaxis2=dict( title="Product Percentage (%)", overlaying="y", side="right", range=[0, 100], tickmode="sync" ) # template="plotly_dark", ) st.plotly_chart(fig) # MD runtime speed fig = go.Figure() df = df.sort_values("steps_per_second", ascending=True) fig.add_trace( go.Bar( x=df["steps_per_second"], y=df["method"], opacity=0.75, orientation="h", marker=dict(color=[method_color_mapping[method] for method in df["method"]]), ) ) fig.update_layout( title="MD runtime speed (on single A100 GPU)", xaxis_title="Steps per second", yaxis_title="Method", ) st.plotly_chart(fig)