Skip to content

Commit 0b8426a

Browse files
committed
add 2023-01-26-model-run-times-pie.svelte to /models page (from scripts/compile_metrics.py)
remove SEM shaded areas from rolling MAE plot update each-scatter-models.webp remove mdsvex Layout for /paper and Img.svelte component
1 parent 9fed210 commit 0b8426a

16 files changed

+149
-66
lines changed

.github/workflows/gh-pages.yml

+3-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ jobs:
2424
uses: actions/setup-python@v4
2525
with:
2626
python-version: "3.11"
27+
cache: pip
28+
cache-dependency-path: setup.py
2729

2830
- name: Set up node
2931
uses: actions/setup-node@v3
@@ -34,7 +36,7 @@ jobs:
3436
run: |
3537
pip install lazydocs # used in package.json script
3638
# lazydocs needs package deps to be installed
37-
pip install .
39+
pip install -e .
3840
cd site
3941
npm install
4042

matbench_discovery/__init__.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
timestamp = f"{datetime.now():%Y-%m-%d@%H-%M-%S}"
2323
today = timestamp.split("@")[0]
2424

25-
# load URLs from package.json
25+
# load docs, repo, package URLs from package.json
26+
print(f"{ROOT=}")
2627

2728
with open(f"{ROOT}/site/package.json") as file:
2829
pkg = json.load(file)

