MEIDNet / site /reference /api.html
Babu09's picture
Deploy MEIDNet Studio
8ce7f7f verified
Raw History Blame Contribute Delete
59.9 kB
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Multimodal inverse design of crystalline materials — with your own data, rules and families.">
<link rel="canonical" href="https://babu09-meidnet.hf.space/docs/reference/api.html">
<link rel="prev" href="rules.html">
<link rel="next" href="../community/help.html">
<link rel="icon" href="../assets/favicon-64.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
<title>Python API - MEIDNet Prism</title>
<link rel="stylesheet" href="../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="stylesheet" href="../assets/extra.css">
<link rel="stylesheet" href="../assets/prism-docs.css">
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#python-api" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../index.html" title="MEIDNet Prism" class="md-header__button md-logo" aria-label="MEIDNet Prism" data-md-component="logo">
<img src="../assets/prism-mark.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
MEIDNet Prism
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Python API
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="dark mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="light mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/ABnano/MEIDNet" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
ABnano/MEIDNet
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../index.html" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../learn/index.html" class="md-tabs__link">
Learn
</a>
</li>
<li class="md-tabs__item">
<a href="../benchmarks/index.html" class="md-tabs__link">
Benchmark
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../develop.html" class="md-tabs__link">
Develop
</a>
</li>
<li class="md-tabs__item">
<a href="https://babu09-meidnet-matter.hf.space/" class="md-tabs__link">
Matter ↗
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../index.html" title="MEIDNet Prism" class="md-nav__button md-logo" aria-label="MEIDNet Prism" data-md-component="logo">
<img src="../assets/prism-mark.png" alt="logo">
</a>
MEIDNet Prism
</label>
<div class="md-nav__source">
<a href="https://github.com/ABnano/MEIDNet" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
ABnano/MEIDNet
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../index.html" class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
Learn
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Learn
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../learn/index.html" class="md-nav__link">
<span class="md-ellipsis">
Learn multimodality
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../learn/architectures.html" class="md-nav__link">
<span class="md-ellipsis">
Architectures
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../learn/recipes.html" class="md-nav__link">
<span class="md-ellipsis">
Recipes by problem
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../understand/how-it-works.html" class="md-nav__link">
<span class="md-ellipsis">
How MEIDNet works
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../understand/interpretability.html" class="md-nav__link">
<span class="md-ellipsis">
Interpreting a candidate
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../understand/limits.html" class="md-nav__link">
<span class="md-ellipsis">
Scope and roadmap
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ecosystem.html" class="md-nav__link">
<span class="md-ellipsis">
The ecosystem
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../research/paper.html" class="md-nav__link">
<span class="md-ellipsis">
Paper and citation
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-ellipsis">
Benchmark
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Benchmark
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../benchmarks/index.html" class="md-nav__link">
<span class="md-ellipsis">
MEIDNet Benchmarks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../benchmarks/compatibility.html" class="md-nav__link">
<span class="md-ellipsis">
Benchmark compatibility
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../benchmarks/perov5.html" class="md-nav__link">
<span class="md-ellipsis">
Perov-5
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../benchmarks/perov5-reproduction.html" class="md-nav__link">
<span class="md-ellipsis">
Perov-5: alignment across seeds
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../benchmarks/perov5-insights.html" class="md-nav__link">
<span class="md-ellipsis">
Perov-5: what the runs show
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../benchmarks/perov5-guide.html" class="md-nav__link">
<span class="md-ellipsis">
Perov-5: choose a model and generate
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../benchmarks/mp20.html" class="md-nav__link">
<span class="md-ellipsis">
MP-20
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../benchmarks/carbon24.html" class="md-nav__link">
<span class="md-ellipsis">
Carbon-24
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../explore/datasets.html" class="md-nav__link">
<span class="md-ellipsis">
Datasets
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../explore/databases.html" class="md-nav__link">
<span class="md-ellipsis">
Databases by application
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../community/contribute.html" class="md-nav__link">
<span class="md-ellipsis">
Contribute a result
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../community/index.html" class="md-nav__link">
<span class="md-ellipsis">
Community results
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-ellipsis">
Develop
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Develop
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../develop.html" class="md-nav__link">
<span class="md-ellipsis">
Develop with MEIDNet
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../start/quickstart.html" class="md-nav__link">
<span class="md-ellipsis">
5-minute quickstart
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../start/what-data.html" class="md-nav__link">
<span class="md-ellipsis">
What data do I need?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../start/colab.html" class="md-nav__link">
<span class="md-ellipsis">
Run in Colab
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../use/studio.html" class="md-nav__link">
<span class="md-ellipsis">
MEIDNet Studio
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../use/your-data.html" class="md-nav__link">
<span class="md-ellipsis">
Bring your own dataset
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../use/config.html" class="md-nav__link">
<span class="md-ellipsis">
The configuration file
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../use/explore-3d.html" class="md-nav__link">
<span class="md-ellipsis">
Explore in 3D
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../use/reports.html" class="md-nav__link">
<span class="md-ellipsis">
Reading the reports
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../explore/capabilities.html" class="md-nav__link">
<span class="md-ellipsis">
Capabilities
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_11" >
<label class="md-nav__link" for="__nav_4_11" id="__nav_4_11_label" tabindex="">
<span class="md-ellipsis">
Recipes
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_11_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_11">
<span class="md-nav__icon md-icon"></span>
Recipes
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../recipes/change-targets.html" class="md-nav__link">
<span class="md-ellipsis">
Change the target properties
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../recipes/add-property.html" class="md-nav__link">
<span class="md-ellipsis">
Add a property
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../recipes/elements.html" class="md-nav__link">
<span class="md-ellipsis">
Exclude or restrict elements
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../recipes/change-family.html" class="md-nav__link">
<span class="md-ellipsis">
Change the material family
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../recipes/add-constraint.html" class="md-nav__link">
<span class="md-ellipsis">
Add a rule (constraint)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../recipes/screen.html" class="md-nav__link">
<span class="md-ellipsis">
Screen stability with MACE
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_12" >
<label class="md-nav__link" for="__nav_4_12" id="__nav_4_12_label" tabindex="">
<span class="md-ellipsis">
Examples
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_12_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_12">
<span class="md-nav__icon md-icon"></span>
Examples
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../examples/perov5.html" class="md-nav__link">
<span class="md-ellipsis">
Perov-5 (the paper)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../examples/double-perovskite.html" class="md-nav__link">
<span class="md-ellipsis">
Double perovskites
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_13" checked>
<label class="md-nav__link" for="__nav_4_13" id="__nav_4_13_label" tabindex="">
<span class="md-ellipsis">
Reference
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_13_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_4_13">
<span class="md-nav__icon md-icon"></span>
Reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="cli.html" class="md-nav__link">
<span class="md-ellipsis">
Command line
</span>
</a>
</li>
<li class="md-nav__item">
<a href="config.html" class="md-nav__link">
<span class="md-ellipsis">
Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="families.html" class="md-nav__link">
<span class="md-ellipsis">
Family files
</span>
</a>
</li>
<li class="md-nav__item">
<a href="rules.html" class="md-nav__link">
<span class="md-ellipsis">
Rules and search terms
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Python API
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="api.html" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Python API
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#pieces" class="md-nav__link">
<span class="md-ellipsis">
Pieces
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#extra-rules-in-the-configuration" class="md-nav__link">
<span class="md-ellipsis">
Extra rules in the configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#3d-datasets-chemiscope" class="md-nav__link">
<span class="md-ellipsis">
3D datasets (chemiscope)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#scripting-the-studio" class="md-nav__link">
<span class="md-ellipsis">
Scripting the Studio
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../community/help.html" class="md-nav__link">
<span class="md-ellipsis">
Getting help
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="https://babu09-meidnet-matter.hf.space/" class="md-nav__link">
<span class="md-ellipsis">
Matter ↗
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#pieces" class="md-nav__link">
<span class="md-ellipsis">
Pieces
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#extra-rules-in-the-configuration" class="md-nav__link">
<span class="md-ellipsis">
Extra rules in the configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#3d-datasets-chemiscope" class="md-nav__link">
<span class="md-ellipsis">
3D datasets (chemiscope)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#scripting-the-studio" class="md-nav__link">
<span class="md-ellipsis">
Scripting the Studio
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="python-api">Python API<a class="headerlink" href="#python-api" title="Permanent link">&para;</a></h1>
<p>The command line is a thin layer over these functions; use them from notebooks or your own scripts.</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">meidnet.config</span><span class="w"> </span><span class="kn">import</span> <span class="n">load_config</span><span class="p">,</span> <span class="n">config_from_dict</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">meidnet.pipeline</span><span class="w"> </span><span class="kn">import</span> <span class="n">check</span><span class="p">,</span> <span class="n">train</span><span class="p">,</span> <span class="n">generate</span>
<span class="n">cfg</span> <span class="o">=</span> <span class="n">load_config</span><span class="p">(</span><span class="s2">&quot;meidnet.yaml&quot;</span><span class="p">)</span>
<span class="n">info</span> <span class="o">=</span> <span class="n">check</span><span class="p">(</span><span class="n">cfg</span><span class="p">)</span> <span class="c1"># dict: report (counts, skip reasons), records, family, report_path</span>
<span class="n">info</span> <span class="o">=</span> <span class="n">check</span><span class="p">(</span><span class="n">cfg</span><span class="p">,</span> <span class="n">keep_structures</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="c1"># records also keep their pymatgen Structure (record.structure)</span>
<span class="n">model_path</span> <span class="o">=</span> <span class="n">train</span><span class="p">(</span><span class="n">cfg</span><span class="p">)</span> <span class="c1"># writes model.pt + training_report.html, returns the path</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">generate</span><span class="p">(</span><span class="n">cfg</span><span class="p">)</span> <span class="c1"># GenerationResult: .saved (candidates), .targets (funnel logs)</span>
</code></pre></div>
<h2 id="pieces">Pieces<a class="headerlink" href="#pieces" title="Permanent link">&para;</a></h2>
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">meidnet.checkpoint</span><span class="w"> </span><span class="kn">import</span> <span class="n">load_checkpoint</span><span class="p">,</span> <span class="n">describe</span><span class="p">,</span> <span class="n">property_ranges</span>
<span class="n">lm</span> <span class="o">=</span> <span class="n">load_checkpoint</span><span class="p">(</span><span class="s2">&quot;model.pt&quot;</span><span class="p">)</span> <span class="c1"># LoadedModel: .model, .stats (property names/units/normalisation)</span>
<span class="n">lm</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">encode_crystal</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="c1"># structure → latent (x from meidnet.data.featurize)</span>
<span class="n">lm</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">encode_properties</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="c1"># normalised property vector → latent</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">meidnet.family</span><span class="w"> </span><span class="kn">import</span> <span class="n">load_family</span>
<span class="n">fam</span> <span class="o">=</span> <span class="n">load_family</span><span class="p">(</span><span class="s2">&quot;perovskite_abx3&quot;</span><span class="p">,</span> <span class="n">variant</span><span class="o">=</span><span class="s2">&quot;halide&quot;</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;Pb&quot;</span><span class="p">],</span> <span class="n">overrides</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;tolerance_factor&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;max&quot;</span><span class="p">:</span> <span class="mf">1.0</span><span class="p">}})</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">meidnet.constraints</span><span class="w"> </span><span class="kn">import</span> <span class="n">build_candidate</span><span class="p">,</span> <span class="n">evaluate</span><span class="p">,</span> <span class="n">CONSTRAINTS</span>
<span class="n">cand</span> <span class="o">=</span> <span class="n">evaluate</span><span class="p">(</span><span class="n">build_candidate</span><span class="p">(</span><span class="n">fam</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;A&quot;</span><span class="p">:</span> <span class="s2">&quot;Cs&quot;</span><span class="p">,</span> <span class="s2">&quot;B&quot;</span><span class="p">:</span> <span class="s2">&quot;Sn&quot;</span><span class="p">,</span> <span class="s2">&quot;X&quot;</span><span class="p">:</span> <span class="s2">&quot;Br&quot;</span><span class="p">}),</span> <span class="n">fam</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
<span class="n">cand</span><span class="o">.</span><span class="n">passed</span><span class="p">,</span> <span class="p">[</span><span class="n">r</span><span class="o">.</span><span class="n">to_dict</span><span class="p">()</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">cand</span><span class="o">.</span><span class="n">results</span><span class="p">]</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">meidnet.generate</span><span class="w"> </span><span class="kn">import</span> <span class="n">Designer</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">meidnet.config</span><span class="w"> </span><span class="kn">import</span> <span class="n">GenerationSection</span>
<span class="n">g</span> <span class="o">=</span> <span class="n">GenerationSection</span><span class="p">(</span><span class="n">family</span><span class="o">=</span><span class="s2">&quot;perovskite_abx3&quot;</span><span class="p">,</span> <span class="n">variant</span><span class="o">=</span><span class="s2">&quot;halide&quot;</span><span class="p">,</span>
<span class="n">objectives</span><span class="o">=</span><span class="p">[{</span><span class="s2">&quot;property&quot;</span><span class="p">:</span> <span class="s2">&quot;dir_gap&quot;</span><span class="p">}],</span> <span class="n">targets</span><span class="o">=</span><span class="p">[{</span><span class="s2">&quot;dir_gap&quot;</span><span class="p">:</span> <span class="mf">2.0</span><span class="p">}],</span> <span class="n">rounds</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">steps</span><span class="o">=</span><span class="mi">200</span><span class="p">)</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">Designer</span><span class="p">(</span><span class="n">lm</span><span class="p">,</span> <span class="n">fam</span><span class="p">,</span> <span class="n">g</span><span class="p">,</span> <span class="n">on_saved</span><span class="o">=</span><span class="k">lambda</span> <span class="n">c</span><span class="p">,</span> <span class="n">t</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">formula</span><span class="p">))</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;out/&quot;</span><span class="p">)</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">meidnet.designspace</span><span class="w"> </span><span class="kn">import</span> <span class="n">enumerate_space</span><span class="p">,</span> <span class="n">space_to_csv</span>
<span class="n">space</span> <span class="o">=</span> <span class="n">enumerate_space</span><span class="p">(</span><span class="n">fam</span><span class="p">,</span> <span class="n">lm</span><span class="p">)</span> <span class="c1"># every composition: rule values + predictions</span>
</code></pre></div>
<p>Custom rules and search terms: <a href="rules.html"><code>CONSTRAINTS.register</code></a>, <code>meidnet.terms.SEARCH_TERMS.register</code>.</p>
<h2 id="extra-rules-in-the-configuration">Extra rules in the configuration<a class="headerlink" href="#extra-rules-in-the-configuration" title="Permanent link">&para;</a></h2>
<p><code>generation.extra_constraints</code> adds rules to the family's own for one run, without editing the family file —
this is how the Studio saves a <em>predicted-property window</em>:</p>
<div class="highlight"><pre><span></span><code><span class="nt">generation</span><span class="p">:</span>
<span class="w"> </span><span class="nt">family</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">perovskite_abx3</span>
<span class="w"> </span><span class="nt">variant</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">halide</span>
<span class="w"> </span><span class="nt">extra_constraints</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="p p-Indicator">{</span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nv">property_window</span><span class="p p-Indicator">,</span><span class="nt"> property</span><span class="p">:</span><span class="w"> </span><span class="nv">dir_gap</span><span class="p p-Indicator">,</span><span class="nt"> min</span><span class="p">:</span><span class="w"> </span><span class="nv">1.5</span><span class="p p-Indicator">,</span><span class="nt"> max</span><span class="p">:</span><span class="w"> </span><span class="nv">3.0</span><span class="p p-Indicator">}</span>
</code></pre></div>
<p><code>meidnet.pipeline.family_for(cfg, need_variant=True)</code> returns the family a run uses, with these rules
appended; <code>generation.family</code> / <code>generation.variant</code> take precedence over the top-level <code>family</code>.</p>
<h2 id="3d-datasets-chemiscope">3D datasets (chemiscope)<a class="headerlink" href="#3d-datasets-chemiscope" title="Permanent link">&para;</a></h2>
<p><code>meidnet.studio.chemiscope</code> turns MEIDNet objects into <a href="https://chemiscope.org">chemiscope</a> datasets — plain
dicts you can save with <code>json.dump</code> and open at chemiscope.org, or show in a notebook with
<code>chemiscope.show(...)</code>:</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">meidnet.studio.chemiscope</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span><span class="n">space_dataset</span><span class="p">,</span> <span class="n">candidates_dataset</span><span class="p">,</span> <span class="n">records_dataset</span><span class="p">,</span>
<span class="n">published_data_dataset</span><span class="p">,</span> <span class="n">structure_to_chemiscope</span><span class="p">)</span>
<span class="n">ds</span> <span class="o">=</span> <span class="n">space_dataset</span><span class="p">(</span><span class="n">fam</span><span class="p">,</span> <span class="n">space</span><span class="p">,</span> <span class="n">lm</span><span class="p">,</span> <span class="n">max_structures</span><span class="o">=</span><span class="mi">2000</span><span class="p">)</span> <span class="c1"># design space: formula, site_*, pred_*, rule_*, passes_all</span>
<span class="n">ds</span> <span class="o">=</span> <span class="n">candidates_dataset</span><span class="p">(</span><span class="n">candidate_dicts</span><span class="p">,</span> <span class="n">fam</span><span class="p">,</span> <span class="n">run_dir</span><span class="p">,</span> <span class="n">lm</span><span class="o">=</span><span class="n">lm</span><span class="p">)</span> <span class="c1"># candidates of a run (reads their CIFs when present;</span>
<span class="c1"># lm adds units and property names)</span>
<span class="n">ds</span> <span class="o">=</span> <span class="n">records_dataset</span><span class="p">(</span><span class="n">info</span><span class="p">[</span><span class="s2">&quot;records&quot;</span><span class="p">],</span> <span class="n">cfg</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">properties</span><span class="p">,</span> <span class="n">source</span><span class="o">=</span><span class="s2">&quot;my data&quot;</span><span class="p">)</span> <span class="c1"># needs check(cfg, keep_structures=True)</span>
<span class="n">structure_to_chemiscope</span><span class="p">(</span><span class="n">structure</span><span class="p">)</span> <span class="c1"># one pymatgen Structure → {size, names, x, y, z, cell}</span>
</code></pre></div>
<p><code>candidate_dicts</code> are saved candidates as dicts — <code>[c.to_dict() for c in res.saved]</code> after a <code>Designer</code> run,
or <code>[c for t in json.load(open("generation.json"))["targets"] for c in t["saved"]]</code> from a finished run.
<code>run_dir</code> is the run folder that contains <code>generation/</code> (<code>cfg.out_dir</code> after <code>meidnet generate</code>); where a CIF
file is not found, the structure is rebuilt on the prototype from the candidate's elements.</p>
<h2 id="scripting-the-studio">Scripting the Studio<a class="headerlink" href="#scripting-the-studio" title="Permanent link">&para;</a></h2>
<p>The Studio server is a small class you can drive without a browser — the 04 Colab notebook does exactly this.
Every method takes the same JSON-like dicts the page sends; <code>session</code> keeps users (or experiments) apart.</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">base64</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">meidnet.studio.server</span><span class="w"> </span><span class="kn">import</span> <span class="n">Studio</span>
<span class="n">st</span> <span class="o">=</span> <span class="n">Studio</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span> <span class="c1"># the published model; or Studio(load_config(&quot;meidnet.yaml&quot;))</span>
<span class="n">sid</span> <span class="o">=</span> <span class="s2">&quot;my-session&quot;</span>
<span class="n">st</span><span class="o">.</span><span class="n">state</span><span class="p">(</span><span class="n">sid</span><span class="p">)</span> <span class="c1"># model, ranges, families, limits, session info</span>
<span class="n">b64</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">b64encode</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s2">&quot;materials.csv&quot;</span><span class="p">,</span> <span class="s2">&quot;rb&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">())</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span>
<span class="n">up</span> <span class="o">=</span> <span class="n">st</span><span class="o">.</span><span class="n">upload</span><span class="p">({</span><span class="s2">&quot;session&quot;</span><span class="p">:</span> <span class="n">sid</span><span class="p">,</span> <span class="s2">&quot;files&quot;</span><span class="p">:</span> <span class="p">[{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;materials.csv&quot;</span><span class="p">,</span> <span class="s2">&quot;b64&quot;</span><span class="p">:</span> <span class="n">b64</span><span class="p">}]})</span>
<span class="n">up</span><span class="p">[</span><span class="s2">&quot;suggest&quot;</span><span class="p">]</span> <span class="c1"># suggested id / CIF / property columns</span>
<span class="n">st</span><span class="o">.</span><span class="n">check_data</span><span class="p">({</span><span class="s2">&quot;session&quot;</span><span class="p">:</span> <span class="n">sid</span><span class="p">,</span> <span class="s2">&quot;id_column&quot;</span><span class="p">:</span> <span class="s2">&quot;material_id&quot;</span><span class="p">,</span> <span class="s2">&quot;cif_column&quot;</span><span class="p">:</span> <span class="s2">&quot;cif&quot;</span><span class="p">,</span>
<span class="s2">&quot;properties&quot;</span><span class="p">:</span> <span class="p">[{</span><span class="s2">&quot;column&quot;</span><span class="p">:</span> <span class="s2">&quot;dir_gap&quot;</span><span class="p">,</span> <span class="s2">&quot;unit&quot;</span><span class="p">:</span> <span class="s2">&quot;eV&quot;</span><span class="p">}],</span>
<span class="s2">&quot;family&quot;</span><span class="p">:</span> <span class="s2">&quot;perovskite_abx3&quot;</span><span class="p">,</span> <span class="s2">&quot;variant&quot;</span><span class="p">:</span> <span class="s2">&quot;halide&quot;</span><span class="p">})</span>
<span class="n">st</span><span class="o">.</span><span class="n">start_train</span><span class="p">({</span><span class="s2">&quot;session&quot;</span><span class="p">:</span> <span class="n">sid</span><span class="p">,</span> <span class="s2">&quot;epochs&quot;</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span> <span class="s2">&quot;batch_size&quot;</span><span class="p">:</span> <span class="mi">16</span><span class="p">})</span>
<span class="n">st</span><span class="o">.</span><span class="n">status</span><span class="p">(</span><span class="n">sid</span><span class="p">,</span> <span class="s2">&quot;train&quot;</span><span class="p">)</span> <span class="c1"># poll: running, progress (epoch, loss, curve), done, error</span>
<span class="n">st</span><span class="o">.</span><span class="n">select_model</span><span class="p">(</span><span class="n">sid</span><span class="p">,</span> <span class="s2">&quot;published&quot;</span><span class="p">)</span> <span class="c1"># or &quot;own&quot;</span>
<span class="n">st</span><span class="o">.</span><span class="n">family</span><span class="p">({</span><span class="s2">&quot;session&quot;</span><span class="p">:</span> <span class="n">sid</span><span class="p">,</span> <span class="s2">&quot;family&quot;</span><span class="p">:</span> <span class="s2">&quot;perovskite_abx3&quot;</span><span class="p">,</span> <span class="s2">&quot;variant&quot;</span><span class="p">:</span> <span class="s2">&quot;halide&quot;</span><span class="p">})</span> <span class="c1"># design space, scored</span>
<span class="n">st</span><span class="o">.</span><span class="n">start_search</span><span class="p">({</span><span class="s2">&quot;session&quot;</span><span class="p">:</span> <span class="n">sid</span><span class="p">,</span> <span class="s2">&quot;generation&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;per_target&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s2">&quot;rounds&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s2">&quot;steps&quot;</span><span class="p">:</span> <span class="mi">100</span><span class="p">}})</span>
<span class="n">st</span><span class="o">.</span><span class="n">status</span><span class="p">(</span><span class="n">sid</span><span class="p">,</span> <span class="s2">&quot;search&quot;</span><span class="p">)</span> <span class="c1"># candidates as they are found</span>
<span class="n">st</span><span class="o">.</span><span class="n">chemiscope</span><span class="p">(</span><span class="n">sid</span><span class="p">,</span> <span class="s2">&quot;space&quot;</span><span class="p">,</span> <span class="s2">&quot;perovskite_abx3&quot;</span><span class="p">,</span> <span class="s2">&quot;halide&quot;</span><span class="p">)</span> <span class="c1"># or &quot;candidates&quot; / &quot;data&quot;</span>
<span class="n">st</span><span class="o">.</span><span class="n">validate</span><span class="p">({</span><span class="s2">&quot;yaml&quot;</span><span class="p">:</span> <span class="s2">&quot;generation:</span><span class="se">\n</span><span class="s2"> rounds: 2</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">})</span> <span class="c1"># {ok, generation, notes} or {ok: False, errors}</span>
<span class="n">st</span><span class="o">.</span><span class="n">export</span><span class="p">({</span><span class="s2">&quot;session&quot;</span><span class="p">:</span> <span class="n">sid</span><span class="p">,</span> <span class="s2">&quot;generation&quot;</span><span class="p">:</span> <span class="p">{}})</span> <span class="c1"># the meidnet.yaml text</span>
</code></pre></div>
</article>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
MIT licence · Anand Babu
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["navigation.tabs", "navigation.sections", "navigation.top", "content.code.copy", "content.tabs.link", "search.suggest"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../assets/javascripts/bundle.79ae519e.min.js"></script>
<script src="../assets/vendor/mathjax-3.2.2/es5/tex-mml-chtml.js"></script>
<script src="../assets/vendor/tablesort-5.3.0/tablesort.min.js"></script>
<script src="../assets/vendor/tablesort-5.3.0/sorts/tablesort.number.min.js"></script>
<script src="../assets/tablesort.js"></script>
<script src="../assets/learn.js"></script>
<script src="../assets/links.js"></script>
<script src="../assets/prism3d.js"></script>
<script src="../assets/prism-tour.js"></script>
<script src="../assets/prism-docs.js"></script>
<script src="/ask-prism.js"></script>
</body>
</html>