matbench_discovery/data.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ def load_train_test(
139139

140140

141141
PRED_FILENAMES = {
142-
"CGCNN": "cgcnn/2022-11-23-test-cgcnn-wbm-IS2RE/cgcnn-ensemble-preds.csv",
142+
"CGCNN": "cgcnn/2023-01-26-test-cgcnn-wbm-IS2RE/cgcnn-ensemble-preds.csv",
143143
"Voronoi Random Forest": "voronoi/2022-11-27-train-test/e-form-preds-IS2RE.csv",
144144
"Wrenformer": "wrenformer/2022-11-15-wrenformer-IS2RE-preds.csv",
145145
"MEGNet": "megnet/2022-11-18-megnet-wbm-IS2RE/megnet-e-form-preds.csv",

matbench_discovery/plots.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ def rolling_mae_vs_hull_dist(
280280
backend: Backend = "plotly",
281281
y_label: str = "rolling MAE (eV/atom)",
282282
just_plot_lines: bool = False,
283+
with_sem: bool = True,
283284
**kwargs: Any,
284285
) -> plt.Axes | go.Figure:
285286
"""Rolling mean absolute error as the energy to the convex hull is varied. A scale
@@ -307,6 +308,8 @@ def rolling_mae_vs_hull_dist(
307308
just_plot_line (bool, optional): If True, plot only the rolling MAE, no shapes
308309
and annotations. Also won't plot the standard error in the mean. Defaults
309310
to False.
311+
with_sem (bool, optional): If True, plot the standard error of the mean as
312+
shaded area around the rolling MAE. Defaults to True.
310313
311314
Returns:
312315
tuple[plt.Axes | go.Figure, pd.DataFrame, pd.DataFrame]: matplotlib Axes or
@@ -358,7 +361,7 @@ def rolling_mae_vs_hull_dist(
358361
if backend == "matplotlib":
359362
# assert df_rolling_err.isna().sum().sum() == 0, "NaNs in df_rolling_err"
360363
# assert df_err_std.isna().sum().sum() == 0, "NaNs in df_err_std"
361-
# for model in df_rolling_err:
364+
# for model in df_rolling_err if with_sem else []:
362365
# ax.fill_between(
363366
# bins,
364367
# df_rolling_err[model] + df_err_std[model],
@@ -413,7 +416,7 @@ def rolling_mae_vs_hull_dist(
413416
ax.set(xlim=x_lim, ylim=y_lim)
414417

415418
elif backend == "plotly":
416-
for idx, model in enumerate(df_rolling_err):
419+
for idx, model in enumerate(df_rolling_err if with_sem else []):
417420
# set legendgroup to model name so SEM shading toggles with model curve
418421
ax.data[idx].legendgroup = model
419422
# set SEM area to same color as model curve
@@ -466,7 +469,7 @@ def rolling_mae_vs_hull_dist(
466469
ax.add_annotation(
467470
x=-dft_acc,
468471
y=dft_acc,
469-
text=f"<a {href=}>Corrected GGA Accuracy</a> "
472+
text=f"<a {href=}>Corrected GGA Accuracy<br>for rel. Energy</a> "
470473
"[<a href='#hautier_accuracy_2012' target='_self'>ref</a>]",
471474
showarrow=True,
472475
xshift=-10,

scripts/compile_metrics.py

+42-16
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
import requests
88
import wandb
99
import wandb.apis.public
10+
from pymatviz.utils import save_fig
1011
from sklearn.metrics import f1_score, r2_score
1112
from tqdm import tqdm
1213

1314
from matbench_discovery import FIGS, MODELS, WANDB_PATH, today
1415
from matbench_discovery.data import PRED_FILENAMES, load_df_wbm_preds
16+
from matbench_discovery.plots import px
1517

1618
__author__ = "Janosh Riebesell"
1719
__date__ = "2022-11-28"
@@ -76,15 +78,14 @@
7678
# test set.
7779

7880
for model in (pbar := tqdm(models)):
79-
model_dict = models[model]
80-
n_runs, filters = (model_dict.get(x) for x in ("n_runs", "filters"))
81+
n_runs, filters = (models[model].get(x) for x in ("n_runs", "filters"))
8182
if n_runs == 0 or model in model_stats:
8283
continue
8384
pbar.set_description(model)
84-
if "runs" in models:
85-
runs: wandb.apis.public.Runs = models["runs"]
85+
if "runs" in models[model]:
86+
runs: wandb.apis.public.Runs = models[model]["runs"]
8687
else:
87-
models["runs"] = runs = wandb.Api().runs(WANDB_PATH, filters=filters)
88+
models[model]["runs"] = runs = wandb.Api().runs(WANDB_PATH, filters=filters)
8889

8990
assert len(runs) == n_runs, f"found {len(runs)=} for {model}, expected {n_runs}"
9091

@@ -96,8 +97,7 @@
9697

9798
n_gpu, n_cpu = metadata.get("gpu_count", 0), metadata.get("cpu_count", 0)
9899
model_stats[model] = {
99-
"run_time": run_time_total,
100-
"run_time_h": f"{run_time_total / 3600:.1f} h",
100+
"run_time_h": run_time_total / 3600,
101101
"GPU": n_gpu,
102102
"CPU": n_cpu,
103103
"slurm_jobs": n_runs,
@@ -109,7 +109,7 @@
109109
title=f"Run time distribution for {model}", xlabel="Run time [h]", ylabel="Count"
110110
)
111111

112-
112+
df_metrics = pd.DataFrame(model_stats).T
113113
# on 2022-11-28:
114114
# run_times = {'Voronoi Random Forest': 739608,
115115
# 'Wrenformer': 208399,
@@ -119,14 +119,12 @@
119119

120120

121121
# %%
122-
df_wbm = load_df_wbm_preds(models=list(models))
122+
df_wbm = load_df_wbm_preds(list(models))
123123
e_form_col = "e_form_per_atom_mp2020_corrected"
124124
each_col = "e_above_hull_mp2020_corrected_ppd_mp"
125125

126126

127127
# %%
128-
df_metrics = pd.DataFrame(model_stats).T
129-
130128
for model in models:
131129
dct = {}
132130
e_above_hull_pred = df_wbm[model] - df_wbm[e_form_col]
@@ -154,7 +152,7 @@
154152
)
155153

156154

157-
# %%
155+
# %% export model metrics as styled HTML table
158156
styles = {
159157
"": "font-family: sans-serif; border-collapse: collapse;",
160158
"td, th": "border: 1px solid #ddd; text-align: left; padding: 8px;",
@@ -165,10 +163,38 @@
165163
# df_styled.to_html(html_path)
166164

167165

168-
# %%
169-
df = load_df_wbm_preds(list(models))
166+
# %% write model metrics to json for use by the website
167+
df_metrics["missing_preds"] = df_wbm[list(models)].isna().sum()
168+
df_metrics["missing_percent"] = [
169+
f"{x / len(df_wbm):.2%}" for x in df_metrics.missing_preds
170+
]
170171

171-
df_metrics["missing_preds"] = df[list(models)].isna().sum()
172-
df_metrics["missing_percent"] = [f"{x / len(df):.2%}" for x in df_metrics.missing_preds]
172+
df_metrics.attrs["total_run_time"] = df_metrics.run_time.sum()
173173

174174
df_metrics.round(2).to_json(f"{MODELS}/{today}-model-stats.json", orient="index")
175+
176+
177+
# %% plot model run times as pie chart
178+
fig = px.pie(
179+
df_metrics, values="run_time", names=df_metrics.index, hole=0.5
180+
).update_traces(
181+
textinfo="percent+label",
182+
textfont_size=14,
183+
marker=dict(line=dict(color="#000000", width=2)),
184+
hoverinfo="label+percent+name",
185+
texttemplate="%{label}<br>%{percent:.1%}",
186+
hovertemplate="%{label} %{percent:.1%} (%{value:.1f} h)",
187+
rotation=90,
188+
showlegend=False,
189+
)
190+
fig.add_annotation(
191+
# add title in the middle saying "Total CPU+GPU time used"
192+
text=f"Total CPU+GPU<br>time used:<br>{df_metrics.run_time.sum():.1f} h",
193+
font=dict(size=18),
194+
x=0.5,
195+
y=0.5,
196+
showarrow=False,
197+
)
198+
fig.update_layout(margin=dict(l=0, r=0, t=0, b=0))
199+
200+
save_fig(fig, f"{FIGS}/{today}-model-run-times-pie.svelte")

scripts/make_api_docs.py

+22-19
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,34 @@
1-
import json
21
import os
32
from glob import glob
4-
from subprocess import run
53

6-
# Update auto-generated API docs. Also tweak lazydocs's markdown output for
7-
# - prettier badges linking to source code on GitHub
8-
# - remove bold tags since they break inline code
4+
from lazydocs import generate_docs
5+
6+
from matbench_discovery import ROOT, URLs
7+
8+
# Update auto-generated API docs.
99

10-
pkg = json.load(open("site/package.json"))
11-
route = "site/src/routes/api"
10+
out_path = f"{ROOT}/site/src/routes/api"
1211

13-
for path in glob(f"{route}/*.md"):
12+
for path in glob(f"{out_path}/*.md"):
1413
os.remove(path)
1514

16-
run(
17-
f"lazydocs matbench_discovery --output-path {route} "
18-
f"--no-watermark --src-base-url {pkg['repository']}/blob/main",
19-
shell=True,
15+
generate_docs(
16+
["matbench_discovery"],
17+
output_path=out_path,
18+
watermark=False,
19+
src_base_url=f"{URLs['Repo']}/blob/-",
2020
)
2121

22-
for path in glob(f"{route}/*.md"):
23-
markdown = open(path).read()
24-
# remove <b> tags from generated markdown as they break inline code
25-
markdown = markdown.replace("<b>", "").replace("</b>", "")
26-
# improve style of badges linking to source code on GitHub
27-
markdown = markdown.replace(
22+
# Tweak lazydocs's markdown output:
23+
# - remove bold tags since they break inline code
24+
# - make badges linking to GitHub source code blue with flat style, add alt text
25+
for path in glob(f"{out_path}/*.md"):
26+
text = open(path).read()
27+
28+
text = text.replace("<b>", "").replace("</b>", "")
29+
30+
text = text.replace(
2831
'src="https://img.shields.io/badge/-source-cccccc?style=flat-square"',
2932
'src="https://img.shields.io/badge/source-blue?style=flat" alt="source link"',
3033
)
31-
open(path, "w").write(markdown)
34+
open(path, "w").write(text)

scripts/rolling_mae_vs_hull_dist_all_models.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
e_above_hull_true=df_wbm[e_above_hull_col],
3939
e_above_hull_errors=df_wbm.filter(like=" MAE="),
4040
backend=backend,
41+
with_sem=False,
4142
# template="plotly_white",
4243
)
4344

@@ -51,13 +52,16 @@
5152
for line in fig.lines:
5253
line._linewidth *= 2
5354
else:
54-
# select only every 10th point from each trace
55+
# keep every 10th point from each trace to reduce plot size for website
5556
for trace in fig.data:
5657
if trace.name and trace.name.startswith("MAE") and len(trace.x) < 100:
5758
continue # skip the MAE < DFT error area traces
5859
trace.x = trace.x[::10]
5960
trace.y = trace.y[::10]
6061

62+
# increase line width
63+
fig.update_traces(line=dict(width=3))
64+
6165
# increase legend handle size and reverse order
6266
fig.update_layout(legend=dict(itemsizing="constant"), legend_traceorder="reversed")
6367

scripts/scatter_e_above_hull_models.py

+34-2
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,8 @@ def _add_metrics_to_legend(fig: go.Figure) -> None:
122122
facet_row_spacing=0.15,
123123
hover_data=hover_cols,
124124
hover_name=id_col,
125-
color="clf",
126-
color_discrete_map=dict(zip(classes, ("green", "yellow", "red", "blue"))),
125+
# color="clf",
126+
# color_discrete_map=dict(zip(classes, px.colors.qualitative.Pastel)),
127127
# opacity=0.4,
128128
range_x=[-2, 2],
129129
range_y=[-2, 2],
@@ -181,7 +181,39 @@ def _add_metrics_to_legend(fig: go.Figure) -> None:
181181
**axis_titles,
182182
)
183183

184+
# add transparent rectangle with TN, TP, FN, FP labels in each quadrant
185+
for idx, _model in enumerate(models, 1):
186+
for s1, s2, color, label in (
187+
(-1, -1, "green", "TP"),
188+
(-1, 1, "yellow", "FN"),
189+
(1, -1, "red", "FP"),
190+
(1, 1, "blue", "TN"),
191+
):
192+
fig.add_shape(
193+
type="rect",
194+
x0=0,
195+
y0=0,
196+
x1=s1 * 100,
197+
y1=s2 * 100,
198+
fillcolor=color,
199+
opacity=0.3,
200+
layer="below",
201+
xref=f"x{idx if idx > 1 else ''}",
202+
yref=f"y{idx if idx > 1 else ''}",
203+
)
204+
fig.add_annotation(
205+
xref=f"x{idx if idx > 1 else ''}",
206+
yref=f"y{idx if idx > 1 else ''}",
207+
x=s1 * 1.7,
208+
y=s2 * 1.7,
209+
text=label,
210+
showarrow=False,
211+
font=dict(size=16),
212+
)
184213

185214
fig.show()
215+
216+
217+
# %%
186218
img_path = f"{STATIC}/{today}-each-scatter-models.webp"
187219
save_fig(fig, img_path, scale=4, width=1000, height=500)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<div {...$$props}> <div id="62ff26e4-7a3d-4d32-a0e7-5b50a3c0eed0" class="plotly-graph-div" style="height:100%; width:100%;"></div> <script type="text/javascript"> window.PLOTLYENV=window.PLOTLYENV || {}; if (document.getElementById("62ff26e4-7a3d-4d32-a0e7-5b50a3c0eed0")) { Plotly.newPlot( "62ff26e4-7a3d-4d32-a0e7-5b50a3c0eed0", [{"domain":{"x":[0.0,1.0],"y":[0.0,1.0]},"hole":0.5,"hovertemplate":"%{label} %{percent:.1%} (%{value:.1f} h)","labels":["CGCNN","Voronoi Random Forest","Wrenformer","MEGNet","M3GNet","BOWSR MEGNet"],"legendgroup":"","name":"","showlegend":false,"values":[11.349722222222223,204.7,57.88861111111111,3.4433333333333334,83.64944444444444,2776.570277777778],"type":"pie","textfont":{"size":14},"marker":{"line":{"color":"#000000","width":2}},"hoverinfo":"label+percent+name","rotation":90,"textinfo":"percent+label","texttemplate":"%{label}<br>%{percent:.1%}"}], {"template":{"data":{"barpolar":[{"marker":{"line":{"color":"rgb(17,17,17)","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#f2f5fa"},"error_y":{"color":"#f2f5fa"},"marker":{"line":{"color":"rgb(17,17,17)","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#A2B1C6","gridcolor":"#506784","linecolor":"#506784","minorgridcolor":"#506784","startlinecolor":"#A2B1C6"},"baxis":{"endlinecolor":"#A2B1C6","gridcolor":"#506784","linecolor":"#506784","minorgridcolor":"#506784","startlinecolor":"#A2B1C6"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmapgl":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmapgl"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"line":{"color":"#283442"}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"marker":{"line":{"color":"#283442"}},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#506784"},"line":{"color":"rgb(17,17,17)"}},"header":{"fill":{"color":"#2a3f5f"},"line":{"color":"rgb(17,17,17)"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#f2f5fa","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#f2f5fa","size":13},"geo":{"bgcolor":"rgb(17,17,17)","lakecolor":"rgb(17,17,17)","landcolor":"rgb(17,17,17)","showlakes":true,"showland":true,"subunitcolor":"#506784"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"dark"},"paper_bgcolor":"rgba(0,0,0,0)","plot_bgcolor":"rgb(17,17,17)","polar":{"angularaxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""},"bgcolor":"rgb(17,17,17)","radialaxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"rgb(17,17,17)","gridcolor":"#506784","gridwidth":2,"linecolor":"#506784","showbackground":true,"ticks":"","zerolinecolor":"#C8D4E3"},"yaxis":{"backgroundcolor":"rgb(17,17,17)","gridcolor":"#506784","gridwidth":2,"linecolor":"#506784","showbackground":true,"ticks":"","zerolinecolor":"#C8D4E3"},"zaxis":{"backgroundcolor":"rgb(17,17,17)","gridcolor":"#506784","gridwidth":2,"linecolor":"#506784","showbackground":true,"ticks":"","zerolinecolor":"#C8D4E3"}},"shapedefaults":{"line":{"color":"#f2f5fa"}},"sliderdefaults":{"bgcolor":"#C8D4E3","bordercolor":"rgb(17,17,17)","borderwidth":1,"tickwidth":0},"ternary":{"aaxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""},"baxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""},"bgcolor":"rgb(17,17,17)","caxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""}},"title":{"x":0.05},"updatemenudefaults":{"bgcolor":"#506784","borderwidth":0},"xaxis":{"automargin":true,"gridcolor":"#283442","linecolor":"#506784","ticks":"","title":{"standoff":15},"zerolinecolor":"#283442","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"#283442","linecolor":"#506784","ticks":"","title":{"standoff":15},"zerolinecolor":"#283442","zerolinewidth":2},"margin":{"b":20,"l":30,"r":20,"t":60}}},"legend":{"tracegroupgap":0},"annotations":[{"font":{"size":18},"showarrow":false,"text":"Total CPU+GPU<br>time used:<br>3137.6 h","x":0.5,"y":0.5}],"margin":{"l":0,"r":0,"t":0,"b":0}}, {"showTips": false, "modeBarButtonsToRemove": ["lasso2d", "select2d", "autoScale2d", "toImage"], "responsive": true, "displaylogo": false} ) }; </script> </div>

0 commit comments

Comments
 (0)