diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..8a4060e6e --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/.tox/ +/build/ +/dist/ +*.egg-info +__pycache__/ + diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/index.html b/index.html new file mode 100644 index 000000000..3c1a5aacc --- /dev/null +++ b/index.html @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/latest/.buildinfo b/latest/.buildinfo new file mode 100644 index 000000000..0f461b56d --- /dev/null +++ b/latest/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: de2a298db6f2b712a24eb2c5e6c64096 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/latest/_downloads/61809dd2f584c347a4fa27bcd9733a3c/ethanol_reduced_100.xyz b/latest/_downloads/61809dd2f584c347a4fa27bcd9733a3c/ethanol_reduced_100.xyz new file mode 100644 index 000000000..e04140062 --- /dev/null +++ b/latest/_downloads/61809dd2f584c347a4fa27bcd9733a3c/ethanol_reduced_100.xyz @@ -0,0 +1,1100 @@ +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97079.92222178938 +H 0.16712676 -1.19985031 0.84958249 -32.31755688687498 3.563851157625127 -8.174049461946362 +H -0.93496191 -0.92263607 -0.68150202 17.86555379924605 -17.647712543889742 -2.247843561659563 +H -1.75179348 0.29946017 1.2842646 1.6148356855169894 5.831962772612307 2.769853844560952 +H -0.2072526 1.35456114 1.05486243 -21.083647999402572 0.2463578798837198 1.366230674750059 +H -1.47331516 1.17441302 -0.27787521 -2.450720941229466 10.99517702273905 3.269539860440007 +H 1.05895494 -0.40161254 -1.43156577 3.778165781188996 0.48325765110016383 -17.561866215045868 +C -0.17406277 -0.48797864 0.0185579 -17.64730699309182 -26.137516505005973 40.70575377161765 +C -0.98570278 0.68695664 0.58412528 33.87945752087402 0.4667854109425499 -1.5181841552969568 +O 1.06846394 -0.16863939 -0.50269058 16.361218847951744 22.197838339813845 -18.60943594324097 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97071.22355557927 +H 1.18129132 0.88525915 -0.17645318 -27.778814972997754 -16.056679844240136 0.4671103259093044 +H 0.17896233 0.92701421 1.19442387 -13.164959170725332 -10.483856916572302 -0.031429001017737934 +H -0.96660517 1.58609307 -1.40722389 11.921170448136701 7.472788098006514 13.533977193843047 +H -1.02901306 -0.11620693 -1.33654573 -8.900269987273974 -40.73003345754574 -36.80625240930366 +H -1.95838617 0.69792764 -0.11042 18.531062658632443 6.849600005950413 -14.448614011077895 +H 0.22355605 -1.66335171 0.81210607 -34.42047295768845 -2.9504626906977087 13.92605232138986 +C 0.22927937 0.34043263 0.22884318 40.94204877410036 74.15355464423209 1.1928079041553896 +C -0.98169102 0.72626404 -0.70885262 -12.86924267560005 -17.583691251407604 52.556274187622 +O 0.71408976 -0.94681151 0.42485929 25.739479069237106 -0.671217401904479 -30.389927697341356 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97074.75547467025 +H -0.16287301 -0.64302268 -1.31618949 -1.4368937509139212 -4.617717595577402 -7.7542569532575065 +H 1.27993147 0.23446093 -0.84324063 8.596425874695646 10.635874431455713 0.28941859954705806 +H -0.1512842 1.86927971 0.33956012 12.295078797250385 22.782901099402345 9.304210440212561 +H -0.73139242 1.33792963 -1.27271822 -26.103840373105026 30.45452648467317 -8.16388816139848 +H -1.58192605 0.89916371 0.35305249 -10.598262559501267 -13.243933666604455 -8.122297859832864 +H 0.47292663 -1.9107182 0.44558433 -5.698945668357752 74.12888126571656 6.81448547312 +C 0.28678675 -0.08054401 -0.47353047 -31.90907592514916 -18.33244949154593 5.7980933518807705 +C -0.66671069 1.10165901 -0.21085351 38.260144904919855 -17.6075582716115 -19.038950998690478 +O 0.3402451 -0.87922676 0.65828068 16.59536751434019 -84.20052544172954 20.873184922597897 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97084.36308179732 +H 0.73682143 0.60933282 1.20367749 8.360403611053648 -10.029149092988854 -2.859195973850056 +H 0.20738342 -1.18308217 1.05047296 2.0407233143851067 36.52781214100554 -16.720368468320075 +H -1.69259266 0.49096048 1.31016597 -1.7867738081613793 -3.0917686840676417 -12.043032533806368 +H -1.30606593 1.32318797 -0.23431622 10.218527085764842 14.904553902728708 -4.548910329351389 +H -1.7092088 -0.40667253 -0.34700013 5.456835399462772 21.39971436950768 21.386274273766094 +H 1.35608725 0.56051382 -0.94232262 -10.759968232334986 -15.786771558371951 3.7211443903446346 +C 0.23183474 -0.12985821 0.52582658 -1.8810311656884293 -8.406886610257327 -4.011624299728355 +C -1.18366458 0.38676774 0.31135695 -27.078978965955855 -47.44696261898719 3.2955567742012946 +O 0.8661473 -0.28079091 -0.75703093 15.430262761474282 11.929456965609985 11.78015616674422 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97070.815858336 +H -0.87935395 -0.15919401 -1.2173003 28.413960884487253 6.2791216594134225 10.867167640764075 +H -0.10909584 1.4129564 -0.83407068 5.126507159630815 -36.19018635845313 28.04942052164131 +H -0.93711596 1.02779721 1.56785159 -13.390459644221298 -21.242096221821416 -15.626696389477237 +H -2.14823902 -0.25472395 0.62550138 42.7974756917517 39.80171345125477 5.617811792352861 +H -0.83256198 -0.75066756 1.49935626 29.67605631239251 -15.735554761550445 5.639924983228909 +H 1.1010276 -1.19816206 -0.86612535 -5.798196518311821 27.950386676938763 14.78449545087084 +C -0.16215553 0.3016389 -0.42246818 -35.109086354345806 -12.493087195603156 -33.70964083208191 +C -1.01965811 0.11629742 0.87294359 -43.599586392416356 19.651381322212284 -3.233179029689671 +O 1.12685261 -0.31875228 -0.38700783 -8.116672324788034 -8.021679758212125 -12.389304137609178 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97075.25487945565 +H 0.46401241 0.79285848 -1.38125642 -4.70682137483615 -31.07553503764571 32.86258039882675 +H 0.20788686 1.53876961 0.19087164 2.2375209894493526 -34.36532872156078 -2.195232239287318 +H -1.77791125 0.57126884 -1.11048699 6.646626574875739 -18.12118242807169 37.03804129180947 +H -1.43206998 -1.09946349 -0.58902215 5.950312456342096 26.43485283168084 22.802948590015305 +H -1.94568196 0.23901528 0.70762861 22.580955775175035 -11.2697360987518 -11.816769577377471 +H 1.07884093 -1.25289728 0.08899116 -4.52317919846232 -28.896189242919014 -19.432445554030014 +C 0.16051448 0.47118191 -0.2760352 12.764738638409769 23.461973379919165 17.802866555441277 +C -1.29449855 -0.01470279 -0.19208423 -30.4703571956446 11.606804545412341 -71.95897934980457 +O 1.06572144 -0.39251262 0.48328917 -10.47979547948787 62.2243395861156 -5.103010115593445 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97077.54987115158 +H 0.25646646 -0.70603082 1.24814148 25.60533306334624 -9.730183448196028 25.67883499509554 +H -0.74156522 -1.3041592 0.04132189 1.9597933996002221 -14.406659662450988 -19.598537578914918 +H -1.84240457 0.32768948 1.12246832 28.89598528169901 16.689575067383288 7.743311824997857 +H -0.47651709 1.63510579 0.74587179 0.021935317719065664 2.5973821024456143 15.170045005198496 +H -1.64336372 0.94310841 -0.38378703 15.369311559681657 0.6375246685088788 -12.2664483339025 +H 0.96245446 0.67635883 -0.73651157 12.544386999897918 27.982242573533256 -13.150332068116146 +C -0.0754261 -0.45712149 0.25290407 8.303209090336493 -18.456983232033473 -5.6702191535051 +C -0.96684674 0.68763743 0.471792 -70.0023260043356 16.28405747245279 -12.209402040816164 +O 1.00191441 -0.2721805 -0.67238707 -22.697629893766045 -21.596956727464384 14.302747349962935 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97078.04455198166 +H -1.1674037 -0.04642054 -1.04643286 -8.995476001638263 0.13085535248669564 19.291443130847995 +H -0.41837058 1.37343273 -0.37195045 5.674194025653132 49.386945692183765 -6.007986048762058 +H -1.219334 0.63701467 1.72605327 -15.453309193513965 5.759829278350723 2.8715818746812616 +H -0.76561308 -1.04364447 1.4883918 9.019212581527038 -18.328635891060227 3.437799566198002 +H 0.40770982 0.37763062 1.55269789 58.4627907152519 4.38836320368015 31.402641401694193 +H 1.52310139 -0.22711024 -0.23440265 -14.599510925072318 2.7032059584607047 -10.307704385928474 +C -0.40725086 0.31780532 -0.30939538 17.928248157977105 -69.5107498185939 5.614019536645997 +C -0.49867449 -0.02438477 1.23740941 -53.239294066402785 15.104993234226907 -65.0109467104222 +O 0.7833251 -0.2878298 -0.89285742 1.2031458920392049 10.365194176086224 18.70915282086633 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97068.76923871019 +H -1.08428403 -0.69356513 -0.54554745 -35.84246923879457 -28.521482836241002 -12.256678354299984 +H -0.78964876 1.07738077 -0.63811546 2.030157648860354 -26.99576871729846 3.335871132320825 +H -1.42217706 0.37218923 1.5902626 -39.422326608906026 21.938321403776573 -8.961274551013693 +H -0.31052444 -0.61642474 1.86346364 23.683060227479878 -33.82227367254628 -4.371375131367287 +H 0.14669883 0.96785183 1.6838213 16.755051362289542 22.941345764358054 -6.352047282134101 +H 1.53006956 0.12554468 -0.63059957 55.03825930074373 39.56207917670497 31.67222358677458 +C -0.39506549 0.04273486 -0.23225657 -7.508634282422647 74.58948736318553 -66.90158421240872 +C -0.44644767 0.21672187 1.17279286 8.755502582269164 -12.836229417664123 100.09240462020445 +O 0.75323788 -0.27254369 -0.91542002 -23.488600991519426 -56.855480250096306 -36.25753980807607 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97068.67854993218 +H 0.26198382 1.46392721 -0.13934628 -10.623859692612077 52.16331443757446 -10.520026830134142 +H 1.01269733 0.46978893 1.13741496 -2.6474237506099874 -0.7416563578905433 -8.180387675440166 +H -1.73269756 0.88549675 1.13283804 16.808340974300414 -54.75256536510389 -26.023962281588428 +H -1.63732582 -0.53755268 -0.24255852 4.830134905466793 11.714836400216107 21.414323684801168 +H -1.2017109 -0.82079587 1.52365035 11.305211121180365 -15.437393103427182 7.932433680427791 +H 0.26375071 0.03176322 -1.59627581 30.72177853139709 -27.091460918291833 26.509545327760875 +C 0.29654172 0.50469098 0.28007993 -12.93025672590814 -117.0150255404029 -3.3075964152869077 +C -1.14907517 -0.11796465 0.69799166 -0.7250287751758315 99.01247146400695 -11.417867678065672 +O 0.83102575 -0.38444223 -0.84862332 -36.738896588038614 52.14748016913989 3.593537001704438 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97078.17029374573 +H 1.1854442 0.47993553 -0.77193565 26.32610474096496 8.530332952845184 -34.434138359428886 +H 0.21616322 1.49827007 0.28010052 -0.1484766532384156 10.74455848783508 7.335025337923669 +H -1.54437825 0.79530867 -1.46921135 11.809980751885975 -1.900752555513588 -6.436320026449207 +H -0.93680511 -0.97794427 -1.18058585 12.03003237767305 14.285078616369352 -21.83406520318502 +H -1.69286157 -0.21725281 0.02235908 16.639234592315184 25.789463797991246 -15.117470443278695 +H 0.85485769 -0.10103213 1.66994979 0.6633660807552771 3.3846392086812047 1.3430727755320013 +C 0.3183176 0.49814431 -0.15661292 -16.381375434100985 -28.987519994103184 31.335300996102763 +C -0.96531029 0.09022651 -0.83965906 -43.308067703795864 -41.79295956829366 43.71906023449828 +O 0.60643796 -0.53484957 0.83920365 -7.630797566638138 9.947159054188354 -5.910462940072812 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97071.45070177181 +H 0.58942011 0.56850416 1.45765342 -3.8955727371867783 30.050372583946206 -11.164233600240328 +H 0.19084583 -0.97177401 1.11895344 -16.433661841506474 5.81050889823814 -7.43955664899802 +H -1.91754606 -0.63864157 0.32633664 -9.040807568605745 15.70066909218202 -2.192641220300608 +H -1.74687615 1.20677948 0.04724915 -21.13922861767538 32.74309944181856 10.01874588494748 +H -0.99806795 0.04567495 -1.06048419 -16.49224614449019 0.19569604731200166 -3.9557401112676334 +H 1.44465926 0.56652412 -0.77008481 10.747976024091233 24.700443695114025 -9.1222106259882 +C 0.145305 0.03149213 0.59344123 -7.846686960551824 -58.22913772206091 -4.5464438215745675 +C -1.32273297 0.23833993 -0.0180853 63.51521370499956 -45.942841115481265 9.821041056782624 +O 1.03739242 -0.25161075 -0.50245265 0.585012955104544 -5.02881210688982 18.58103790081821 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97076.24960299351 +H -1.43890599 -0.04261626 0.04499329 -2.7132593492933483 -15.771939308721711 -12.865969809511576 +H -0.27171802 -0.73808196 -1.24139944 -13.732660324371304 15.38494542435936 -9.54886785271553 +H -0.74988007 1.96914652 -0.40386762 -6.557207367218611 10.33089430231479 -8.102914429005972 +H 0.8452757 1.63080645 0.40630284 -32.11911447801918 -20.365647585569633 -12.322531740299043 +H 0.72931487 1.31501129 -1.24821332 8.566391399228651 15.685226144692807 -32.47781585803191 +H -0.2579577 -1.04518567 1.39416107 11.716634104922676 -0.6916265679366358 -2.7739544137399186 +C -0.3767215 -0.16038447 -0.29537191 -26.02847788813369 -20.453599932592187 12.908483865672453 +C 0.07656428 1.25944447 -0.39901712 55.587371523664004 21.84298257745507 34.149249596279645 +O 0.29732708 -1.01976322 0.5872997 5.2803211933997485 -5.961235054001859 31.0343218271729 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97079.28766160006 +H -0.48917455 -1.31430462 -0.63255767 -8.731016563478972 -26.282081134611825 -8.01669930981662 +H -0.79148257 0.47502047 -1.23857661 15.03116283004771 -45.27699429709661 18.36558251740756 +H -1.98997385 0.15442517 1.07170767 -2.8129833418449897 -4.392108026545152 -16.93141259743756 +H -0.46969859 -0.22659287 1.73313304 13.19479324243546 -10.285335057706371 13.78319883155418 +H -0.69232569 1.32907273 0.9843324 2.9708422112037023 5.554965648527851 -4.823010492619126 +H 1.41693759 0.47579588 0.31310839 -15.698182425447404 -7.927455603674379 -9.397874887216336 +C -0.27858835 -0.28003755 -0.43222729 -41.77702687671222 95.59616609009869 -12.282009863496366 +C -0.90491612 0.25323355 0.85648637 -5.611931305783023 -3.7084987947042354 16.530503103093956 +O 1.07837685 -0.03625684 -0.45904916 43.43434222957975 -3.27865882428797 2.77172388435136 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97078.72957415297 +H -0.57660767 -1.28615216 -0.67026655 4.7826249852368035 21.468309373766363 -0.8707626243335791 +H -0.7570026 0.52706622 -1.19368888 13.04329037388625 -26.745785782475437 13.954003309278072 +H -2.05342424 0.33616306 0.81875616 17.183551354923207 -10.160930571712903 -8.787658491588438 +H -0.80510263 -0.44272026 1.68974471 21.356144932615376 -36.110231188568505 52.296913779962864 +H -0.6116232 1.2295516 1.03502202 12.60616353313894 10.895735255596486 19.16950159516821 +H 1.21938944 0.41082614 -1.21379506 22.81022597377798 13.802168410835828 -24.410760657473585 +C -0.29376757 -0.20132971 -0.40779038 -15.257540811118123 -11.070639116678297 -28.541501867148845 +C -0.92128671 0.19647111 0.88363364 -51.98508079099393 47.829125468405906 -38.702152585094765 +O 1.13788557 -0.04525437 -0.38655708 -24.539378365645444 -9.907751849169435 15.892417541230058 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97076.53856544431 +H -1.45666131 0.27539563 -0.23977018 -34.56167341298524 0.4251156593668138 0.7566000747191554 +H -0.18851714 -0.13814463 -1.42816244 -5.292168731475821 8.212236457108382 -16.70000673512978 +H 1.37903252 0.85525728 -0.02389291 56.38207914353506 1.8604974884463852 -8.599294375807249 +H 0.14404508 2.16390268 -0.55387475 18.451463235061787 -31.442998449371398 11.266526081178794 +H 0.2927424 1.62288314 1.07114096 -12.09722929891785 -6.20990884238949 29.89829814965256 +H 0.31242072 -1.01058649 1.09121061 11.265283340722009 8.847045595420663 39.490817260912614 +C -0.40961095 0.09678593 -0.38593292 5.7205453987206445 -75.81393771614704 18.154795711457176 +C 0.39610325 1.21004824 0.07991633 -17.473826117265876 69.85146229333048 -29.368048782119747 +O -0.02035437 -1.21855422 0.23497656 -22.394474743215763 24.27048632841415 -44.89968619904246 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97072.95712505389 +H -1.40103179 -0.13505771 -0.41215083 -68.61142432271208 -10.568292118370783 18.350960158082565 +H -0.27410342 -0.61390244 -1.43780747 32.764226029583874 -23.942336441844702 -42.11568195193304 +H -0.38000352 1.89837227 -1.01944435 -1.7610331907039376 -10.880400217822514 11.256814206807555 +H 0.02660654 1.71996742 0.73190865 2.4427130917021196 -24.80687706314704 -14.875425394541276 +H 1.11514611 1.1749529 -0.68345936 30.292345297599784 10.733784117806135 10.451768599052683 +H 0.25925904 -1.81175512 0.5534934 -1.7364108024933917 -18.966900511902153 -2.4537625722138645 +C -0.36176115 -0.23418256 -0.45732575 18.494538184577685 46.23479144296271 80.6195118960977 +C 0.11360337 1.19645302 -0.27366449 -7.854215738376365 35.06937676496001 -43.07027263768927 +O 0.22743806 -0.86311724 0.69159894 -4.030737363356633 -2.8731459726416597 -18.16391230366304 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97068.123235024 +H 0.12549744 -0.81275685 1.31667603 5.604735743672564 -2.52768191297155 -1.1420440909736682 +H -0.43211239 -1.28015574 -0.37668004 -14.301192738570908 -15.501115569005595 15.64302751693031 +H -1.95687532 -0.12698744 0.68508167 5.816888615468574 36.67666469951572 0.06170775562032321 +H -1.00999307 1.56854261 0.69893193 4.732788484113483 -20.007352942175867 2.799960655111787 +H -1.39264738 0.59538697 -0.77898325 -8.615529451755553 18.474476464112165 -21.385237866171412 +H 1.89682687 -0.56092387 -0.39668988 -10.02648099563412 -9.684526966261796 11.205979244363041 +C -0.11985849 -0.45706087 0.29021524 130.15873361215301 -56.023444169500934 -29.47125671690615 +C -1.10381447 0.534105 0.26175056 -96.29663058229525 27.40833246088755 7.945724362717514 +O 1.09300749 -0.01906781 -0.48670261 -17.073312687151816 21.1846479354003 14.34213913930825 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97076.80985294681 +H -0.55100876 0.46864764 1.32674224 12.90859177538769 1.719394270475412 16.803428117704563 +H -1.48063994 -0.0978245 0.03319797 -2.0455413052972355 -12.024359409786358 1.696685797433996 +H 1.00153521 0.7809686 -0.87854841 52.88033654904399 -12.503771443232566 -28.962483754347385 +H -0.58962627 1.22183329 -1.59806415 10.881510146322084 -1.1610124844342682 13.093877499732036 +H 0.26847246 2.13686265 -0.2659136 -10.24976398377304 10.31098792440637 8.315149122454194 +H 0.52794569 -1.48228927 -0.44396493 5.161418917062268 -17.08134425310009 -61.1317715066671 +C -0.40748035 0.0666469 0.32158298 -56.68168750333512 17.473989760570298 -18.53285680587587 +C 0.04143735 1.14246359 -0.66572518 -20.854275820189617 3.7914031015316243 -2.923305017089641 +O 0.32659315 -1.0985423 0.37341665 7.999413596421073 9.474713719390627 71.64127654665522 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97075.59018707108 +H -1.2984302 0.09349653 -0.88897398 23.79519976638889 -0.4311206571465385 5.433719003981343 +H -0.20631646 1.42827155 -0.37998227 -6.440464471006896 8.281892771203724 8.702278190415853 +H -1.28088277 0.61956854 1.67600591 -46.38939523354865 28.808663791473222 26.699101193693846 +H -0.67936275 -1.18203097 1.5588812 -7.784323445892759 40.001103331126764 -16.80421550287947 +H 0.42137582 0.27026338 1.64237221 -12.023472415643539 -5.618758077548008 12.678803372987401 +H 1.50165855 -0.25831732 -0.31734824 39.56440220013517 2.7492347882035557 36.75211612106555 +C -0.35239584 0.33550455 -0.2927215 -9.37902151839725 -30.66622162954521 4.631270344318413 +C -0.59609608 -0.05046819 1.27183283 92.09247281998604 -42.688318492774755 -59.848138011093376 +O 0.80910883 -0.27525794 -0.94234143 -73.435397702021 -0.4364746391717078 -18.244934712489556 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97073.78594534157 +H -0.75846219 -0.56169814 -1.22063259 -12.333518372295321 -1.0621636278149797 27.29762895126591 +H -0.30803147 1.06693807 -1.12660709 6.268657974498673 -4.444592466065417 22.734494698461162 +H -2.03356844 0.50760914 0.84039349 -15.334106904451707 9.455831890866424 -4.312379348480421 +H -0.88343855 -0.55045125 1.44501545 8.292011382193929 -81.26651246058955 44.19980987408499 +H -0.50618756 1.05407555 1.55373943 19.292636066820823 36.25230559397661 16.708820942968778 +H 1.78728975 0.22241501 -0.66641651 -17.153826378749358 -3.5991530501808944 6.136587155439264 +C -0.29512056 0.13737315 -0.46254404 41.93512765356443 -2.7222502444682837 -28.79055511827137 +C -0.96674251 0.32626508 0.94126084 2.632850009947899 21.075788377506044 -89.3466033919126 +O 1.11746174 -0.45769384 -0.41137608 -33.59983143152936 26.310747172591103 5.372196236444281 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97072.00040455653 +H -0.1623876 -0.29204978 -1.54135473 -16.14689829528264 -6.887712294386502 25.992689808948835 +H 0.01395808 1.27701694 -0.97584823 -20.181940189038247 0.841937686334063 25.14019950112153 +H -1.13453579 0.40057608 1.57855725 25.38964644483151 0.11266367181158554 -18.240702517174423 +H -2.2413265 0.38641248 0.39500765 2.6382253367519057 -12.304776441769064 -21.306546781522407 +H -1.37281935 -1.13865918 0.88505615 5.021086482771552 -3.0773087822260217 -19.738631663175276 +H 1.64828965 0.41912825 0.62695153 -30.963869827155317 -15.001989260660508 -26.841796969330336 +C -0.12391654 0.24248832 -0.53370511 44.923584050593576 -13.507372112842669 8.071637213082193 +C -1.23675744 -0.08723224 0.55098222 -4.303609016020145 35.31195661898943 14.041770668217357 +O 1.22606267 -0.18294607 -0.07397582 -6.376223801631143 14.512602100570732 12.881380739832528 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97072.28636418936 +H 1.18522012 0.75022685 -0.56905675 10.335417023786327 -22.727066715425583 18.202618688443454 +H 0.36007805 0.98931376 0.97492576 -5.444419853105402 29.608455026170837 13.227529018246496 +H -1.6087016 -0.21907968 -0.95537583 29.219598216944355 26.30318756341935 13.502490087594026 +H -1.40063162 1.471922 -0.3566233 -6.278795558625621 11.465387084864036 -9.296975746007565 +H -0.53552669 0.83509482 -1.82974923 13.783947084634553 18.12311057309338 -38.66301574727446 +H 1.20629958 -0.87749002 1.28879677 -44.0813048477981 -12.432126507242158 -33.4294301329613 +C 0.35854246 0.33911769 0.11066212 -4.370485765582376 35.43346651580827 -38.95361661040493 +C -0.83230513 0.66430324 -0.83230564 -46.281872095973846 -61.583971318737106 49.98691896561157 +O 0.40556427 -0.93920463 0.63289974 53.11791460989907 -24.190442221951038 25.4234814767527 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97077.35116156114 +H -0.96895871 -1.15301423 -0.42260045 2.2391408209989385 33.9288623831364 8.69120736512527 +H -0.8296107 0.68455695 -0.8807915 -34.483908454573594 4.731307393626342 -20.214334448387874 +H -1.60691575 0.60881202 1.21545903 13.914501238575426 3.741427859345858 8.608705051632663 +H -0.31842718 -0.4940953 1.77308288 6.488870871948077 21.92679522320411 3.7840261088010423 +H 0.06271647 1.27020655 1.3582738 18.36476430088544 18.122756012600462 -0.2722846712454698 +H 0.94542575 -0.7590202 -1.54296323 -7.301152359728994 14.282291936909962 20.605102801141395 +C -0.43329865 -0.12509463 -0.27172555 -2.270978930277736 -13.735834767312916 -45.03930951234735 +C -0.50242823 0.39572437 1.0970495 -53.52862965847659 -55.734923236486104 41.83784763818973 +O 0.87347471 -0.21317428 -0.71409506 56.57738979900694 -27.26268161920306 -18.0009603329094 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97080.61265769074 +H -0.29628961 -0.32103933 -1.50281619 3.048929712940008 -0.817425579480846 7.210565118341013 +H -0.24729977 1.33316057 -0.77163369 11.214940494011811 -18.54784914136739 1.3154431451474067 +H -0.87933192 0.41591175 1.54130966 -3.41091463143064 7.782760533753408 -27.53786799454944 +H -2.1103935 0.32653284 0.27006689 -41.32792917249999 8.79195590706113 -9.013678354702794 +H -1.22548615 -1.06085611 0.99257887 -5.960152399386359 -39.307644669673216 -13.342788452328977 +H 1.35120045 0.16748156 0.78340482 -1.765106485998834 18.36787352366949 35.09893572618734 +C -0.09294194 0.2107215 -0.53944299 -32.95165453255934 15.955836436620553 23.73338054359019 +C -1.17567506 -0.0872961 0.54222987 53.72195524951654 29.504979095827913 31.372133783629625 +O 1.16695864 -0.14700343 -0.08480363 17.429932951227862 -21.73048729223209 -48.83612351531438 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97067.05713048378 +H 0.85842335 1.22324254 -0.64460321 -19.68772080818378 -3.6380788118549154 -5.086420479152222 +H -0.56571146 1.37254966 0.55200738 19.655894557115452 -6.065408247120153 -0.7996335204984231 +H -1.64957327 0.22926788 -1.49773278 39.70256458191069 -6.506107966680716 -18.236092044945444 +H -0.22974102 -1.09378541 -1.14870795 -23.68935693723705 -5.6554011337074215 -13.582401382099924 +H -1.84406848 -0.55146861 -0.20795875 37.48758012145102 -17.392381556146788 18.953430770634405 +H 0.94222304 -1.13518193 0.39994306 -2.913950074853415 -16.88101994624341 -24.00625931117998 +C 0.0636198 0.66513761 -0.06713187 1.5806816677342819 -50.25073687458468 26.025284472055333 +C -0.89972146 -0.28371579 -0.78908388 -47.681470589152745 42.95929164594274 -17.676648949067637 +O 0.78436538 -0.28923795 0.80321926 -4.454222518784443 63.4298417045743 34.408740444253894 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97081.50076821611 +H 0.42029528 0.22366452 1.44236304 5.600683793156505 -6.376340012093705 -20.94181550148797 +H -0.24677067 -1.20701211 0.73995025 0.9368863775312511 -43.57253781434458 3.651038650072651 +H -1.98016521 0.1283668 0.95041646 10.611188008908654 14.03493796734714 -21.677490578019718 +H -1.00314907 1.55975534 0.29201345 -14.57476521147293 12.240644867929593 -4.9528235084059045 +H -1.61402628 0.30245927 -0.88922312 -0.11234705759215692 0.9167629943713127 10.779427555708857 +H 1.89227045 -0.00039372 -0.26726194 23.454985336491852 9.179381430284428 15.19385036270797 +C 0.06867869 -0.22905465 0.44813384 8.722112233240432 23.36096870063725 19.616758905116193 +C -1.2459771 0.49773686 0.15119753 6.470644802462618 -6.7905579760427335 5.005879513670607 +O 1.04321581 -0.26522294 -0.59281332 -41.10938828272622 -2.993260158088713 -6.674825399362678 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97078.94857833542 +H 0.57753937 -0.26042021 1.41340096 -3.2093214960541494 -5.64193494990281 -9.99642991867247 +H -0.27683424 -1.50087602 0.4811798 -4.834067088057149 -10.149999673305816 -11.701272979085678 +H -1.86274266 0.88068791 1.09261736 27.303231955710856 -22.97658955168254 -1.6671541100907368 +H -0.5846847 1.52003383 0.06669663 9.893867070535391 19.385171612188287 -6.913404293181036 +H -1.74729115 0.32289173 -0.61050185 23.450748397892532 9.262615395362756 23.95436185307776 +H 1.48275796 -0.91336628 -0.6767593 1.2370283568022529 20.567850232964055 -12.594115591306004 +C 0.0637258 -0.45638248 0.41100752 -17.32581074841457 53.0248466308817 49.90424115060407 +C -1.07560329 0.58837265 0.3105154 -53.9455121623172 -18.696042383375683 -27.275570308158002 +O 0.91145673 -0.10226297 -0.65294048 17.42983689972309 -44.77591849895099 -3.7106558031879078 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97076.29748006252 +H -0.25585398 -1.03632636 1.07314394 -4.910975883673188 10.827149737906181 -3.705709743602752 +H -0.7796787 -1.14611819 -0.56945519 -15.26090972871137 -2.352748406363577 -17.365032965350224 +H -1.97674451 0.80225353 0.71465716 -29.820624499461495 -11.680585145107584 -11.916677372191327 +H -0.64576894 1.70500938 1.0187435 17.80463342880064 -33.82768813144482 -8.677284640217737 +H -0.91359612 1.51285482 -0.62021315 -14.932715966763203 3.918310855754357 -28.88038343418956 +H 1.16701562 -0.95816042 -1.11972164 7.052901909454982 17.242594570651935 19.154345616372265 +C -0.26523197 -0.46226433 0.09997404 38.59399266161797 12.298409768570139 38.19111944762128 +C -0.99919583 0.90011057 0.26352082 40.204674416008906 13.198736097415237 32.25902713165941 +O 1.16362647 -0.3841924 -0.30419452 -38.73097515145219 -9.624179347381862 -19.05940404010136 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97075.31703499508 +H 0.20445352 -1.53505334 -0.12321536 -7.5228344894550725 0.5947082279811297 10.777564630844727 +H 0.41599275 -0.46118269 -1.46591408 9.363158790257563 13.069019133133228 40.023909041493994 +H -1.18378046 0.99134554 -1.06359685 -5.969485996843749 -7.56504023214385 24.794425942158277 +H -1.8412438 -0.60614138 -0.80138806 -11.664249274370322 1.453365991071535 4.825474628753855 +H -1.68752775 0.50120063 0.62117719 5.270298633914315 -4.060182485763495 10.668941051338734 +H 0.56513235 0.0296264 1.36828305 8.007113132476315 7.69025819137525 19.62893728726425 +C 0.13261892 -0.43456978 -0.32241402 57.81473714167071 -23.39452862207564 -27.6560896096062 +C -1.19489313 0.14205341 -0.2943211 -53.82201720106644 24.529008360593373 -57.8740827417663 +O 1.01957807 0.28754803 0.55525232 -1.4767207365833201 -12.316607378350485 -25.18908141630238 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97071.50632761835 +H -1.152551 -0.8060532 -0.67457311 -3.332106150498032 22.785911899039533 -0.20621902327907854 +H -0.72916615 0.96278407 -0.73110939 -54.06545796117565 131.4203962153763 -58.059112328764606 +H -1.26416272 0.60009327 1.75935265 -10.045942690650083 -3.7243804959806677 -11.522227045088274 +H -0.25271108 -0.87838936 1.66185737 -5.659518304381041 11.815716568288135 -14.112800163084602 +H 0.40672262 0.71343215 1.53775638 28.79555572562467 18.83424745470889 -3.2558649721312025 +H 0.80594967 -0.27244101 -1.75085457 9.969677795862323 2.8358613872960623 49.106113622834776 +C -0.51099076 0.08440843 -0.37623458 54.30002996567772 -146.72313696732573 101.76862670383815 +C -0.42901123 0.13832744 1.18980734 -24.601850975840787 -27.16966818795384 3.7428555878859027 +O 0.84330411 -0.18742503 -0.7242971 4.6396125953808856 -10.074947873448673 -67.46137238221107 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97071.74686279544 +H 0.2811704 0.48689409 1.44914972 0.05213699395362526 1.7177044754840793 -14.30279596862584 +H -0.44996206 -0.97132634 1.03857698 -17.578701316443723 -42.04597583335375 9.32064591991773 +H -1.83529459 1.21679931 0.50771285 23.162242880551315 -26.385929412763364 -41.12577751541058 +H -0.59785069 1.20040976 -0.8669176 48.97603023984938 77.3960815012317 -74.91499524046326 +H -1.57004511 -0.22645446 -0.79064665 -24.59085367145509 6.214286893693348 -14.63645399395651 +H 1.53072621 -1.21630753 0.08712911 -17.887833005068615 32.8536808118724 -15.295577207007232 +C -0.03789052 -0.12904899 0.53733647 6.615545019424641 57.841145376377355 25.388655098436594 +C -1.14513524 0.62950735 -0.2642746 -38.90730199778986 -68.83317048677468 121.00303184234714 +O 1.05442691 -0.40665731 -0.29476 20.158733671157282 -38.757820954125016 4.56326706476196 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97076.07281804319 +H 0.70759363 -0.22505045 1.36650396 21.767173037949185 -7.719799365286882 5.094686837667716 +H -0.32090961 -1.5615275 0.50151855 19.564332570827208 54.697173292377485 0.5694620979000988 +H -1.62646936 0.62286813 1.28691815 -23.94937784721911 -1.2495529986959046 22.711254977590894 +H -0.47739837 1.63607634 0.4339806 9.479084655768206 10.132328568070141 6.605165527804195 +H -1.4856573 0.61152149 -0.54880683 0.9919594643961319 -4.781996500082131 26.01381402507206 +H 0.66572852 0.5898767 -1.31679964 -5.59933195716344 -25.93636093759566 37.06802477697147 +C 0.11291688 -0.42155443 0.46595932 -27.363872472389282 -18.439773411184905 -46.31086067727779 +C -0.94537801 0.64604905 0.46316414 -14.756783998834035 -1.34486692277543 -46.56275396980679 +O 0.78469824 -0.27406677 -0.80605654 19.86681773248619 -5.357151724826712 -5.188793595921854 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97076.70342360005 +H 0.36418876 1.50456196 -0.23429354 10.735523717281422 11.653969391717787 -6.377198546531408 +H -0.04207305 0.57852267 1.23642319 -1.2595862305707568 23.171447223514633 47.64361799552585 +H -1.40144314 -1.00705226 -0.05008134 -3.4962842602138045 -23.34256357217376 23.748601742543695 +H -2.30105796 0.59875574 0.04136978 47.89248507274407 -15.56139559608587 -13.477090986597991 +H -1.27712028 -0.11432985 -1.45005699 -7.478670956218443 19.646536057416082 28.534908702130032 +H 1.3614194 -0.63316276 -0.79066596 -4.797244972919707 2.050720971628562 10.972795836306481 +C 0.12351968 0.5293684 0.19523905 -49.3664902791308 -34.21581328908559 -8.24755969444299 +C -1.30288198 0.03852862 -0.28853746 -6.820794041087642 18.93362755915703 -52.93947937374063 +O 1.09293017 -0.48483137 0.1486173 14.5910631359367 -2.336528746088878 -29.858595675193047 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97070.68992173839 +H 0.94871102 1.01927137 -0.39721228 -6.525171225825039 10.832719539361822 -12.9303907236864 +H -0.35526747 1.2816847 0.74868743 -17.133355550022785 -0.2229082686882109 -11.813031869438747 +H -1.13887065 0.88277949 -1.56589006 4.135412158777617 -0.7099830777372163 -10.367830256272702 +H -0.27646636 -0.59700256 -1.64931505 40.933161045356464 -61.220392656759905 -55.40435190333961 +H -1.73773639 -0.3660181 -0.66943941 -22.290198383666418 -29.22611548941619 14.467821940389898 +H 0.90034258 -0.12765154 1.65699681 17.014066696024127 31.25316272967145 59.426145804363166 +C 0.03339877 0.53794837 0.01346894 98.55059298055501 0.8377351365450929 93.18076127127755 +C -0.78692802 -0.01136788 -1.00135093 -75.67606704634896 74.45261159724551 -2.219752646887861 +O 0.67014255 -0.52725694 0.85979622 -39.008440674850036 -25.99682951022234 -74.33937043058424 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97074.96846615731 +H 0.22916575 1.41569044 0.44614146 4.8537564607140515 32.45037121573058 -11.274831571788823 +H -1.12284421 0.412329 0.91093328 -7.766929822781977 9.509221111845205 -8.696102434405425 +H -1.10187125 0.81171309 -1.68894883 -27.033960455744666 6.71227007054956 -6.281356932086168 +H 0.46448976 0.1354556 -1.62410292 -5.900263693251444 -19.895211031624758 -6.203255200497303 +H -0.96376857 -0.94121329 -0.97089942 3.6472072622712504 8.722479837764865 -26.420211499219096 +H 1.39545249 -0.09077843 1.34398988 -46.12816360027806 -19.413002832150795 -33.43728263993155 +C -0.23563976 0.46778148 0.22748407 3.3289981135350266 -7.404908143838902 92.32601908928285 +C -0.5341651 0.08521438 -1.12589571 21.68247221223627 -14.926790418993598 -28.91693755377048 +O 0.64708698 -0.52504575 0.77415449 53.316884709120586 4.245569004896798 28.903961114058095 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97070.77977310185 +H -0.73682728 0.55571477 1.26492058 1.7649440285154567 11.517704323616734 42.31004632220977 +H -1.54332463 -0.12344463 -0.17249043 -1.5843162092419547 -6.588446636868901 11.811908896907665 +H 1.21174184 0.8366734 -0.54035481 0.21634119173242186 11.787247376602583 2.0598624660764098 +H -0.0373054 1.01513662 -1.73960243 -16.291344342783837 -11.116577824021611 -18.385133149002012 +H -0.02866895 2.23016823 -0.39262195 8.15338415856815 -44.64332710445215 -11.7424838179164 +H 0.58475551 -1.33138338 -0.57564453 -13.939836305234948 10.47548976326785 49.301509657422 +C -0.57441497 0.16182739 0.30095146 35.70463770109103 -75.40573542236714 -76.15350468775266 +C 0.13210375 1.0796201 -0.67352746 21.364240532900162 62.82171709727252 41.680876948794875 +O 0.36660521 -1.13256137 0.41550365 -35.38804956972544 41.151928426950136 -40.88308145091861 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97073.58174870539 +H 0.32139109 -0.95888158 1.21450186 -5.622556262360105 -7.99055551320335 23.12971699506552 +H -0.39804986 -1.37739441 -0.41399473 -12.338222524386982 -17.570000947425196 7.648575395768002 +H -2.0049778 0.14030634 0.84993496 18.522007729120993 23.270098048019143 -26.83583584692933 +H -0.73508246 1.48899255 0.87678059 -5.382591143738331 -32.20109977353548 -24.13499678727754 +H -1.32684394 0.85840695 -0.79243347 1.6895862868283065 -5.078354524393594 11.044732484274338 +H 1.63384818 0.32923028 0.0934136 48.69816509475885 28.546459784944467 49.12201785471109 +C -0.0957176 -0.59442292 0.28625639 47.236274236183675 58.47762296490213 -75.78490881692751 +C -1.06952916 0.55295401 0.2520727 -48.33824350488921 0.2842128451527074 70.79681661895515 +O 1.03279337 0.00075515 -0.51929622 -44.46441872569615 -47.738381698639785 -34.98611908346076 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97079.94990540271 +H -1.23230092 -0.52594816 -0.70793938 3.73881905304345 16.900110479271806 -4.735394918773798 +H 0.41058499 -0.2190683 -1.43216099 -7.593057626010666 -1.8153615819515858 6.307477012278505 +H -0.92515791 1.57437005 0.73965972 15.441844675635927 -1.932518329708546 -1.0183582125344086 +H 0.89952752 1.66259054 0.35145551 -14.251302875500492 -0.07352446234918522 -11.377737122208355 +H -0.50358066 1.85722525 -0.96413308 18.7405877509893 7.866394120524424 14.778881774036476 +H 1.06998204 -0.60181045 0.69109905 -6.347224547937786 -33.97548768086566 13.924615106281443 +C -0.19384325 -0.1703137 -0.46934349 -12.265933687568301 12.040665634997456 -19.80422535436514 +C -0.12267477 1.35978938 -0.02174776 -35.28030942689912 -33.34599220666296 -12.917338391427037 +O 0.25524592 -1.12910863 0.45194606 37.81657668424769 34.33571402674426 14.842080106712313 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97075.7412684201 +H -0.43288379 -0.38977266 -1.45652075 -10.929427988992087 16.610483175220555 2.085459599187219 +H -0.03413373 1.24986461 -0.64353704 -1.0857780681359588 55.203670664347925 -23.694410906537446 +H -1.75877417 -0.89336735 0.80072799 -4.220411811394258 -8.615614830870904 -10.766924258594043 +H -0.59195276 0.05092175 1.63597937 16.81058336189944 5.19804892919017 13.072900325418583 +H -1.87612833 0.87303222 0.81193323 -14.81790002975213 15.988291172843557 -3.9432427432580526 +H 1.30356268 -1.09482406 0.02770553 -9.869867238374283 -37.03455379211157 5.612704461105374 +C -0.15129528 0.21845165 -0.55981991 8.016450287396843 -88.83941350045097 71.98131310339528 +C -1.18861989 0.04205427 0.73048517 33.61782270844761 -9.553557774954632 -42.93645984751248 +O 1.21939268 -0.18279462 -0.20222241 -17.521470035274127 51.04264477096485 -11.411338547383371 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97075.3805759606 +H 1.13300958 0.46708714 0.76276178 39.72185196123282 3.9675366590387044 34.39794591526716 +H -0.69293245 0.74699225 1.08534275 12.848011735582636 -7.218205363343929 21.045629390829163 +H 0.81821703 1.58546544 -1.18012428 35.55898093030131 14.231561326717543 -16.306336678275354 +H -0.41650032 0.35037976 -1.6594132 7.410297700495468 -9.142977909976416 -10.512705570992749 +H -0.83827834 1.72227388 -0.72785309 -13.193736675882985 19.388088731962796 -2.8594272089541324 +H -0.93724248 -1.35253326 0.02550396 22.6455687923594 6.827087193381678 9.90955073969705 +C 0.13193168 0.27056356 0.51267608 -55.79717884142994 -29.84710388343094 -73.21841023781822 +C -0.02753328 1.02095843 -0.88691866 -35.58814264147805 -28.543183361392853 37.07397166951991 +O -0.01961037 -1.19137009 0.38764867 -13.60565296118066 30.337197792864462 0.46978079490613306 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97077.15740441413 +H -1.35410327 0.15580469 -0.56703182 -6.602135755030264 12.168964357307791 -5.469568745860617 +H 0.00708233 -0.33904867 -1.52004503 15.10660002174498 14.826186547225417 -7.940871982995035 +H 1.41723831 1.15369151 0.62089341 -33.761288081943306 -5.2052018017429535 -20.56218793746678 +H 0.30983561 2.15927228 -0.39181196 1.4950487866787834 37.631969249541974 -35.32297052486978 +H -0.38479861 1.41134009 0.92181054 4.278671199411217 8.358135135391601 22.54921727486414 +H -0.49144906 -0.97018693 1.16530797 19.808796694499588 -13.266597078446104 -33.568420217827324 +C -0.25569388 0.0411337 -0.51850738 -3.6121864093035154 -59.24887148700931 9.032051465998025 +C 0.36085186 1.24940217 0.13458653 21.600285327142043 -30.56254292380333 40.762785834851435 +O -0.04774451 -1.19385584 0.27377376 -18.313791783199527 35.297958001534916 30.519964833305934 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97078.68272671844 +H 0.39011398 1.42051615 0.08234655 4.062562428603918 45.89019540429867 -0.3542747100459692 +H -0.98318679 0.49512901 1.04312591 9.050541973576864 26.19296312550052 -17.47585861453966 +H -1.52198566 0.49669541 -1.6057296 -4.101345891752354 11.115461966416808 16.35224099680832 +H 0.03796958 -0.06017435 -1.86905957 4.826021292256315 -5.2863890396949405 13.485123738367314 +H -1.14365587 -1.06083196 -0.96041214 6.02267244242357 1.6789980907036692 9.281152149962413 +H 0.76708998 -1.24367571 0.27008237 0.2582042321387455 29.24462259848968 17.479382874690003 +C -0.1774532 0.53985604 0.23570948 -10.54396855706397 -84.34928313455599 36.92134701426067 +C -0.71980192 -0.03127981 -1.03826525 -7.062773869667503 -4.183028802901798 -50.55046263066834 +O 0.82808117 -0.38488354 0.79396964 -2.511914050515587 -20.303540208256624 -25.138649633013692 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97083.81604476573 +H -0.54345184 0.22554527 -1.35897672 1.5356512993126252 -2.514372257545083 6.825169720749408 +H 0.95295194 -0.61634154 -0.99714203 3.5922112537743955 9.590012285567644 7.393993846926463 +H 1.0973076 1.11496441 1.13151901 -6.107439674115087 -4.402160231556749 0.6981272389138181 +H 1.27167264 1.68991266 -0.49499664 6.245090967019555 13.474665982557799 -10.404199387770365 +H -0.29732364 1.92211418 0.31727564 -9.885279354516282 7.7562918221733845 4.447160954452242 +H 0.03565761 -1.70729828 0.60264436 -18.22535324954789 17.45140579873877 -5.12651546037814 +C 0.12377619 -0.05006449 -0.49853149 -30.081457696860443 -40.97158876219095 -5.251508113610698 +C 0.5393779 1.23905924 0.1765566 15.598437088116924 -17.549290582847213 9.262469539374031 +O -0.65644585 -1.05828603 0.29208406 37.328138180995154 17.16503594510239 -7.844697152835715 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97075.32409243663 +H 0.63984672 -0.33131149 1.36907014 -31.196741364276637 19.181064536193112 15.369357806702471 +H -0.25640483 -1.52531203 0.54915756 -6.317907494203951 20.403392269481294 -18.52216307167809 +H -1.91048376 0.52203598 0.86645589 -25.55820616331428 4.799350991098377 27.198942552129996 +H -0.58462778 1.48523597 0.19299345 6.8531693273005265 48.0131411784094 -0.7332263560706257 +H -1.59812443 0.46765385 -0.85814345 9.539409744048253 -5.710738658665683 0.5418905727467851 +H 1.30631525 -0.90080099 -0.93371822 11.008949148373672 -33.50607923376815 -16.721481954282783 +C 0.00054693 -0.406049 0.44521938 22.635998030692704 -34.0542688879142 3.000829253828836 +C -1.13115329 0.5833899 0.14340831 14.213468069189297 -44.37343067679443 1.3829697246431465 +O 1.00009621 -0.11542675 -0.5165857 -1.1781392978095768 25.24756848196028 -11.51711852801974 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97075.33980591329 +H -0.59035478 -0.46227012 -1.39894332 -29.308162447626923 -12.801832306566872 -17.31985792676089 +H 1.04726372 -0.05290144 -1.01756608 10.415838221342243 13.996525666186274 -19.836335016663597 +H -1.266036 1.10462836 0.58475976 -24.349030371253377 -1.3140237173546874 -3.57064354057976 +H 0.33866803 1.19167977 0.97332638 -5.648847100783145 15.738377015641232 -29.029155356868564 +H -0.3407366 2.25507134 -0.43184217 6.27164505771493 -23.91972994941329 -5.863964525195528 +H 0.82391963 -1.62235808 0.06344899 -3.406502191316431 -9.497005969244704 18.48767465236026 +C 0.03563742 -0.10910228 -0.60103052 35.74749090207123 33.41684975747847 23.768387166705363 +C -0.3342297 1.2238594 0.03106388 17.457090624835924 6.524527324996764 47.52461492439942 +O 0.22328839 -0.98900841 0.50515993 -7.17952269498445 -22.14368663590213 -14.160721563217747 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97078.75632999542 +H -0.4218597 -1.50359031 0.40978829 14.272654769264657 36.03034716794668 -11.17892592300707 +H -0.89638102 -0.6049117 -1.03968887 -7.944459091660845 2.6080971814222327 -5.739946616863234 +H -1.89764638 0.52891789 1.09144395 -6.882921577358444 -22.197847826382215 14.405292410784318 +H -0.26843664 1.13384141 1.5012187 14.87817175608508 -17.0647783330798 16.951569183586805 +H -1.13991085 1.63496934 0.19748475 14.838511971183244 -16.642499157656335 -16.98043206785981 +H 1.07546386 0.26876373 -1.34163455 -1.1492100075579645 -2.5877081743478674 7.163178523499864 +C -0.30515212 -0.46014292 -0.12058745 27.00947206531238 -22.83088060476677 4.481865193200549 +C -0.87390565 0.65964715 0.72533712 -22.055179324629805 49.494945529819276 -18.78458645510046 +O 1.10862033 -0.24171309 -0.50555514 -32.96704174645936 -6.809675782955197 9.681986937580088 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97071.32482400385 +H 0.87223449 1.36938699 -0.08310458 13.390967175629221 -8.442737537957647 -34.49123682864127 +H -0.46767052 1.27049433 0.75172169 -31.543822883854236 -1.9506851081416785 20.183689275081907 +H -1.19380473 0.88373153 -1.57555647 3.5678865066465333 -17.293023982298532 -10.474405922831306 +H -0.33382708 -0.84121876 -1.65952848 9.286841719343757 33.95244006300493 6.208711163132476 +H -1.73941038 -0.66551511 -0.74011978 31.07859208430371 35.29699155738198 15.052387840959891 +H 0.83915732 -0.31826807 1.66721129 14.363360592757292 19.292350283948608 63.82656050733941 +C 0.09188286 0.60271333 0.10050736 0.8950292662301602 -56.57971875154235 14.885868920498233 +C -0.79588721 -0.00977168 -1.01990506 -21.585323822997736 -7.020015534371034 -7.865676698791262 +O 0.65589797 -0.55222411 0.79346744 -19.453530638058705 2.7443978241546816 -67.32589825674806 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97077.17395477572 +H 0.15744246 -0.24862756 -1.46509026 19.414984339119577 9.94519889199841 36.589157035385625 +H 1.41951152 0.54787266 -0.33690887 -7.670906777716614 -14.875206017647663 6.62119782835354 +H -1.75096534 0.86881896 -0.33787742 42.40017820831588 0.8738149277073964 16.678434278650958 +H -0.5627215 1.74961909 0.82150008 -1.2155638100386674 -12.93218842839297 -2.563639564566059 +H -0.51855349 1.93730029 -0.90009013 12.85232219508684 13.28849800735482 -16.460153083686382 +H 0.0610869 -1.94015008 -0.0429981 6.213071427120636 30.939409896428153 6.5095670066735 +C 0.38565861 0.08835367 -0.34745837 -12.661631498412323 -57.93889853434964 -48.26566532773517 +C -0.62123573 1.17026114 -0.13897164 -62.673765762757725 7.210505827288686 18.50400933727647 +O 0.25201761 -1.12856321 0.50763064 3.3413128651034394 23.488865429612808 -17.61290751035248 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97079.1941788951 +H -0.63854946 -1.4502277 0.00411815 5.449058785039502 19.397746058565893 -10.573604596659326 +H -1.03935304 -0.01623638 -1.1465249 9.419505448926438 -13.45761031844528 8.980908190081408 +H -1.83337743 0.59750783 1.15624086 13.775332094731374 -13.538209389158178 17.933910453474375 +H 0.06119363 0.35656169 1.70195674 -12.925658111889625 -1.778543024277282 17.96745377341811 +H -0.55321399 1.67721235 0.61080899 1.3181989932595868 -35.34513589187188 10.808905881105021 +H 1.049407 0.26472123 -1.3600019 6.590782704330602 28.220177566523333 -42.224368379954505 +C -0.39517144 -0.36875522 -0.27953343 3.770609729480385 18.905097890598107 22.95201696795595 +C -0.7277338 0.56895756 0.96541163 4.57647948286261 32.511259569007734 -66.64944308328099 +O 1.02899035 -0.24044476 -0.57578097 -31.974309126740874 -34.9147836467635 40.80422079385995 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97078.86656147918 +H -0.32874242 -1.31270307 0.58070067 -10.916646023931335 -41.937681912098704 22.86415830079608 +H 0.95377866 -0.90132411 -0.76256762 -22.887246236572388 -5.674319722684067 33.78326253175691 +H -0.4032399 0.86868266 -1.40547463 4.19147422039532 25.97742354879556 -16.10834725305933 +H -1.1650723 -0.72983822 -1.68422254 0.7979235665492993 7.001170466299277 0.7270007955762426 +H -1.84694523 0.33190197 -0.39439589 21.987579224229176 0.9198674738711781 -11.445938433879581 +H 1.34140157 -0.05791176 1.37570328 -24.31131889033102 32.03462235681045 -15.55066154397251 +C 0.10011178 -0.55892439 -0.02060825 82.82112148097336 48.16158700030061 -17.294790855657887 +C -0.87370712 0.03547077 -0.92285269 -66.20221897632231 -9.233747767805566 -1.6771624397236113 +O 0.67194693 0.50633313 0.8525362 14.519332820830947 -57.248922629309796 4.702478898163688 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97077.06321855407 +H -0.51690481 -1.25939185 -0.53308767 -6.675506060643397 -0.2344498649342735 -20.697761671897695 +H -0.74036841 0.38447041 -1.27304352 -20.851850816149426 27.305641544077442 -38.744575333035066 +H -2.01462622 0.23626383 1.01287222 -19.445111308628203 -2.6213582181857915 -11.922125034079173 +H -0.58935456 -0.38203051 1.69411082 24.787896811475978 -42.78056944109104 35.59308040031588 +H -0.55064021 1.18992583 1.11848211 -3.7252912065444175 7.677748965155204 3.235923019591386 +H 1.40361902 0.02463999 -1.32756327 1.3870762229273461 -1.5658612762945108 24.22369738738046 +C -0.35714821 -0.16089479 -0.46433633 64.17430252923994 -61.30929958972492 66.90812164383834 +C -0.93782315 0.17814203 0.88675743 5.870186528226771 65.48530240292592 -26.453337410154447 +O 1.16158583 -0.02525599 -0.3606908 -45.52170269990458 8.04284547807198 -32.14302537360179 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97080.05478392445 +H 1.20766415 0.89737993 -0.14991931 6.832443547048942 17.85036580328185 -5.150196306677726 +H -0.04465484 0.91170787 1.20029637 11.844004329353565 10.451263439286851 13.124310411070672 +H -0.93602243 1.59714153 -1.1085637 -9.72690465300232 -7.527946563986746 -10.968373909623901 +H -0.88484989 -0.27107394 -1.35925454 9.922914942891659 1.4804477721326241 -27.696319774431426 +H -1.86188341 0.36432271 -0.19276935 -27.475744015741775 4.083340384981552 26.725163168654905 +H -0.06826169 -1.52352894 0.49256908 -36.64238972798626 -9.450139949842988 5.796944291286665 +C 0.28306741 0.4817716 0.24196931 -30.98248128848091 -64.1473345869993 5.72815125491321 +C -0.93113267 0.57435894 -0.67385014 30.4850127579589 17.252026591256186 -8.364109301824115 +O 0.64947919 -0.91741049 0.39462146 45.743146479600306 30.007975924068937 0.8044301666317143 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97075.63016884662 +H 0.32973211 -0.9261719 1.18425647 -12.092578508773284 7.408706328650999 4.661556213847276 +H -0.4667496 -1.52154482 -0.22528309 8.532498262076183 12.967962277725263 -15.050368387717619 +H -1.99777326 0.36327012 1.04063464 1.384644103960874 -9.554151871298952 -26.54664492502321 +H -0.78749684 1.45541738 0.70014034 31.78606596470643 30.516752444090834 22.99558403320616 +H -1.39494573 0.9183447 -0.6717176 -29.193625178561792 0.4694890829286819 -47.704098426363 +H 1.66523816 0.34186878 0.10057928 45.48208323291833 30.923085883901358 56.898944148915476 +C -0.04593383 -0.56514825 0.19050505 -5.98332690009907 23.862008924151468 27.167632133216916 +C -1.17151496 0.5545459 0.2890507 18.39011122575543 -49.89423756425539 50.91120718034429 +O 1.08094473 -0.03189909 -0.49410049 -58.30587338780415 -46.69961550589426 -73.33381315624733 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97072.20394556456 +H 0.08084915 -1.47936652 -0.20012264 20.909472232443342 -30.225705712246867 13.351673809430771 +H 0.58214575 -0.19537332 -1.4073444 -0.7140243558638557 -14.103765392530944 29.598047074845276 +H -1.17784604 1.13631722 -0.65841558 -21.956303194126445 -6.046974658951547 -6.515223373065538 +H -1.84044644 -0.59426139 -1.07445273 -8.22439823776179 4.6935425507568915 -12.33560778897934 +H -1.63969684 -0.03432003 0.55309411 -38.57465903527503 -3.9274867390125547 73.95175043270932 +H 0.76678499 1.13557114 0.55223484 -20.031740537819196 89.18235769039715 -7.968314253654275 +C 0.1616579 -0.42100568 -0.34422485 36.52150950214314 48.05787627739046 -20.188617547351363 +C -1.27553583 0.05281625 -0.39843875 53.76922563389512 30.316750680558815 -40.24378753740828 +O 1.03949511 0.27828438 0.69831756 -21.69908319345633 -117.94659351054038 -29.649922002347612 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97075.66845012736 +H 0.60349933 -1.14049315 -0.97059366 -9.614878952913779 -0.4796800290027251 -1.0973149210978352 +H 1.43228074 -0.40233195 0.44204846 -8.398859787593237 0.5322379894278753 -15.231201354032175 +H -0.23021174 1.41539434 0.41400194 17.356491496351932 19.49263308706866 -46.05683290686499 +H 1.13421402 1.54805588 -1.04264516 -18.058867532075535 2.1343711598942305 19.039332833067466 +H -0.51848691 1.11915456 -1.41695858 -33.73851083128119 1.8280012484867527 -18.743502499121718 +H -0.51820607 -0.0901356 1.42095404 0.8423669535529138 12.435202527036907 20.276037460724012 +C 0.46824777 -0.37850595 -0.17650672 18.93385879426111 20.879100983799127 21.873371613414985 +C 0.18638143 1.06636771 -0.62167023 50.59275256665143 -4.525428700987624 33.62558509301832 +O -0.61138242 -0.67079438 0.67183852 -17.91435270695364 -52.296438265723204 -13.685475319108068 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97074.42173834293 +H -1.04779077 -0.54559328 -0.96381927 -18.990996395568033 16.21773687296139 16.593224735709075 +H -0.64160229 1.22134338 -0.6354449 -5.697991082415281 39.83681968333784 -20.50600136463919 +H -1.52218628 0.54375771 1.51258913 -30.39244045213899 4.352637973010765 10.121550640578056 +H -0.42722189 -0.86763218 1.61636064 1.0312516447735371 -24.988961070665702 6.966374919330385 +H 0.18993292 0.82533659 1.73002766 -13.131089749993794 -19.07878747092825 -18.752372440549905 +H 0.964214 -0.59166032 -1.65920118 -11.123514877143922 -1.0094835278220349 -16.370223972979236 +C -0.47375872 0.21148289 -0.36846255 69.79797702084693 -87.56326372150201 27.41545924537731 +C -0.57726405 0.12296065 1.23161765 37.00335246873477 37.71800886721644 -49.03657707666513 +O 0.945467 -0.28804919 -0.7487979 -28.496549762916263 34.515293580212614 43.56856531383864 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97071.33652210888 +H -1.17828303 -0.24002738 -0.85245152 -12.290704303409665 11.429926292288028 -17.009354243185143 +H -0.23432236 1.40270515 -0.6643232 -32.037218119081345 -12.605958386097887 18.97559020853127 +H -1.32726081 0.35122101 1.75023187 -32.72599041575894 23.64741207517852 14.383634575190143 +H -0.6124993 -1.07151589 1.12984199 6.009401919091639 -40.15378490579624 9.761662253697724 +H 0.40239685 0.35283325 1.45649902 22.310895704212886 0.4858617141183857 34.376645011807994 +H 1.52721854 -0.22704925 -0.20038374 46.994822097969525 11.7786169710258 54.64973926469447 +C -0.40777804 0.32252824 -0.31305205 31.696877992153382 15.883504910244195 -36.08380635236721 +C -0.55228537 -0.01257047 1.12590978 20.66540061553737 18.408513982576824 -13.548247364317218 +O 0.8102856 -0.26857257 -0.77522925 -50.62348430489379 -28.87409265353762 -65.50586335405204 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97077.1215466842 +H 0.18483315 -0.79998572 1.37581788 2.6747901287222478 16.945630591785683 -26.134700180020417 +H -0.2800883 -1.4575869 -0.2396851 -14.236333070608858 22.764014527593957 15.411876606147539 +H -1.97765082 -0.01073992 0.70319117 -63.75209213143716 -33.490278168322874 14.643928224012909 +H -1.10855244 1.39996044 0.95666692 10.617846394085026 9.595839410190386 -1.6283255857425323 +H -1.37644839 0.9110235 -0.81592378 -7.02601697468762 -8.728829909469136 28.394941500721654 +H 1.47580154 -0.8299126 -0.94802541 -8.519202836502275 20.993798338705545 14.269592979322466 +C -0.0218653 -0.45663059 0.27594018 1.8984579917885152 -28.148820785047242 -7.2261859389872045 +C -1.23347746 0.555692 0.26462618 80.21249068008018 7.366341685941985 -44.68955515213082 +O 1.13648796 -0.0248645 -0.47081869 -1.8699389956190091 -7.297696877199349 6.95842873249746 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97081.69727600068 +H 0.65778463 0.7504493 1.08283553 13.923622574065483 -3.761710142526034 10.872882112387392 +H 0.26095734 -1.09295346 0.89084711 3.2485306689582965 14.795282864931298 18.743725433478467 +H -1.66381397 0.40649387 1.36441896 -10.439596146009855 -5.950426295162565 25.69137386684175 +H -1.38104348 1.3617273 -0.03647131 2.0436190893807797 -13.733742978986802 -1.7641625724457808 +H -1.85591195 -0.33235023 -0.22644039 -23.557860055564177 -31.229727348328492 -24.14259434272278 +H 1.3955707 -1.02558886 -0.66863448 13.1443519725784 -16.991927417085055 -4.178604504577123 +C 0.23451113 -0.05579605 0.46108579 -25.747554510564107 -24.38832610909392 -11.333204798626248 +C -1.26955347 0.31101524 0.36781679 45.51798752256573 52.60321254210756 -10.909429117042036 +O 0.93988395 -0.19595667 -0.77386425 -18.133102301231606 28.65736488414402 -2.9799860772936424 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97077.94200109526 +H -0.45993606 0.53402157 1.21825111 2.055719207339767 18.02885677302947 44.03761920044324 +H -1.48280602 -0.18809392 0.15114829 -26.66377558471715 5.288198602611974 -20.985828435451687 +H 1.17337741 1.41153395 -0.40397169 -6.4572841567311485 -11.449867059006799 7.437470789777141 +H 0.20648339 0.70667795 -1.64687112 -4.154803890351835 -3.918268166196682 -35.01841847712666 +H -0.42854416 2.13993592 -0.62661878 10.791188528848531 -42.41728842019654 -5.968030994419632 +H -0.0017625 -1.78479006 -0.28631828 15.329156101582365 43.376745715527804 33.841917984003416 +C -0.44073403 0.0939831 0.25249501 -9.454989957923374 -16.805706079934982 20.53163288656035 +C 0.12501083 1.09463343 -0.6515594 7.065879534988415 75.34272682105876 -9.80920774855911 +O 0.29951958 -1.06999632 0.40002016 11.48891021696443 -67.44539818689302 -34.067154019406 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97077.47374860542 +H 0.22230434 1.63279834 -0.15974204 -6.7336468665557 -24.838079572344885 5.887664344631858 +H 0.86136683 0.38653415 1.08504484 3.26133990790312 21.425931687025834 -18.498426491789317 +H -1.6079922 0.4160262 1.4284607 -9.004904464779376 26.03793006769573 27.813330666199658 +H -1.78430521 -0.32706435 -0.07518617 -4.978586656463231 -6.323356341912844 -15.302179858594418 +H -0.65434643 -1.00368665 1.13886289 -9.225700786183683 -17.572039373804213 2.627721333921574 +H 0.3851677 -0.45708898 -1.65801255 -3.500139364436136 15.130229877739561 29.18676283216541 +C 0.20396215 0.52268148 0.16557202 33.128925292450056 16.968754102193394 9.011127653631666 +C -1.03339174 -0.08745732 0.68276145 -24.845436406117678 -17.33047576841169 -6.724064246678537 +O 0.78498604 -0.36760871 -0.74768281 21.89814815836158 -13.49889467818089 -34.00193504766684 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97074.79026775256 +H -0.66839451 -1.32526024 0.31144014 11.355826706731268 1.7980248782510373 0.6426806184192744 +H -0.87718169 -0.32777313 -1.1069155 -7.953127443511119 -4.87213787275661 -10.664137290279164 +H -1.87231135 0.42121703 0.67584253 -5.25865149959511 20.73982511606089 16.684802137670925 +H -0.29697804 0.7437043 1.62179236 -11.657677454130345 1.1866179182924033 -2.739716202662906 +H -0.70437341 1.78936486 0.17239648 -3.011550261910687 -36.03673518592444 7.806112907623098 +H 1.27734375 0.5364417 -0.36421264 18.22854666562625 28.214510527741876 -1.444116586908452 +C -0.33511742 -0.3545037 -0.14110857 34.91203017029341 -84.82597608034244 -82.13084793485083 +C -0.79963523 0.70824522 0.61686918 -33.70787395872255 100.18660268667918 62.62536529092177 +O 1.04972802 -0.38141938 -0.43970183 -2.9075229247811185 -26.390734359643982 9.219855874245242 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97062.45127046404 +H 0.94936465 -0.07328943 -1.28688645 -9.361489154224023 -4.016760090680958 15.25627435424041 +H 1.2790073 0.62100685 0.46435163 -8.817079897574368 -2.8460381035175466 -42.74423588422478 +H -1.30689461 0.81313694 -1.10847023 -12.358832094176005 13.881132234325534 -39.92578234989206 +H -1.54448979 0.86908055 0.44518307 7.7715972144211936 -11.900328457422553 28.64352042342556 +H -0.50368424 2.06107284 -0.1129081 22.930107738299906 80.71344789612114 -3.3443675401193493 +H -0.39195374 -1.0098784 1.22345858 42.977189242998314 10.939728030602414 -57.112039748443486 +C 0.49536812 0.06768304 -0.2588323 23.49815989497566 107.1332763751422 62.53463930847134 +C -0.71967563 1.07480733 -0.25068209 -10.272505659803759 -98.20707841068543 -16.484652146508086 +O 0.26399751 -1.06446508 0.40613246 -56.36714847073796 -95.69737828806375 53.176643583050456 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97075.01578016269 +H -0.35171013 -1.23860944 0.78162995 -6.311550307573401 7.560142791221601 -6.591160981244452 +H -0.89992207 -1.02311007 -0.84587513 -13.56068899873761 9.262253719943558 -23.93480884984121 +H -1.89754411 0.72374154 0.53332201 -71.5467654234242 4.3027718263612815 10.279454571136537 +H -0.4650338 0.94976103 1.47013556 21.498811062725697 14.786982117605454 47.92447852457996 +H -0.61124975 1.68462544 -0.21108913 -3.8796436030684838 -15.85352498254534 20.979511566736722 +H 1.3837502 -1.1315658 -0.80640858 -2.150584891063697 16.687119231995883 7.741795159879322 +C -0.37693312 -0.48054372 -0.06296617 87.8698707971188 -5.934463958054966 41.049743855726895 +C -0.8711212 0.83819434 0.51595406 36.93211782682648 -6.729003191337415 -90.47395990340371 +O 1.11587196 -0.26636686 -0.39812335 -48.85156883444568 -24.08227992683215 -6.975052757749031 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97080.41161192645 +H -1.20407843 -0.20290366 -0.79603625 -22.746231955179912 -17.52804897044038 -1.5566640482574756 +H 0.43397888 -0.27202614 -1.43539997 -3.1850418101260565 4.047994617047062 6.994864269973728 +H -0.92860655 1.4645599 0.79329154 14.30473478603695 6.575678901660707 -22.627123345980326 +H 0.84844528 1.80163696 0.52674691 -25.661347692122078 -21.922777661498404 -26.46634823867718 +H -0.33209758 1.90583556 -0.96052093 -2.096618175235246 11.708313198639042 14.452432354847785 +H 1.11719619 -1.41403487 0.26118847 0.05819298203835162 2.993577958129188 -0.6372958050468948 +C -0.1673558 -0.135456 -0.49191699 48.59513621895048 17.604948279488042 15.467207016179524 +C -0.10821734 1.37290259 -0.00393845 7.626182351124968 -16.510921640152286 24.437779590019208 +O 0.21091472 -1.13587054 0.4737109 -16.895005519666412 13.031235317127033 -10.064851793058356 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97077.30176244091 +H -0.32362113 -0.14867784 -1.44442942 -10.738562976623728 -20.365281166866254 -36.49887810746975 +H -0.2078015 1.30655892 -0.52683109 11.892909960955343 44.35118941724535 -13.563990324531202 +H -1.20843925 0.61122778 1.4919121 -0.835144117558383 -21.972905874599178 -35.265376382459934 +H -2.21425068 0.04831469 -0.02989157 11.447943657269297 1.0931728481822394 15.836104085550488 +H -1.14750356 -1.07564797 0.83200108 -0.6780002982907399 -45.386560604334605 17.412600990811498 +H 1.88812279 0.45175088 -0.12007371 20.875110695977487 39.94781609075799 -7.5181362664686455 +C -0.13024573 0.24891722 -0.48168884 43.57681744250157 -8.743819873318563 63.07373134354827 +C -1.23677594 -0.06797044 0.53608207 -3.582538511497695 44.67576168171737 -4.061962403154364 +O 1.22860223 -0.21112121 -0.05360185 -71.9585370385542 -33.59937251878435 0.585907064173642 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97072.04683958241 +H -0.26223934 -1.16456176 0.96429273 -9.812145027291411 -3.723703392163088 -27.844688517954605 +H 0.67303201 -1.25327519 -0.57727123 26.07246829149752 -16.932119346781306 -13.164450453496361 +H -0.55284942 0.87162542 -1.43118601 -19.561102394296405 -30.571701019745827 8.142965534853168 +H -1.87018062 -0.53204901 -1.19269248 1.857269683557678 -11.474513163638276 -13.907219111528569 +H -1.49502798 0.57640511 0.12523856 -5.746635833386819 3.0394953206936637 -31.520281964438144 +H 0.35906334 1.30071322 0.69329978 24.04142009103121 -41.27184458028242 -1.8068141838480596 +C 0.052593 -0.61427347 0.01767353 24.151754810307374 24.41551817151234 60.62468359581549 +C -1.03021735 0.03379804 -0.78466766 -0.5205232633090164 63.96546165562693 49.24627174143164 +O 0.93216962 0.44833828 0.66513223 -40.48250754393117 12.553406354777971 -29.770466640834563 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97074.18483795549 +H -0.70867413 -1.40105061 0.36126964 -0.3993940150461168 13.788448461327254 -13.351633491515187 +H -0.84443345 -0.21691877 -1.13109474 -9.174326275162988 -28.10274096499939 -14.936301889607966 +H -1.45680497 0.82080782 1.38907349 -29.347000458543498 -9.989709870801677 16.165042543115888 +H 0.0971519 1.30590196 0.98460507 20.797135847240604 -0.1775968606785224 7.040655935507269 +H -1.08668125 1.54583618 -0.20493662 -10.682479570227185 7.801067239070033 3.1687865752199604 +H 1.07107163 -0.70961398 -1.22858278 22.626509090678216 -2.685651063687592 -3.476415828578874 +C -0.40353262 -0.43389323 -0.153513 37.61038493485268 0.7375913633429729 17.593362807863258 +C -0.77760086 0.81788597 0.56113286 5.874128197385501 33.18187575964162 -0.974433029328136 +O 1.07109419 -0.37308745 -0.31672977 -37.304956565356164 -14.553284063214692 -11.229062436855166 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97076.05161293995 +H 0.01817897 -1.49328493 -0.05659591 15.127081522860975 41.824153776744176 -13.791556498290259 +H 0.65538253 -0.36167884 -1.32732693 6.166437828644045 5.953784540366392 -6.524324549597804 +H -1.43782167 1.20853277 -0.59925378 11.72806186234827 -3.815076832904931 4.884736035555147 +H -1.65486803 -0.39125619 -1.16463474 -33.56859334770012 -32.30472986061446 -42.80517641362798 +H -1.65917584 -0.14666268 0.55294852 -18.895712117014668 -0.1857422654472683 19.326644228614807 +H 1.07995846 1.14972804 0.49569935 -3.649023940114564 -41.48209895258289 9.656374388795673 +C 0.18310152 -0.32337916 -0.32020968 -9.283677948791562 -99.38828542754241 -26.71167801171355 +C -1.20426899 0.12925156 -0.38454741 -13.39114623460725 53.45647719107826 17.16551738844729 +O 0.95541656 0.14781761 0.66130335 45.766572374374874 75.9415190167242 38.79946461763773 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97067.70316401367 +H -0.04255421 1.56668821 0.01788702 23.76461981324048 -43.00587069665119 -5.752008788548732 +H 1.05471751 0.56116134 1.04669377 -4.510327269959821 -14.334439603253005 -12.339952637293894 +H -1.55880033 0.81087197 1.29496247 1.38733947519968 -30.874060484373874 3.810280186771639 +H -1.58161361 -0.47022324 0.01190296 -50.482966882519825 2.3810812286287755 -70.70433562135582 +H -0.97167669 -1.04636994 1.19406116 9.662550144806099 -38.225830801295864 61.0300565205783 +H 1.59856528 -0.06954515 -1.16356329 -0.6530103055557638 2.9430335218410786 3.7993279435857117 +C 0.26468631 0.40615723 0.24422495 -0.2446989162395976 64.51423829119103 -21.615109276044958 +C -1.05550227 -0.07565805 0.80595043 35.30456895386943 44.431513377475454 6.854900626028488 +O 0.6881845 -0.33341008 -0.93968255 -14.228076198661736 12.170335166437603 34.916841046279266 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97075.34194952332 +H 0.47758277 0.61857835 -1.24618782 19.933486963365272 0.139759682725233 -21.931684363379038 +H 0.01664029 1.54355823 0.11271945 7.253285507363992 31.73347242964989 28.584292219613566 +H -1.2254306 -1.25839903 -0.46621365 -0.4299229778895239 36.20764164425833 -17.882865600704623 +H -1.85391827 0.01138291 0.5986559 2.9749356654563894 5.531565841816297 -8.697853892091178 +H -1.65393525 0.58810731 -1.13144594 -21.95023179036811 -20.18045435526692 -7.141136481886608 +H 1.94995213 -0.1962818 0.31692054 -42.65477873029416 -8.16595386166157 12.295445215953768 +C 0.17142476 0.53506911 -0.21118893 -33.697838355205604 -85.1988824106718 -2.5612003306733078 +C -1.27537267 -0.10714728 -0.35671574 30.164210218593876 2.1668970453800265 32.849701196440186 +O 0.97287864 -0.40366989 0.54070151 38.406853498977874 37.76595398377051 -15.514697963272766 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97082.14344648295 +H 0.24758257 -0.92822388 1.25464033 -2.8373958397302963 14.55555372469779 -17.475444762994414 +H -0.41986143 -1.27777207 -0.36595081 -7.548254935229947 -18.935409848189995 -5.4683212621196455 +H -2.00712617 -0.12329668 0.72539153 -4.60297309668461 6.715828719510254 6.054158362851541 +H -1.08242635 1.33706737 1.05063269 8.24479554558348 28.265894525330943 18.76176888652276 +H -1.53627827 0.83996124 -0.60546942 -3.5408711315640513 17.45312761089836 -29.382379429467292 +H 1.6270176 0.67643886 -0.27870486 -2.5018120410200346 14.289533746041238 19.707322430083238 +C -0.03179303 -0.46380235 0.23690787 30.14694466415612 14.99953816855729 3.5059154987538763 +C -1.18846014 0.53466594 0.35732583 0.5587292316077827 -56.38627457839776 9.845240106879551 +O 1.11575236 -0.08631387 -0.55826091 -17.919164768760538 -20.957792068448125 -5.548259830509616 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97078.31061005364 +H -1.13143123 -0.78159051 -0.66933955 -9.376320218053213 17.045209914169646 0.6837171415561532 +H -0.82435702 1.13563553 -0.75330025 -4.883075886089979 -26.791623695029795 -0.11148259404922262 +H -1.4007533 0.32629915 1.67528312 5.499145494403645 -0.547884898137091 1.8253106205321328 +H -0.08917021 -0.89786511 1.3617571 2.5653803498623935 -2.9518121550486818 19.606139877644342 +H 0.34244252 0.81305258 1.59958092 15.537324614661971 17.68217368932351 1.2667746777549376 +H 0.64575001 -0.75087042 -1.44186889 10.501779415869844 -41.90014830433333 -56.31492372602688 +C -0.50973302 0.09957718 -0.36074264 24.554977841512795 36.191272570531765 42.04037282890881 +C -0.40550807 0.14484778 1.20704711 -42.15851736559754 -29.90228725165315 -35.450955004602775 +O 0.84182664 -0.17379744 -0.74695877 -2.2406930607488715 31.175101315998162 26.455046178282526 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97081.29283464742 +H -0.55503521 1.25074483 0.77258784 19.57846400023893 27.25795019322733 7.071199128203234 +H -0.91845752 -0.37536076 1.1280508 5.6556560852324305 -2.0164199120360826 3.498904924726678 +H -1.86949518 0.47977857 -1.07794172 2.0721452004765655 -6.999779498211674 -2.8845156248359727 +H -0.14065497 0.50648066 -1.64202888 -3.3056718277283585 13.024649267034498 -8.980299863884529 +H -0.74248307 -1.05442587 -1.22555923 -16.7455304051068 17.549889422475722 6.586506633636747 +H 1.43908565 -0.08066454 -0.28048786 38.58326809607298 20.133987957557892 -74.24396282664205 +C -0.29593112 0.24552613 0.44090691 -12.258414396312132 -45.42861456192942 5.383881317036976 +C -0.85715351 0.04417224 -0.9389097 17.597919918145145 -23.49461784750962 -17.63053592603048 +O 1.04113442 -0.263342 0.52034481 -51.177835485197726 -0.02704620642969238 81.19882105196835 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97080.45994951588 +H 0.79839708 -0.0201398 -1.30097585 9.734894715213969 -10.92869515158532 -0.400450581598592 +H 1.48666535 0.69434742 0.21900434 -16.516014741547217 -8.861564788314611 -0.44330022511564454 +H -1.59543418 0.39793084 -0.68294729 26.345762096453605 20.830317491765143 0.8534555661591947 +H -1.0388398 1.26253369 0.80856635 5.933171413114228 -13.922769968733013 -11.034489362074247 +H -0.60612062 2.04841865 -0.59915234 -0.8981290024458397 0.7369842229671398 -22.345967547485625 +H -0.38577901 -0.88672223 1.20657831 25.55169244830559 -1.9396640873350506 -32.688599106519156 +C 0.5804835 0.17473059 -0.23576914 -40.713871902502326 -16.79669383998121 14.483079899795845 +C -0.71361016 1.00579263 -0.25916941 -15.79336235174867 4.229258036401514 39.09573251954965 +O 0.1843636 -1.106576 0.39353072 6.355857325156662 26.652828084815404 12.480538837288574 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97075.13594098175 +H 0.49078824 -0.96791571 -1.04088559 -14.624253081208566 -5.2118696734877 17.62331664749909 +H 1.41182304 -0.4946201 0.26541149 30.20461825657608 4.732276209421374 24.812665055675243 +H 0.39722343 1.70316464 0.22821823 -11.402238556672152 4.444781011611818 -26.256690334363114 +H 0.9516262 1.41694628 -1.43920689 12.371098227081509 -3.0782301651791903 -15.710677421814895 +H -0.74853363 1.10384767 -1.00942447 -56.535366672759324 11.776672224509458 -22.99585321458373 +H -0.56867529 -0.2183308 1.64278842 -0.48319480258469666 -30.998617941282355 -65.63736735065119 +C 0.43259933 -0.29110344 -0.1229228 -8.90102416945958 -56.801946358949856 -49.291637697209474 +C 0.24392404 1.04656554 -0.70769184 42.382402750828106 42.35715662074708 80.36071119597254 +O -0.6297815 -0.72742883 0.70878318 6.987958048198626 32.77977807260937 57.095531933654485 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97077.71324869746 +H 0.49859813 -0.45932369 -1.37894857 10.161051525459651 -9.395811558595339 15.029622448508242 +H 0.94271079 -1.17711632 0.34546799 -3.743180502852658 7.215066495033714 -18.467545340095086 +H -0.1129977 1.7865858 0.41510768 19.623653268680826 -26.04256544216669 -22.256152275598946 +H 1.23514027 1.04053001 1.23432935 2.4101836487531836 -1.5618935190727574 -22.120449286673956 +H 1.4226802 1.39157156 -0.57422441 20.276848562319852 23.000294114403054 -9.546260232234168 +H -1.55034567 0.18404335 -0.14999197 30.874671182212847 -33.97839294242971 4.267319334532602 +C 0.34961507 -0.41842834 -0.24944805 -5.929009181240841 42.83706551321178 2.0557168356976736 +C 0.7622386 1.04357382 0.19777522 -22.489173226172127 -12.794690106403507 45.060519107585925 +O -0.98817856 -0.64366175 0.04561086 -51.18504646298178 10.720928631840495 5.97723059409876 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97077.49440896015 +H 0.10798294 -1.01824416 0.95314551 4.554956830867744 -40.1066402184486 60.85015086632215 +H -0.78625538 -1.09558623 -0.56296904 -14.362051446321901 -6.214363972061375 10.692077605777955 +H -1.49128825 1.3231774 -0.32791735 17.057831793389116 -27.922845983132657 28.754920010001523 +H -1.68614547 0.54831726 1.29786745 -16.316780204232312 -3.7714267601814577 24.883085038524566 +H -0.24186487 1.54005516 0.84554432 15.148080041953266 13.883366321177231 23.71583039210126 +H 1.28511348 0.61904733 -0.52745337 -0.3897153436641828 -25.55652941235446 -4.673216392197995 +C -0.18310437 -0.46986958 0.12398291 -9.690179775190694 6.68819553166252 -56.665444126639485 +C -0.93692657 0.76202344 0.56465315 -10.724161180013388 28.869319723825257 -81.54811057033461 +O 1.01792237 -0.34016715 -0.62268233 14.722019283212354 54.13092595533458 -6.0092940093764025 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97071.24635769223 +H 1.26452911 0.98846843 0.02272929 -3.942282228210348 2.704479530264699 2.7069993999886157 +H -0.13996787 0.79607749 1.16535185 -8.92677545930644 32.96382935724426 49.57836092551773 +H -1.64944252 1.06161399 -0.33201369 -28.001399512540257 7.704292383461158 5.07326379464076 +H -0.66181018 0.91604762 -1.7864799 17.445167194212875 20.842440140324015 -3.617294926372049 +H -0.9576457 -0.53006236 -0.98011543 -13.707711835372956 26.815911681705213 11.479962011347169 +H 0.94508406 -1.07166363 1.2974226 -21.88380921026671 1.4543122762666814 -45.49392484188916 +C 0.29393744 0.48785289 0.26384722 25.35184721315171 -39.724592393671394 -30.1442362488858 +C -0.78373872 0.58673033 -0.74870376 -12.737940268578805 -44.151095159671705 -45.08379558890864 +O 0.44318127 -0.94288814 0.40260508 46.40290410691093 -8.609577815922924 55.50066547456138 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97077.18884565901 +H -0.11736089 -1.2824935 0.80036251 -20.07823539523334 8.959540880643639 -13.472746138283433 +H -0.80614872 -0.94471704 -0.91126347 5.576374461702248 -1.5165619521052776 9.062431015389565 +H -1.91107133 0.6431883 1.15354266 7.624383460597354 -1.4512006818405365 -0.456275479006985 +H -0.16054371 1.20034185 0.99554085 35.1583133434512 37.160605383538694 46.67879011667477 +H -1.20811887 1.53955455 -0.34999197 -0.018012621697081167 -24.834190079312204 26.18877599138515 +H 1.66420519 -0.16061258 0.29807546 -7.2436957725605495 -0.7161327456846199 -6.23733332573303 +C -0.24444061 -0.51800912 -0.04047547 -4.7576978410172925 2.535509517699821 19.7206166698361 +C -1.00481844 0.80721275 0.5336446 -4.872302701882079 -32.046313366508386 -81.97619908306513 +O 1.09770848 -0.27989888 -0.49535254 -11.389125747539413 11.908744229389912 0.49194141862404306 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97076.30086570016 +H 0.21366085 1.44388799 0.41498258 -11.89645319424243 -6.828140202471014 10.279015817349311 +H 0.07758629 0.0068639 1.51170609 -19.781035437978826 -0.9582394571164613 24.9862301247955 +H -1.27693386 0.77519698 -1.10269488 0.5930208046318901 5.451358092048761 -21.297032939265947 +H -1.20351809 -0.94012137 -0.87156069 -8.90563582750961 -37.799267254431214 -1.076136157206468 +H -2.14968505 0.32962009 0.24361903 -4.602154880162491 -25.978624785515716 -4.041211720660802 +H 1.08192787 -0.05283832 -0.94962565 13.208587898669965 4.254769790396972 -44.32040075959276 +C -0.00527526 0.33689037 0.48572494 32.53632189682656 -10.341519258891871 -29.085384619253833 +C -1.26545664 -0.01500013 -0.34953945 10.602051257744993 73.03718120727412 40.004784119655255 +O 1.15905627 -0.34017873 -0.05475994 -11.754702517980043 -0.8375181312935743 24.55013732000078 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97074.87457533274 +H 1.19939139 0.60612691 -0.44378665 29.75945866405945 6.290322925019126 -5.168889589655528 +H 0.23565487 1.17764931 0.96966571 6.321193404323939 -18.330031602432015 -13.04145590872724 +H -0.84007523 -0.32318663 -1.43967486 5.668117878610615 27.389043895744383 -11.289054309421132 +H -1.81212831 0.65231854 -0.4564909 -5.7792245673880815 12.289248115164503 11.454874781286376 +H -0.62627298 1.60020833 -1.50102792 -2.188607057100248 -26.3877899659854 12.766890903609257 +H -0.19387662 -1.4623405 0.43898193 -87.32014194725433 -62.35255411513164 -33.112169641062316 +C 0.30580345 0.40327164 0.12150545 8.364001392108879 1.0091669136026065 51.9536517899762 +C -0.78684798 0.66535863 -0.85759153 -24.403338603543233 -38.579137881367856 -28.427749611616527 +O 0.48940383 -0.9441077 0.70581113 69.57853965036198 98.67173052956524 14.86390158561091 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97081.98492358068 +H -0.12780376 -0.69073582 1.3929058 1.847065693452123 -1.0912636762972951 -32.539511755441765 +H -0.70513568 -1.30181493 -0.31139439 -4.943417575864677 14.567231690364203 20.595655364863536 +H -2.00693539 0.72762828 0.55261669 -22.250150835282362 -7.706519355386578 -11.071050596581449 +H -0.70010933 1.74593602 0.67472709 23.74112276920311 6.511388427800999 8.761342750923419 +H -0.97455752 1.15204121 -0.96356693 -16.006669027422973 1.2839335082985035 3.1101500961102 +H 0.97884309 -0.25026564 -1.19869607 -2.234153257677153 8.366552093180006 -52.145222365867255 +C -0.2027327 -0.44872295 0.26294968 11.806272689473417 -3.4823295181380143 9.866667893190693 +C -1.02024993 0.8682269 0.11276854 20.35929514222327 -19.664278311914554 -11.262697065019484 +O 1.14077106 -0.40212862 -0.29128561 -12.319366783925805 1.2152839562716817 64.68466686364316 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97081.44850189528 +H -0.2029091 0.38645238 -1.46244094 -11.939019426529358 9.405765340460073 15.438895538693158 +H -0.03362699 1.54086938 -0.06965285 1.5267327392215295 13.064411032546337 2.615948502571434 +H -0.96741032 -0.31641315 1.59644191 -6.423576007661944 7.905404075492751 -45.135529403706435 +H -2.27625699 0.03668657 0.34594559 5.257879530093805 21.8966480947377 -4.036731688746939 +H -1.28713082 -1.29729915 0.1196794 11.303501167231241 -10.393725030466197 -4.167335647171766 +H 1.58047338 -0.47358944 -0.9004676 -15.890357770072201 11.07044582784771 25.501991130781576 +C -0.06559603 0.47780717 -0.33780286 -20.502288558942446 -28.696919130972713 -21.277015094179152 +C -1.20672863 -0.24624897 0.43431423 9.850822952366705 -13.232109844949314 41.53556999521389 +O 1.15583567 -0.16615721 -0.04911015 26.81630418847162 -11.01992155051739 -10.475793333455766 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97082.72226946542 +H 0.91244197 0.99991051 0.73176574 -10.09710019641926 -10.47386756007617 -4.983005025682673 +H -0.77515584 0.62214069 1.0757103 -27.53716361684779 16.094507535625052 12.391237025915053 +H -0.34027783 1.91347193 -1.14984218 12.6026036983572 -37.31196832520441 -2.100287105553269 +H 0.35712812 0.19129249 -1.8140472 -11.174901246375082 24.005359273005652 22.460887836748793 +H -1.36053078 0.45254761 -1.27932669 10.051525536137236 -2.397487062807782 -0.6598323340365607 +H 0.15409358 -1.1663493 1.53224924 5.606671003620532 -3.1618578228449743 -26.055065181818367 +C 0.01255054 0.37770012 0.38719812 49.67311277042119 -10.956604635736898 0.84973564553617 +C -0.30041801 0.75103941 -1.04467989 -21.881186174111743 10.48089473559802 -20.01959061537625 +O 0.28233239 -1.03725148 0.55048819 -7.243562960603335 13.721023862441518 18.115919754267107 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97073.17085926367 +H 0.96516809 -0.33228187 -1.28895851 -15.23237057358407 -3.24288023167149 -6.447573468180957 +H 1.16606652 0.74165447 0.10405645 44.2106138896401 8.000865041382047 5.926733590652513 +H -0.59194693 1.60894396 -1.2224532 -9.237365707818586 42.24267508527113 -57.804320889597825 +H -1.67219214 0.4819207 -0.23891137 7.231201962014107 3.178226896571539 -20.096319166193215 +H -0.71586916 1.70119444 0.53590091 11.700642122288913 -13.157040257776476 -16.580305215406923 +H 0.85357597 -1.64271032 0.49529441 -10.11086283548551 2.2975674097834604 10.50165016137577 +C 0.4878242 0.05380664 -0.36551985 -29.734570651934476 -3.039692166987391 63.92952416299021 +C -0.69488923 1.02053575 -0.38087709 -23.761756055413066 -38.65646171435018 61.45117121973406 +O 0.15507822 -0.96779591 0.66206512 24.93446666447154 2.3767411235984057 -40.88056158119469 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97076.40244644874 +H 0.31816244 0.144526 1.37647552 20.197481559674316 -13.628781214872555 12.18007431469291 +H -0.23831965 -1.35139007 0.55610218 -18.131069803957818 -34.49819285490033 9.664867239131055 +H -1.88750527 0.05489248 0.82359826 -15.170701950058287 15.413457305602588 -9.512645763027638 +H -1.08996872 1.61655413 0.51238219 9.857210970344465 3.86862139644081 1.8852016983091426 +H -1.60323935 0.66992579 -0.89396567 7.954608533998259 -12.987873398917872 10.626207618284246 +H 0.89879979 -0.28727641 -1.4095421 -28.68583170418748 -4.4453751079561385 -36.74453516711496 +C 0.011931 -0.32288566 0.43166138 26.668916118953938 51.044211240567336 -47.556855027013 +C -1.1671323 0.58135727 0.14491912 -37.146585421305346 -15.28527597957586 -0.3649542143911906 +O 1.09406919 -0.24750278 -0.49363403 34.45597169653795 10.519208613612024 59.822640486950476 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97080.02725072639 +H 0.68660887 0.49559763 1.28837273 4.458615985761906 7.043509020945266 -1.180706600375356 +H -0.98706412 0.75487257 0.83931172 -23.095145568274425 7.397816933980539 7.205162517652934 +H -0.34891056 1.73289186 -1.07261954 -12.32128899984226 14.633395761477459 -16.360334225451016 +H 1.3244467 1.31833201 -0.87915491 19.243054517222514 5.0645361517381575 -2.629753831195359 +H 0.24878167 0.12207148 -1.59131864 -6.569383377724577 -17.331135084913573 -22.378217136667573 +H 0.53472072 -1.56434574 0.44453964 43.69643358310907 -16.056199586716282 4.612290092647347 +C -0.05528554 0.35630236 0.47668388 13.411615877512778 -74.92507471935895 3.8429329551094167 +C 0.32028384 0.90862099 -0.86900248 6.282893756162495 20.088855608526234 23.331659947650742 +O -0.29088444 -1.12980803 0.35567576 -45.10679458810646 54.08429472850008 3.5569662806288624 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97081.30262692962 +H 0.84122097 0.58487809 -1.06724958 2.0668469520405837 3.6626893418549957 11.497837077802851 +H -0.01841708 1.49229195 0.22423053 -1.9308285347172134 -0.4152828312488285 -1.4415836731530232 +H -1.67434931 0.47434361 -1.52266602 19.68129484393253 -12.541365527871312 4.296269969563052 +H -1.00431817 -1.21206056 -0.96714192 3.5789312438740923 -10.357979640839018 -14.93535916187596 +H -1.8617496 -0.12920724 0.15787155 15.877473824401447 -6.1737484153960205 -30.197157070551192 +H 0.48947493 0.03334466 1.61591474 13.76738827954054 -17.257725647205902 -2.8821831148374106 +C 0.16868589 0.46786247 -0.17023061 26.092718557509443 -4.707773589136528 -40.68108750802838 +C -1.11815664 -0.14967249 -0.75779951 -41.200215059965615 23.78302019841978 72.8744486134141 +O 0.91607067 -0.31730321 0.79488673 -37.93361010661581 24.00816729724388 1.4688136818449307 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97080.22268600253 +H -0.44728652 0.60284299 1.22761896 -14.732057258371393 12.506323330124738 15.017574506675304 +H -1.36723221 -0.59332014 0.21072909 -9.632662711148875 0.16210292288431155 6.7106395666105545 +H -0.85730401 1.87175918 -0.634653 0.5836172437327557 -9.905549779485993 -6.665800115377392 +H 0.77340761 1.25954707 -0.76504486 0.18899497257795253 -4.040025899614252 -19.36071168146112 +H -0.65934755 0.53229511 -1.82505309 16.488463375351696 1.5441975115951048 5.058797963693907 +H 0.44736433 -1.69245345 0.30811678 -22.57561958046556 -79.93171078685724 -19.79674045191932 +C -0.45757789 0.02310747 0.30806689 19.03209695304142 -38.58304160425309 16.065119332628427 +C -0.28349811 0.92237506 -0.84485086 -9.57976679172546 43.23932921519055 -9.212181240431976 +O 0.68921331 -0.83464483 0.49609204 20.226933797007458 75.00837509041587 12.18330093376057 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97079.52361119266 +H 1.32841796 0.60740466 0.46938854 -36.88501820067859 8.64238474099675 4.3669437181163335 +H -0.395573 0.70456241 1.3397601 24.105219634977644 -18.304702464877725 -21.369244697716603 +H -0.14215859 0.36128426 -1.83463036 -9.269008156624702 25.175437359340787 43.78366969421951 +H -1.58449898 0.76534057 -0.74038914 10.784598921292858 9.548993549746463 -4.320376525618349 +H -0.12794854 2.04310442 -0.87038397 -22.651948509589833 -41.131066277278194 -2.7714357298370484 +H 0.80230722 -1.39874309 -0.28180011 7.804079224528268 -0.39689667592208433 -10.831591823546553 +C 0.19202305 0.29560998 0.41792963 35.64123896465833 21.10427654232834 6.879894176226605 +C -0.4708231 0.90932486 -0.81513823 18.129729826175218 12.072270137530083 -37.227765544331056 +O 0.21675745 -1.09885714 0.41901807 -27.65889170473919 -16.710698097685466 21.48990673248716 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97077.98210836142 +H 0.53515616 1.44856276 -0.39321143 -35.97655002452789 -35.754503847740516 24.750110623827684 +H 0.05051904 0.93498056 1.25994575 0.7014107773917126 -13.639221183366374 7.266110161982421 +H -1.97309478 -0.40521792 0.43981376 -13.082710622936682 -4.7894956323805085 22.016402976407647 +H -1.86047496 0.85462428 -0.8431842 6.620489893188751 -11.050805073853715 6.051512796096691 +H -1.0991591 -0.809056 -0.97679739 -1.9723287138832928 -3.697947359032041 -14.876205664789904 +H 1.20517966 -0.6375367 -0.85983817 -1.1849340524063035 3.914528086615866 30.92507094833328 +C 0.08839181 0.48271562 0.24974233 17.270833713054458 58.766899265923605 -57.181564436402674 +C -1.32224682 0.02606908 -0.3036841 34.09007356859371 23.330215617616044 -5.560090767091036 +O 1.12412252 -0.46937618 0.12700813 -6.466283352653409 -17.079669873782365 -13.391346638364116 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97076.83197389697 +H 0.92428192 -0.10735104 -1.18993646 -4.674945319283863 15.496320108693348 10.362950602666151 +H 1.16554496 0.84158687 0.41149219 3.129233514212315 -28.08258793631329 -11.756150405477879 +H -1.44273832 0.86893685 -1.0872521 3.075769586507601 1.1307953925261032 -15.426726643113474 +H -1.33822827 1.0976046 0.56000684 -20.078166617612638 -8.666168753727387 50.362468491053676 +H -0.21399735 2.01352619 -0.26493531 -16.00533379292456 14.671583942460526 -19.73032854420734 +H 0.01260335 -1.06267073 1.30230662 -6.384289756389771 9.390336622823423 19.234125284742 +C 0.45441096 0.16143377 -0.19756737 44.24257295266564 -32.88333226714136 25.119978880635774 +C -0.71126169 1.02660237 -0.28345098 -11.730042183496009 38.349026935642904 -35.22262871955289 +O 0.24898312 -1.12199736 0.37800266 8.42520161632128 -9.405972859143219 -22.94369013256708 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97072.4301379383 +H 0.09067214 -0.60372179 -1.25219555 -14.483919461096804 -13.15471604852524 -51.40243592051936 +H 1.42088599 0.20008161 -0.49868276 -25.935373148663885 -0.0017882181381960762 8.615149989020656 +H -0.30699418 1.65664856 -1.24646237 -0.23239483706060388 19.418355628354913 -25.774887685687062 +H -1.62103783 0.92771707 -0.38514777 -20.398978643546037 12.441763674887463 21.77855099089082 +H -0.02730126 1.87499955 0.45147697 -36.936172148984625 0.8032407881220254 6.382649765882393 +H -0.63817213 -1.45237148 0.61663509 27.35448788462689 11.626824762141231 2.169138247158004 +C 0.30854938 -0.08018395 -0.35982025 28.499768081236596 35.05972418164111 -0.25063987968280865 +C -0.58830716 1.24900377 -0.29200858 74.86924389284529 -49.56317648701666 3.1807692968953396 +O 0.27811216 -1.04153159 0.63512838 -32.736662805177886 -16.630229467287688 35.30170282439992 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97079.11397847108 +H 0.68908334 1.36016321 -0.3253272 -18.236788121899764 -21.945522894992262 4.708711573584348 +H -0.51781325 0.94360148 0.95036463 -21.535162406907663 17.485113947807974 -6.055995199652646 +H -1.23695954 0.92309296 -1.52914065 -2.9690492497813197 -34.31962599260573 17.1245520145732 +H -0.33414212 -0.56386899 -1.83414397 -8.474761821140753 1.366230674750059 24.291136216118755 +H -1.80589052 -0.66114936 -0.66458961 20.270555410025818 9.805659771987834 -0.9079938477320819 +H 1.43801575 -0.75217898 0.314059 56.8853973292797 -31.418895450779242 -47.272593563197375 +C 0.00822983 0.51094768 0.09216145 33.359785677076424 4.418261309726794 24.729048070398882 +C -0.89497373 -0.05698301 -0.97189428 -12.014353451795577 35.350524262707395 -51.57526933805389 +O 0.77697663 -0.41961125 0.85500142 -47.28562217903581 19.258253185576134 34.958405259781856 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97077.5697719588 +H -0.07358462 -1.41361408 0.76837459 -5.896811768184939 27.651619064260707 -33.670653407713466 +H 0.6579921 -0.96276222 -0.85884506 11.173845865643653 -18.39241053276469 -13.53458670586097 +H -0.79041332 0.96104929 -1.25512873 7.029889866225649 11.338504232883277 -23.800413821530565 +H -1.72755878 -0.69805505 -1.25084848 24.018205272402916 30.402493842971644 10.114536509087717 +H -1.85703687 0.56278943 0.03888455 4.97591025836117 -4.24147555064411 6.303924292423043 +H 1.3518626 0.04723544 1.30575871 31.587652015555747 -24.01429087712826 47.12794592611827 +C 0.13601934 -0.52326036 -0.0038146 -57.27194297328646 -61.154298549088395 -3.4399779194605125 +C -1.12277104 0.11752302 -0.67112239 -24.693512571096942 -47.952953645370755 22.62768542515639 +O 0.8943263 0.39920067 0.58553505 9.076764034379204 86.36281201488056 -11.728462669862001 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97077.20162940437 +H -1.41126006 0.2054854 -0.6576225 15.030810641196885 -10.222979843794633 8.035393778615465 +H 0.16220686 -0.16736737 -1.53210127 -16.05017680162086 9.301829311551092 25.337311418763115 +H 1.38493531 1.1914507 0.13341306 10.439809593798236 -3.0749039371436204 6.225936399654648 +H 0.07247864 2.09713667 -0.45356733 -23.136072995875022 53.921218246536554 -28.159757612559567 +H -0.0949567 1.24150885 1.1821235 8.501540032013926 17.624903276059374 -13.223277849794615 +H -0.49664461 -1.90761492 0.40455001 -38.42251463753965 -17.793211600480277 -14.5989500317173 +C -0.29652916 0.02358683 -0.4662859 -12.745129901584034 -47.64376978061981 -56.90184941047953 +C 0.29115255 1.26096022 0.11829686 13.597707960168782 -56.49656542229519 59.02199664692039 +O 0.02811752 -1.13201407 0.3193949 42.78402610944173 54.383479750186524 14.263195474776335 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97079.62235030666 +H -0.15148828 -1.35035138 0.76135674 -10.542332124019731 -3.4361323018065533 10.54630581034672 +H -0.80267864 -0.80989527 -0.84154788 -8.861773492818804 -21.493385931437736 -7.229009378899038 +H -2.00591737 0.60652162 0.75241863 3.198767688739862 -0.14800706810398215 12.213688783899439 +H -0.27212242 1.19589523 1.30898753 -25.87911305493141 5.279154345489944 -10.500808228432723 +H -0.96731824 1.41409459 -0.34673324 5.56024729546918 44.48363495575548 -49.665420349292226 +H 1.71603574 -0.16213206 0.17209863 -4.034535548168731 0.9287516451519241 6.978741847024845 +C -0.19971546 -0.52890905 0.02669811 -50.32240078371183 27.678839586384242 2.3269496836748544 +C -0.94799848 0.79560327 0.48240569 35.17158268096209 -63.989531451229794 63.45314783142317 +O 1.01797936 -0.25663016 -0.49599471 55.70955733847938 10.696676219796473 -28.123597185566098 +9 +Properties=species:S:1:pos:R:3:forces:R:3 energy=-97078.09991335492 +H 1.01598992 0.08086265 -1.15841812 10.792056549854603 4.494201289547799 17.181376559123837 +H 1.21715646 0.75364502 0.62585141 3.1501940870311174 0.12272536339155486 -9.91066066819662 +H -1.48522286 0.5531534 -1.07258549 14.251757044961321 -6.1049921394750095 -0.004586755808052005 +H -1.29128171 0.91950758 0.57906134 -19.583789522558984 19.344004648736284 36.11595040347601 +H -0.57219152 2.0532963 -0.80743259 -6.052239704398225 -11.953085635783523 23.698440326453618 +H 0.90730026 -1.55654698 0.90237933 -6.1899064129763 14.734823778872991 -10.984465501225571 +C 0.58286502 0.23090702 -0.12661968 -55.38788914975038 -38.42851489203518 -7.328683566966725 +C -0.78169642 1.03511562 -0.34571802 43.72805824459949 -17.01660909634793 -39.52317357398875 +O 0.16231922 -1.12713673 0.41324323 15.291757677416298 34.80744668309301 -9.244197222867756 diff --git a/latest/_downloads/6e23d4b5b8b5d8d24d6a33d8d8cad88a/model.pt b/latest/_downloads/6e23d4b5b8b5d8d24d6a33d8d8cad88a/model.pt new file mode 100644 index 000000000..b6684a48b Binary files /dev/null and b/latest/_downloads/6e23d4b5b8b5d8d24d6a33d8d8cad88a/model.pt differ diff --git a/latest/_downloads/8364416066e0abf7185cb42d53c97a9d/run_ase.py b/latest/_downloads/8364416066e0abf7185cb42d53c97a9d/run_ase.py new file mode 100644 index 000000000..21f68bf0b --- /dev/null +++ b/latest/_downloads/8364416066e0abf7185cb42d53c97a9d/run_ase.py @@ -0,0 +1,211 @@ +""" +Running molecular dynamics with ASE +=================================== + +This tutorial demonstrates how to use an already trained and exported model to run an +ASE simulation of a single ethanol molecule in vacuum. We use a model that was trained +using the :ref:`architecture-soap-bpnn` architecture on 100 ethanol systems +containing energies and forces. You can obtain the :download:`dataset file +` used in this example from our website. The dataset is a +subset of the `rMD17 dataset +`_. + +The model was trained using the following training options. + +.. literalinclude:: options.yaml + :language: yaml + +You can use the pretrained and exported :download:`model ` +or train the model yourself with + +.. literalinclude:: train.sh + :language: bash + +A detailed step-by-step introduction on how to train a model is provided in +the :ref:`label_basic_usage` tutorial. +""" + +# %% +# +# First, we start by importing the necessary libraries, including the integration of ASE +# calculators for metatensor atomistic models. + + +import ase.md +import ase.md.velocitydistribution +import ase.units +import ase.visualize.plot +import matplotlib.pyplot as plt +import numpy as np +from ase.geometry.analysis import Analysis +from metatensor.torch.atomistic.ase_calculator import MetatensorCalculator + + +# %% +# +# .. note:: +# We have to import ``rascaline.torch`` even though it is not used explicitly in this +# tutorial. The SOAP-BPNN model contains compiled extensions and therefore the import +# is required. +# +# Setting up the simulation +# ------------------------- +# +# Next, we initialize the simulation by extracting the initial positions from the +# dataset file which we initially trained the model on. + +train_frames = ase.io.read("ethanol_reduced_100.xyz", ":") +atoms = train_frames[0].copy() + +# %% +# +# Below we show the initial configuration of a single ethanol molecule in vacuum. + +ase.visualize.plot.plot_atoms(atoms) + +plt.xlabel("Å") +plt.ylabel("Å") + +plt.show() + + +# %% +# +# Our initial coordinates do not include velocities. We initialize the velocities +# according to a Maxwell-Boltzmann Distribution at 300 K. + +ase.md.velocitydistribution.MaxwellBoltzmannDistribution(atoms, temperature_K=300) + +# %% +# +# We now register our exported model as the energy calculator to obtain energies and +# forces. + +atoms.calc = MetatensorCalculator("model.pt", extensions_directory="extensions/") + +# %% +# +# Finally, we define the integrator which we use to obtain new positions and velocities +# based on our energy calculator. We use a common timestep of 0.5 fs. + +integrator = ase.md.VelocityVerlet(atoms, timestep=0.5 * ase.units.fs) + + +# %% +# +# Run the simulation +# ------------------ +# +# We now have everything ready to run the MD simulation at constant energy (NVE). To +# keep the execution time of this tutorial small we run the simulations only for 100 +# steps. If you want to run a longer simulation you can increase the ``n_steps`` +# variable. +# +# During the simulation loop we collect data about the simulation for later analysis. + + +n_steps = 100 + +potential_energy = np.zeros(n_steps) +kinetic_energy = np.zeros(n_steps) +total_energy = np.zeros(n_steps) +trajectory = [] + +for step in range(n_steps): + # run a single simulation step + integrator.run(1) + + trajectory.append(atoms.copy()) + potential_energy[step] = atoms.get_potential_energy() + kinetic_energy[step] = atoms.get_kinetic_energy() + total_energy[step] = atoms.get_total_energy() + +# %% +# +# Analyse the results +# ------------------- +# +# Energy conservation +# ################### +# +# For a first analysis, we plot the evolution of the mean of the kinetic, potential, and +# total energy which is an important measure for the stability of a simulation. +# +# As shown below we see that both the kinetic, potential, and total energy +# fluctuate but the total energy is conserved over the length of the simulation. + + +plt.plot(potential_energy - potential_energy.mean(), label="potential energy") +plt.plot(kinetic_energy - kinetic_energy.mean(), label="kinetic energy") +plt.plot(total_energy - total_energy.mean(), label="total energy") + +plt.xlabel("step") +plt.ylabel("energy / kcal/mol") +plt.legend() + +plt.show() + +# %% +# +# Inspect the systems +# ################### +# +# Even though the total energy is conserved, we also have to verify that the ethanol +# molecule is stable and the bonds did not break. + +animation = ase.visualize.plot.animate(trajectory, interval=100, save_count=None) +plt.show() + +# %% +# +# Carbon-hydrogen radial distribution function +# ############################################ +# +# As a final analysis we also calculate and plot the carbon-hydrogen radial distribution +# function (RDF) from the trajectory and compare this to the RDF from the training set. +# +# To use the RDF code from ase we first have to define a unit cell for our systems. +# We choose a cubic one with a side length of 10 Å. + +for atoms in train_frames: + atoms.cell = 10 * np.ones(3) + atoms.pbc = True + +for atoms in trajectory: + atoms.cell = 10 * np.ones(3) + atoms.pbc = True + +# %% +# +# We now can initilize the :py:class:`ase.geometry.analysis.Analysis` objects and +# compute the the RDF using the :py:meth:`ase.geometry.analysis.Analysis.get_rdf` +# method. + +ana_traj = Analysis(trajectory) +ana_train = Analysis(train_frames) + +rdf_traj = ana_traj.get_rdf(rmax=5, nbins=50, elements=["C", "H"], return_dists=True) +rdf_train = ana_train.get_rdf(rmax=5, nbins=50, elements=["C", "H"], return_dists=True) + +# %% +# +# We extract the bin positions from the returned values and and averege the RDF over the +# whole trajectory and dataset, respectively. + +bins = rdf_traj[0][1] +rdf_traj_mean = np.mean([rdf_traj[i][0] for i in range(n_steps)], axis=0) +rdf_train_mean = np.mean([rdf_train[i][0] for i in range(n_steps)], axis=0) + +# %% +# +# Plotting the RDF verifies that the hydrogen bonds are stable, confirming that we +# performed an energy-conserving and stable simulation. + +plt.plot(bins, rdf_traj_mean, label="trajectory") +plt.plot(bins, rdf_train_mean, label="training set") + +plt.legend() +plt.xlabel("r / Å") +plt.ylabel("radial distribution function") + +plt.show() diff --git a/latest/_downloads/95de936c91ea8e0ab6d4de8e34752bc2/qm9_reduced_100.xyz b/latest/_downloads/95de936c91ea8e0ab6d4de8e34752bc2/qm9_reduced_100.xyz new file mode 100644 index 000000000..14b2a0416 --- /dev/null +++ b/latest/_downloads/95de936c91ea8e0ab6d4de8e34752bc2/qm9_reduced_100.xyz @@ -0,0 +1,1201 @@ +5 +Properties=species:S:1:pos:R:3 A=157.7118 B=157.70997 C=157.70699 mu=0 alpha=13.21 epsHOMO=-0.3877 epsLUMO=0.1171 epsgap=0.5048 =35.3641 zpve=0.044749 U0=-40.47893 U=-40.476062 H=-40.475117 G=-40.498597 Cv=6.469 pbc="F F F" +C -0.01269814 1.08580416 0.00800100 +H 0.00215042 -0.00603132 0.00197612 +H 1.01173084 1.46375116 0.00027657 +H -0.54081507 1.44752661 -0.87664372 +H -0.52381363 1.43793264 0.90639729 +4 +Properties=species:S:1:pos:R:3 A=293.60975 B=293.54111 C=191.39397 mu=1.6256 alpha=9.46 epsHOMO=-0.257 epsLUMO=0.0829 epsgap=0.3399 =26.1563 zpve=0.034358 U0=-56.525887 U=-56.523026 H=-56.522082 G=-56.544961 Cv=6.316 pbc="F F F" +N -0.04042605 1.02410775 0.06256380 +H 0.01725746 0.01254521 -0.02737716 +H 0.91578937 1.35874519 -0.02875776 +H -0.52027774 1.34353213 -0.77554261 +3 +Properties=species:S:1:pos:R:3 A=799.58812 B=437.90386 C=282.94545 mu=1.8511 alpha=6.31 epsHOMO=-0.2928 epsLUMO=0.0687 epsgap=0.3615 =19.0002 zpve=0.021375 U0=-76.404702 U=-76.401867 H=-76.400922 G=-76.422349 Cv=6.002 pbc="F F F" +O -0.03436050 0.97753957 0.00760159 +H 0.06476649 0.02057220 0.00153463 +H 0.87179037 1.30079240 0.00069313 +4 +Properties=species:S:1:pos:R:3 A=0 B=35.6100361 C=35.6100361 mu=0 alpha=16.28 epsHOMO=-0.2845 epsLUMO=0.0506 epsgap=0.3351 =59.5248 zpve=0.026841 U0=-77.308427 U=-77.305527 H=-77.304583 G=-77.327429 Cv=8.574 pbc="F F F" +C 0.59953949 0.00000000 1.00000000 +C -0.59953949 0.00000000 1.00000000 +H -1.66163859 0.00000000 1.00000000 +H 1.66163859 0.00000000 1.00000000 +3 +Properties=species:S:1:pos:R:3 A=0 B=44.593883 C=44.593883 mu=2.8937 alpha=12.99 epsHOMO=-0.3604 epsLUMO=0.0191 epsgap=0.3796 =48.7476 zpve=0.016601 U0=-93.411888 U=-93.40937 H=-93.408425 G=-93.431246 Cv=6.278 pbc="F F F" +C -0.01332393 1.13246572 0.00827589 +N 0.00231072 -0.01915859 0.00192873 +H -0.02780270 2.19894930 0.01415379 +4 +Properties=species:S:1:pos:R:3 A=285.48839 B=38.9823 C=34.29892 mu=2.1089 alpha=14.18 epsHOMO=-0.267 epsLUMO=-0.0406 epsgap=0.2263 =59.9891 zpve=0.026603 U0=-114.483613 U=-114.480746 H=-114.479802 G=-114.505268 Cv=6.413 pbc="F F F" +C -0.01397770 1.18021143 0.00775250 +O 0.00231399 -0.01966366 0.00216107 +H 0.91496029 1.78951117 0.00395656 +H -0.95910972 1.76401798 0.01718284 +8 +Properties=species:S:1:pos:R:3 A=80.46225 B=19.90649 C=19.90633 mu=0 alpha=23.95 epsHOMO=-0.3385 epsLUMO=0.1041 epsgap=0.4426 =109.5031 zpve=0.074542 U0=-79.764152 U=-79.760666 H=-79.759722 G=-79.787269 Cv=10.098 pbc="F F F" +C -0.01870400 1.52558201 0.01043281 +C 0.00210374 -0.00388191 0.00199882 +H 0.99487275 1.93974324 0.00294120 +H -0.54207611 1.92361063 -0.86511735 +H -0.52524112 1.91417308 0.90002399 +H 0.52548654 -0.40190784 0.87754395 +H -1.01147651 -0.41803380 0.00950849 +H 0.50862619 -0.39247040 -0.88760117 +6 +Properties=species:S:1:pos:R:3 A=127.83497 B=24.85872 C=23.97872 mu=1.5258 alpha=16.97 epsHOMO=-0.2653 epsLUMO=0.0784 epsgap=0.3437 =83.794 zpve=0.051208 U0=-115.679136 U=-115.675816 H=-115.674872 G=-115.701876 Cv=8.751 pbc="F F F" +C -0.00828817 1.39046978 -0.00560069 +O -0.00797038 -0.02504537 0.02030606 +H 1.00658338 1.81556366 0.00348335 +H -0.54657475 1.79916975 -0.87390126 +H -0.52288871 1.72555240 0.89907326 +H 0.44142019 -0.33354425 -0.77152059 +7 +Properties=species:S:1:pos:R:3 A=160.28041 B=8.59323 C=8.59321 mu=0.7156 alpha=28.78 epsHOMO=-0.2609 epsLUMO=0.0613 epsgap=0.3222 =177.1963 zpve=0.05541 U0=-116.609549 U=-116.60555 H=-116.604606 G=-116.633775 Cv=12.482 pbc="F F F" +C -0.01782102 1.46435788 0.01009397 +C 0.00208816 0.00950777 0.00201200 +C 0.01834085 -1.19180518 -0.00450508 +H 0.99782210 1.87425349 0.00260606 +H -0.54220434 1.85801178 -0.86721192 +H -0.52533306 1.84834356 0.90148138 +H 0.03231658 -2.25314823 -0.01025999 +6 +Properties=species:S:1:pos:R:3 A=159.03567 B=9.22327 C=9.22324 mu=3.8266 alpha=24.45 epsHOMO=-0.3264 epsLUMO=0.0376 epsgap=0.364 =160.7223 zpve=0.045286 U0=-132.71815 U=-132.714563 H=-132.713619 G=-132.742149 Cv=10.287 pbc="F F F" +C -0.01788629 1.46712787 0.01011311 +C 0.00173819 0.01035260 0.00207588 +N 0.01765235 -1.14452926 -0.00420445 +H 1.00202941 1.86089927 0.00245401 +H -0.54398848 1.84479901 -0.87075460 +H -0.52707783 1.83518166 0.90486329 +7 +Properties=species:S:1:pos:R:3 A=57.22434 B=10.11122 C=9.07368 mu=2.5682 alpha=25.11 epsHOMO=-0.254 epsLUMO=-0.0198 epsgap=0.2342 =166.9728 zpve=0.055355 U0=-153.787612 U=-153.783728 H=-153.782784 G=-153.812518 Cv=11.219 pbc="F F F" +C -0.00294482 1.50991366 0.00867278 +C 0.02608284 0.00327563 -0.03745912 +O 0.94228801 -0.65507035 -0.45682576 +H 0.92278802 1.92634242 -0.39146557 +H -0.86201540 1.87852481 -0.56479538 +H -0.15050638 1.84393383 1.04289100 +H -0.89443009 -0.48643408 0.35774865 +6 +Properties=species:S:1:pos:R:3 A=73.8472 B=11.34793 C=9.83639 mu=3.7286 alpha=21.57 epsHOMO=-0.2543 epsLUMO=0.0302 epsgap=0.2845 =145.3078 zpve=0.045279 U0=-169.860788 U=-169.856903 H=-169.855958 G=-169.885594 Cv=10.89 pbc="F F F" +N -0.02589986 1.34614561 0.00889391 +C 0.04646728 -0.01174341 0.00120425 +O 1.07183520 -0.65258782 -0.01113313 +H 0.82535497 1.88504948 0.00373769 +H -0.90837680 1.82679638 0.01891992 +H -0.96144100 -0.47500376 0.00807391 +11 +Properties=species:S:1:pos:R:3 A=29.45018 B=8.37701 C=7.42076 mu=0.0597 alpha=34.75 epsHOMO=-0.323 epsLUMO=0.0949 epsgap=0.4179 =227.1361 zpve=0.103182 U0=-119.052475 U=-119.047927 H=-119.046983 G=-119.078157 Cv=14.84 pbc="F F F" +C -0.03113825 1.54081582 0.03192126 +C 0.01215347 0.01092235 -0.01603259 +C 0.72169129 -0.52583353 -1.26230570 +H 0.97955987 1.96459116 0.03098367 +H -0.55840223 1.94831192 -0.83816075 +H -0.54252252 1.90153531 0.93005671 +H 0.51522791 -0.36840234 0.88231134 +H -1.01070641 -0.38456999 0.02051783 +H 1.75851210 -0.17376585 -1.30871516 +H 0.74087192 -1.62024959 -1.27516511 +H 0.22023351 -0.19051179 -2.17729020 +9 +Properties=species:S:1:pos:R:3 A=35.09545 B=9.3686 C=8.1497 mu=1.4131 alpha=27.87 epsHOMO=-0.2619 epsLUMO=0.0798 epsgap=0.3417 =193.1659 zpve=0.079754 U0=-154.972731 U=-154.968412 H=-154.967467 G=-154.998148 Cv=13.546 pbc="F F F" +C -0.00860504 1.50203829 -0.00681217 +C 0.01099310 -0.01764877 -0.01377035 +O 0.68088841 -0.44041803 -1.19313210 +H 1.01153334 1.89662030 -0.01920155 +H -0.53159862 1.88076109 -0.88974659 +H -0.51674572 1.87611771 0.88710739 +H 0.52377121 -0.38912295 0.88824082 +H -1.02027544 -0.40507261 0.01690670 +H 0.69529573 -1.40179568 -1.20148495 +9 +Properties=species:S:1:pos:R:3 A=39.37691 B=10.04033 C=8.90353 mu=1.1502 alpha=28.13 epsHOMO=-0.2525 epsLUMO=0.091 epsgap=0.3435 =187.1015 zpve=0.079534 U0=-154.960361 U=-154.956045 H=-154.9551 G=-154.985747 Cv=12.934 pbc="F F F" +C -0.01482147 1.39241234 0.00567104 +O -0.00471537 -0.01360660 0.01459658 +C 0.63794893 -0.55329676 -1.11358232 +H 1.00528358 1.81015807 0.00465631 +H -0.54689560 1.79343530 -0.87251051 +H -0.53002895 1.72291969 0.91101696 +H 0.13993792 -0.25599333 -2.05098375 +H 1.69265275 -0.23868382 -1.17477743 +H 0.59959435 -1.64180161 -1.02407616 +9 +Properties=species:S:1:pos:R:3 A=20.15852 B=20.15302 C=12.5891 mu=0.0005 alpha=30.82 epsHOMO=-0.2888 epsLUMO=0.1042 epsgap=0.393 =155.8145 zpve=0.081231 U0=-117.824798 U=-117.821426 H=-117.820482 G=-117.849087 Cv=11.041 pbc="F F F" +C -0.01193280 1.51433198 0.01031700 +C 1.30299118 0.77886562 -0.00617842 +C 0.00867174 0.00767042 0.00201032 +H -0.30541464 2.01702117 0.92533239 +H -0.32275498 2.02680156 -0.89347839 +H 1.88493396 0.79145020 -0.92119393 +H 1.90226631 0.78165391 0.89766373 +H -0.27088043 -0.51289125 0.91137474 +H -0.28821983 -0.50310409 -0.90740824 +7 +Properties=species:S:1:pos:R:3 A=25.77385 B=22.12109 C=14.18066 mu=1.7675 alpha=24.04 epsHOMO=-0.2682 epsLUMO=0.1042 epsgap=0.3724 =129.891 zpve=0.057289 U0=-153.742562 U=-153.73941 H=-153.738466 G=-153.766642 Cv=9.176 pbc="F F F" +C 0.01537720 1.41764380 0.00956287 +C 1.26478161 0.64923984 -0.00655044 +O -0.00024018 -0.00771006 0.00204055 +H -0.31763326 1.88586598 0.93475751 +H -0.33527583 1.89576673 -0.90397578 +H 1.83246682 0.56256848 -0.93193290 +H 1.85008258 0.55267938 0.90680147 +10 +Properties=species:S:1:pos:R:3 A=10.12193 B=8.49011 C=4.89615 mu=2.7362 alpha=35.53 epsHOMO=-0.2431 epsLUMO=-0.0087 epsgap=0.2344 =292.4367 zpve=0.083382 U0=-193.08834 U=-193.082969 H=-193.082024 G=-193.116476 Cv=16.893 pbc="F F F" +C -0.00310189 1.48050328 -0.17259867 +C -0.04527202 -0.02887059 0.00139493 +C 1.29705800 -0.72194415 0.16889042 +O -1.08643172 -0.64273343 0.00630393 +H 0.59403529 1.74668579 -1.05225043 +H -1.01540407 1.87034023 -0.28382265 +H 0.48099600 1.95070605 0.69099376 +H 1.82512144 -0.32470731 1.04328658 +H 1.14892507 -1.79597689 0.28554393 +H 1.93682635 -0.52949692 -0.69995403 +9 +Properties=species:S:1:pos:R:3 A=10.78886 B=9.27509 C=5.14977 mu=3.6367 alpha=31.83 epsHOMO=-0.2436 epsLUMO=0.0347 epsgap=0.2783 =267.6148 zpve=0.07319 U0=-209.159302 U=-209.15402 H=-209.153076 G=-209.187468 Cv=16.561 pbc="F F F" +C 0.00679889 1.49969736 -0.02567030 +C -0.02740385 -0.01752051 -0.14894811 +N 1.17826667 -0.63324298 0.05691721 +O -1.03721965 -0.63980649 -0.40727572 +H 0.91390280 1.92923755 -0.46100067 +H -0.87080896 1.91124186 -0.52345176 +H -0.02826124 1.78517271 1.03149125 +H 1.98405139 -0.13175861 0.38674906 +H 1.19049421 -1.63919563 0.10006209 +8 +Properties=species:S:1:pos:R:3 A=11.1475 B=10.36388 C=5.42091 mu=3.4869 alpha=28.07 epsHOMO=-0.2495 epsLUMO=0.0556 epsgap=0.3051 =244.2308 zpve=0.063824 U0=-225.221461 U=-225.217075 H=-225.216131 G=-225.247724 Cv=15.292 pbc="F F F" +N 0.03605270 1.36077873 -0.12416403 +C -0.02591138 -0.02076560 0.00200645 +N 1.21968479 -0.62334220 0.11963222 +O -1.06822866 -0.64174597 0.00865573 +H 0.80749439 1.83455148 0.32144915 +H -0.85825775 1.80373500 0.02243770 +H 1.99927148 -0.17303054 -0.33602496 +H 1.18204327 -1.62147901 -0.02109234 +14 +Properties=species:S:1:pos:R:3 A=7.75166 B=7.74847 C=4.48668 mu=0.0897 alpha=45.46 epsHOMO=-0.3167 epsLUMO=0.0843 epsgap=0.401 =355.0621 zpve=0.131146 U0=-158.342346 U=-158.336603 H=-158.335658 G=-158.370016 Cv=20.273 pbc="F F F" +C -0.03215888 1.54021598 0.01074456 +C 0.03381741 0.00745852 0.00180716 +C 0.71375572 -0.50856404 -1.27296949 +C 0.73848999 -0.52220886 1.25750907 +H 0.97522736 1.97414341 0.00528362 +H -0.56196769 1.92232326 -0.86835418 +H -0.54817239 1.91268414 0.90208039 +H -0.99752525 -0.37310578 0.00977297 +H 1.75070021 -0.15586784 -1.33269631 +H 0.73446691 -1.60328288 -1.29939696 +H 0.19367011 -0.16085589 -2.17195508 +H 0.23611990 -0.18382017 2.17005260 +H 0.75964083 -1.61713153 1.27226101 +H 1.77635866 -0.16985318 1.30053019 +12 +Properties=species:S:1:pos:R:3 A=8.67553 B=8.00568 C=4.75542 mu=1.4259 alpha=38.58 epsHOMO=-0.2612 epsLUMO=0.074 epsgap=0.3351 =318.3721 zpve=0.107673 U0=-194.267232 U=-194.261748 H=-194.260804 G=-194.294663 Cv=19.052 pbc="F F F" +C -0.03315871 1.54782566 -0.00438815 +C -0.01108534 0.01859095 0.01676117 +C 0.70938384 -0.53596711 1.23978444 +O -1.33219841 -0.51712554 0.05236057 +H 0.98215692 1.95715900 -0.03182225 +H -0.56388100 1.92087623 -0.88845865 +H -0.54082548 1.93340945 0.88575489 +H 0.51042122 -0.33767241 -0.88819176 +H 0.22240492 -0.18785860 2.15650245 +H 0.68242024 -1.62887638 1.23305141 +H 1.75434301 -0.21246950 1.25524188 +H -1.81818681 -0.15577435 -0.69553962 +6 +Properties=species:S:1:pos:R:3 A=0 B=4.4259726 C=4.4259726 mu=0 alpha=38.52 epsHOMO=-0.2599 epsLUMO=-0.0214 epsgap=0.2386 =278.6264 zpve=0.037354 U0=-153.459846 U=-153.455442 H=-153.454498 G=-153.482621 Cv=15.312 pbc="F F F" +C 0.68098021 0.00000000 0.00000000 +C -0.68098021 0.00000000 0.00000000 +C -1.88766603 0.00000000 0.00000000 +C 1.88766603 0.00000000 0.00000000 +H -2.94960000 0.00000000 0.00000000 +H 2.94960000 0.00000000 0.00000000 +5 +Properties=species:S:1:pos:R:3 A=0 B=4.5793222 C=4.5793222 mu=3.792 alpha=32.66 epsHOMO=-0.3102 epsLUMO=-0.0543 epsgap=0.2559 =260.1896 zpve=0.027259 U0=-169.557758 U=-169.553764 H=-169.55282 G=-169.581024 Cv=12.93 pbc="F F F" +C 0.01510390 0.00000000 1.00000000 +C 1.38233149 0.00000000 1.00000000 +C -1.18862525 0.00000000 1.00000000 +H -2.25177201 0.00000000 1.00000000 +N 2.54296187 0.00000000 1.00000000 +4 +Properties=species:S:1:pos:R:3 A=0 B=4.73269 C=4.73269 mu=0.0023 alpha=27.7 epsHOMO=-0.3696 epsLUMO=-0.0926 epsgap=0.277 =242.9308 zpve=0.015951 U0=-185.648533 U=-185.644825 H=-185.64388 G=-185.667652 Cv=10.398 pbc="F F F" +N 0.01745734 -1.16134217 -0.00415342 +C 0.00253212 -0.00344278 0.00179939 +C -0.01611419 1.37220987 0.00934873 +N -0.03264302 2.53008276 0.01609090 +6 +Properties=species:S:1:pos:R:3 A=68.5171 B=4.8345 C=4.51586 mu=2.7824 alpha=31.14 epsHOMO=-0.2777 epsLUMO=-0.0735 epsgap=0.2042 =268.3921 zpve=0.037208 U0=-190.624631 U=-190.620363 H=-190.619419 G=-190.650543 Cv=13.049 pbc="F F F" +O -0.06776120 -0.04233838 0.00282489 +C -0.00562945 1.16382879 0.00743862 +C 1.22985272 1.91339997 0.00028781 +C 2.23625322 2.57430970 -0.00529277 +H -0.91670701 1.79467546 0.01781352 +H 3.13429662 3.14370267 -0.01037656 +5 +Properties=species:S:1:pos:R:3 A=67.88408 B=5.00823 C=4.66413 mu=2.3112 alpha=26.25 epsHOMO=-0.3166 epsLUMO=-0.11 epsgap=0.2066 =251.0007 zpve=0.02654 U0=-206.721858 U=-206.717875 H=-206.716931 G=-206.747625 Cv=11.329 pbc="F F F" +O -0.04055978 -0.03799144 0.00266513 +C -0.01768870 1.16193251 0.00746008 +C 1.23315534 1.93381336 0.00043371 +N 2.19857378 2.57055097 -0.00483320 +H -0.92627534 1.78959196 0.01764859 +6 +Properties=species:S:1:pos:R:3 A=56.25048 B=4.77441 C=4.40088 mu=0.002 alpha=26.12 epsHOMO=-0.2668 epsLUMO=-0.1113 epsgap=0.1555 =266.8164 zpve=0.036943 U0=-227.798785 U=-227.79457 H=-227.793626 G=-227.825074 Cv=12.147 pbc="F F F" +O 0.00337122 -0.03146586 0.00157206 +C -0.01713174 1.17081409 0.00676444 +C 1.26555783 1.99719410 -0.00007703 +O 1.24507069 3.19946589 0.00681275 +H -0.94690483 1.77678142 0.01852668 +H 2.19534410 1.39121374 -0.01006739 +10 +Properties=species:S:1:pos:R:3 A=80.28766 B=3.3688 C=3.3688 mu=0 alpha=42.32 epsHOMO=-0.2412 epsLUMO=0.0684 epsgap=0.3096 =400.2236 zpve=0.083896 U0=-155.908941 U=-155.90318 H=-155.902236 G=-155.937641 Cv=17.447 pbc="F F F" +C -0.01787959 1.46676893 0.01011180 +C 0.00186644 0.01072913 0.00211109 +C 0.01819704 -1.19272861 -0.00450723 +C 0.03795170 -2.64876793 -0.01251193 +H 0.86460312 1.87589979 0.51479719 +H -0.03217624 1.87210581 -1.00791002 +H -0.90233115 1.85185524 0.53003953 +H -0.83477011 -3.06339007 0.50451436 +H 0.03276422 -3.04315564 -1.03491223 +H 0.93213486 -3.03931642 0.48626606 +10 +Properties=species:S:1:pos:R:3 A=27.39459 B=4.53005 C=4.08342 mu=0.7067 alpha=40.09 epsHOMO=-0.2592 epsLUMO=0.0566 epsgap=0.3157 =333.9589 zpve=0.084338 U0=-155.897345 U=-155.892291 H=-155.891347 G=-155.924226 Cv=17.13 pbc="F F F" +C -0.03095840 1.54775025 0.03167945 +C 0.01485375 0.00962471 -0.02082154 +C 0.69099073 -0.49954575 -1.20857624 +C 1.25222275 -0.89514467 -2.19527879 +H 0.97899300 1.96621609 0.03373834 +H -0.56082354 1.95002902 -0.83580745 +H -0.54576708 1.88225519 0.93709062 +H 0.51920135 -0.37425398 0.87496224 +H -1.00644802 -0.39030838 0.01340632 +H 1.74594541 -1.25604187 -3.06299415 +9 +Properties=species:S:1:pos:R:3 A=28.0016 B=4.67752 C=4.21765 mu=3.9233 alpha=35.38 epsHOMO=-0.3213 epsLUMO=0.034 epsgap=0.3553 =314.5335 zpve=0.07419 U0=-172.006141 U=-172.001467 H=-172.000523 G=-172.032826 Cv=14.988 pbc="F F F" +C -0.02522005 1.54773054 0.02133370 +C 0.01183939 0.00999278 -0.01556702 +C 0.68915114 -0.50836846 -1.20331488 +N 1.22565733 -0.90360846 -2.14737482 +H 0.98571620 1.96212990 0.02370153 +H -0.55522192 1.94599662 -0.84711771 +H -0.53962556 1.88294354 0.92536604 +H 0.52481910 -0.38226048 0.86933355 +H -1.00453542 -0.39832109 0.00530071 +8 +Properties=species:S:1:pos:R:3 A=32.19893 B=4.76299 C=4.30696 mu=4.4361 alpha=31.81 epsHOMO=-0.2683 epsLUMO=0.0173 epsgap=0.2855 =295.6635 zpve=0.063305 U0=-188.042067 U=-188.037478 H=-188.036534 G=-188.06863 Cv=14.488 pbc="F F F" +N -0.03608099 1.48762533 0.03678072 +C -0.01039471 0.02517605 -0.01506608 +C -1.37180956 -0.52108920 0.02739272 +N -2.44026695 -0.95956444 0.03370519 +H 0.91729752 1.83547547 0.05202682 +H -0.47162178 1.85677205 -0.80275569 +H 0.48946161 -0.40880401 -0.89715168 +H 0.52827150 -0.34533338 0.86469547 +8 +Properties=species:S:1:pos:R:3 A=35.11615 B=4.66117 C=4.22354 mu=1.7211 alpha=33.1 epsHOMO=-0.2595 epsLUMO=0.0277 epsgap=0.2872 =300.0993 zpve=0.060632 U0=-191.810916 U=-191.806025 H=-191.805081 G=-191.837634 Cv=15.855 pbc="F F F" +O -0.02013197 1.45738137 0.01010195 +C 0.00168478 0.03579980 0.00224736 +C -1.36366691 -0.47481101 0.01255056 +C -2.47902835 -0.91970202 0.02082451 +H 0.89446911 1.75736553 0.00327363 +H 0.51979028 -0.35175413 -0.88980302 +H 0.53670458 -0.36127661 0.88000894 +H -3.46773502 -1.30737009 0.02818120 +7 +Properties=species:S:1:pos:R:3 A=35.93172 B=4.83443 C=4.37827 mu=4.6788 alpha=28.56 epsHOMO=-0.3018 epsLUMO=0.0022 epsgap=0.3039 =280.6659 zpve=0.050262 U0=-207.916786 U=-207.912215 H=-207.911271 G=-207.943384 Cv=13.845 pbc="F F F" +O -0.03738221 1.44547841 0.01010769 +C 0.01292906 0.03441661 0.00209165 +C -1.35747452 -0.48874523 0.01239738 +N -2.42135277 -0.93685184 0.02016053 +H 0.86898057 1.76972949 0.00417577 +H 0.51692713 -0.36329790 -0.89215814 +H 0.53387616 -0.37278749 0.88223921 +10 +Properties=species:S:1:pos:R:3 A=26.14564 B=4.2893 C=4.12773 mu=2.6741 alpha=35.83 epsHOMO=-0.25 epsLUMO=-0.0205 epsgap=0.2295 =333.3276 zpve=0.084175 U0=-193.075202 U=-193.070116 H=-193.069171 G=-193.102798 Cv=15.954 pbc="F F F" +C 0.16879340 1.52513042 -0.15747056 +C -0.18737625 0.06194763 0.14679374 +C 0.50917645 -0.43996215 1.39125850 +O 1.18191079 -1.43565585 1.45816384 +H 1.23126511 1.63137254 -0.39632693 +H -0.40744668 1.89431681 -1.00969246 +H -0.04931034 2.17266260 0.69857432 +H -1.26905160 -0.01668067 0.32854433 +H 0.06279062 -0.60250479 -0.68474036 +H 0.35384841 0.20663370 2.28871052 +9 +Properties=species:S:1:pos:R:3 A=19.98749 B=6.11589 C=4.82584 mu=3.7071 alpha=32.78 epsHOMO=-0.2516 epsLUMO=0.0335 epsgap=0.2851 =279.7863 zpve=0.074166 U0=-209.144909 U=-209.139976 H=-209.139032 G=-209.172305 Cv=15.058 pbc="F F F" +C 0.01474916 1.47888256 -0.03509326 +N 0.18708077 0.03831317 -0.02906851 +C 0.45703661 -0.66858895 1.10069001 +O 0.58457996 -0.19876202 2.21119705 +H 0.76025289 1.96736104 -0.67198126 +H -0.98462423 1.75984483 -0.38485103 +H 0.14269849 1.82387718 0.99149397 +H 0.10386349 -0.46937726 -0.89461379 +H 0.55047568 -1.75253452 0.88868242 +8 +Properties=species:S:1:pos:R:3 A=48.62351 B=4.67298 C=4.38187 mu=3.92 alpha=29.47 epsHOMO=-0.2814 epsLUMO=0.0074 epsgap=0.2888 =293.917 zpve=0.061327 U0=-229.013797 U=-229.009003 H=-229.008059 G=-229.041086 Cv=13.885 pbc="F F F" +C 0.10653781 1.43512049 0.03336100 +O 0.42686564 0.04716929 0.09309945 +C 0.50714862 -0.63652665 -1.06318297 +O 0.76927014 -1.79955017 -1.11010475 +H 0.92349251 2.00385139 0.48465728 +H -0.03757815 1.76927183 -1.00057425 +H -0.81269569 1.60801916 0.59873287 +H 0.30458460 -0.00231902 -1.94965553 +8 +Properties=species:S:1:pos:R:3 A=36.49282 B=4.31175 C=4.04493 mu=1.7341 alpha=28.53 epsHOMO=-0.2537 epsLUMO=-0.0341 epsgap=0.2196 =303.8129 zpve=0.060508 U0=-228.992613 U=-228.987769 H=-228.986825 G=-229.019918 Cv=14.78 pbc="F F F" +O 0.19375856 1.37170995 0.31398297 +C 0.04992637 0.01405481 -0.04526239 +C -1.40888025 -0.39635680 -0.20601574 +O -1.77729462 -1.37233860 -0.80361689 +H -0.01723186 1.91269132 -0.45337758 +H 0.60440478 -0.26519766 -0.95205725 +H 0.46740406 -0.57521679 0.78176270 +H -2.11835055 0.30075962 0.29870515 +14 +Properties=species:S:1:pos:R:3 A=23.44662 B=3.60588 C=3.38683 mu=0 alpha=45.71 epsHOMO=-0.317 epsLUMO=0.0937 epsgap=0.4107 =426.2996 zpve=0.131708 U0=-158.340943 U=-158.33517 H=-158.334226 G=-158.36894 Cv=19.668 pbc="F F F" +C -0.03007624 1.55804912 0.02980774 +C 0.00707277 0.02834877 -0.00712529 +C 0.71320792 -0.52989340 -1.24765581 +C 0.75036895 -2.05959366 -1.28458957 +H 0.98195330 1.97845113 0.02800797 +H -0.55582433 1.96212343 -0.84270157 +H -0.54083762 1.92692755 0.92493697 +H 0.50928672 -0.34909049 0.89361319 +H -1.01733481 -0.36542299 0.03207393 +H 0.21098948 -0.15245770 -2.14839302 +H 1.73761331 -0.13611625 -1.28685672 +H 1.27616854 -2.46366410 -0.41210980 +H -0.26165699 -2.48000447 -1.28273552 +H 1.26108491 -2.42846444 -2.17974803 +12 +Properties=species:S:1:pos:R:3 A=26.59789 B=3.79186 C=3.53779 mu=1.3402 alpha=38.61 epsHOMO=-0.2619 epsLUMO=0.081 epsgap=0.3429 =382.8628 zpve=0.108241 U0=-194.261089 U=-194.255495 H=-194.254551 G=-194.28893 Cv=18.431 pbc="F F F" +C -0.00379012 1.52196790 0.01027996 +C -0.03589372 -0.00778254 0.00225671 +C -1.45219016 -0.56653711 0.01284386 +O -1.36799785 -1.98394604 0.00453606 +H 1.02477576 1.89411231 0.00239793 +H -0.51286674 1.93764614 -0.86653888 +H -0.49584080 1.92801344 0.90121721 +H 0.48140784 -0.39530552 -0.88316064 +H 0.49828589 -0.40486256 0.87330348 +H -1.98734220 -0.20399494 0.90666062 +H -2.00431485 -0.19459473 -0.86666460 +H -2.26171819 -2.33824298 0.01034748 +12 +Properties=species:S:1:pos:R:3 A=28.29567 B=4.14901 C=3.88349 mu=1.0363 alpha=39.34 epsHOMO=-0.2503 epsLUMO=0.0925 epsgap=0.3428 =368.9331 zpve=0.107895 U0=-194.254127 U=-194.248585 H=-194.247641 G=-194.281899 Cv=17.888 pbc="F F F" +C -0.00519551 1.50868224 0.03308760 +C 0.01316580 -0.01037819 0.01988643 +O 0.69758944 -0.46344140 1.16868979 +C 0.76688491 -1.86508183 1.24602669 +H 1.01445476 1.90423799 0.02996018 +H -0.52990866 1.89184059 -0.84726911 +H -0.51263765 1.87805843 0.92875424 +H -1.01599507 -0.40998729 0.00714282 +H 0.51093143 -0.38369435 -0.89219395 +H -0.23415841 -2.32451489 1.28977780 +H 1.30129276 -2.29853663 0.38486095 +H 1.30990287 -2.11811998 2.16013206 +10 +Properties=species:S:1:pos:R:3 A=14.79671 B=5.6956 C=4.58846 mu=0.0075 alpha=31.42 epsHOMO=-0.2594 epsLUMO=0.0584 epsgap=0.3179 =297.8398 zpve=0.085172 U0=-230.183076 U=-230.177723 H=-230.176779 G=-230.211195 Cv=16.837 pbc="F F F" +O -0.01418735 1.42642242 -0.05423651 +C -0.00391839 0.00717714 0.03496062 +C -1.42317019 -0.55560600 -0.01256639 +O -2.11229413 -0.10563875 -1.17228313 +H -0.18987882 1.64154705 -0.97555148 +H 0.59659504 -0.43315430 -0.77409095 +H 0.47311116 -0.24903733 0.98747216 +H -1.39494859 -1.64975279 -0.06283188 +H -1.96497417 -0.27216915 0.90131972 +H -2.35925991 0.80944396 -1.00614597 +12 +Properties=species:S:1:pos:R:3 A=15.61472 B=6.31363 C=5.54514 mu=0.1136 alpha=41.96 epsHOMO=-0.2727 epsLUMO=0.1012 epsgap=0.3738 =298.6061 zpve=0.109284 U0=-157.116735 U=-157.11209 H=-157.111146 G=-157.143262 Cv=16.49 pbc="F F F" +C -0.03602245 1.52092949 0.01569161 +C 0.01938487 0.01004403 0.04814953 +C 1.30891671 -0.71251995 -0.24920416 +C 0.75347423 -0.70267714 1.15564676 +H 0.90105691 1.95389291 0.38283338 +H -0.19640365 1.89437369 -1.00208569 +H -0.84685273 1.90588930 0.64451322 +H -0.88416809 -0.48001889 -0.30566335 +H 1.26900901 -1.63903068 -0.81150371 +H 2.19010738 -0.11131209 -0.44927513 +H 1.26248862 -0.09487455 1.89690028 +H 0.33540836 -1.62248918 1.54980695 +10 +Properties=species:S:1:pos:R:3 A=18.21931 B=6.63877 C=5.92459 mu=1.812 alpha=35.01 epsHOMO=-0.2633 epsLUMO=0.1052 epsgap=0.3685 =267.2979 zpve=0.085275 U0=-193.039603 U=-193.035186 H=-193.034242 G=-193.065979 Cv=14.764 pbc="F F F" +C -0.01646343 1.51830705 0.00771445 +C -0.02743227 0.01657694 -0.10889741 +C 0.77296553 -0.70131886 -1.10863115 +O 1.17212293 -0.66702969 0.26278829 +H 0.91865980 1.92914217 -0.38285880 +H -0.85158014 1.95456506 -0.55109460 +H -0.11487702 1.82596470 1.05397777 +H -0.93582598 -0.47350600 0.24682793 +H 0.44443922 -1.67201495 -1.47810622 +H 1.40538284 -0.13600339 -1.79271491 +11 +Properties=species:S:1:pos:R:3 A=16.58914 B=7.18798 C=6.11415 mu=1.1353 alpha=39.02 epsHOMO=-0.2304 epsLUMO=0.0968 epsgap=0.3271 =270.5508 zpve=0.097671 U0=-173.147782 U=-173.143343 H=-173.142399 G=-173.174073 Cv=15.298 pbc="F F F" +C -0.05275541 1.47419574 0.00999108 +N 0.01940516 0.02189947 0.06334866 +C 1.32511048 -0.56446850 -0.21420725 +C 0.78051759 -0.54057993 1.17242760 +H 0.86784202 1.97176076 0.36297285 +H -0.23845155 1.79095005 -1.02142866 +H -0.88683448 1.81938959 0.62950398 +H 1.31992909 -1.48186782 -0.79602038 +H 2.15202820 0.11020204 -0.43285248 +H 1.24563570 0.14996098 1.87499245 +H 0.37013358 -1.44020447 1.62233365 +10 +Properties=species:S:1:pos:R:3 A=16.79477 B=6.71015 C=5.86781 mu=1.3894 alpha=34.64 epsHOMO=-0.239 epsLUMO=0.0775 epsgap=0.3166 =263.966 zpve=0.085106 U0=-193.034988 U=-193.030356 H=-193.029411 G=-193.061689 Cv=15.679 pbc="F F F" +O 0.21577583 1.35386859 -0.10695107 +C 0.01628099 -0.02832718 -0.02915694 +C -0.39081465 -0.71497009 1.24315669 +C -1.35118138 -0.64280380 0.06273589 +H -0.43642338 1.79062849 0.45006761 +H 0.74981167 -0.52404050 -0.65624767 +H 0.05959375 -1.66840483 1.49729237 +H -0.61369353 -0.08848006 2.10170640 +H -2.19821932 0.03058430 0.15411451 +H -1.56395912 -1.54640426 -0.49826515 +12 +Properties=species:S:1:pos:R:3 A=10.66107 B=10.66107 C=6.30452 mu=0 alpha=41.83 epsHOMO=-0.2982 epsLUMO=0.0956 epsgap=0.3938 =268.4432 zpve=0.110511 U0=-157.115484 U=-157.111322 H=-157.110378 G=-157.141657 Cv=14.696 pbc="F F F" +C -0.02542957 1.54032578 -0.04215944 +C 1.52564399 1.50419989 0.04121276 +C 1.42146727 0.06146790 0.60844885 +C -0.02638833 -0.01070956 0.04935088 +H -0.46591372 1.99639894 0.84962894 +H -0.47900239 2.00028207 -0.92365389 +H 1.98248278 1.51375334 -0.95303183 +H 2.02191365 2.25986579 0.65522129 +H 2.14291679 -0.67956358 0.25531480 +H 1.43105853 0.05751479 1.70261879 +H -0.79053440 -0.48530296 0.66996573 +H -0.05233245 -0.47238446 -0.94236394 +10 +Properties=species:S:1:pos:R:3 A=12.06545 B=11.77731 C=6.71997 mu=1.7978 alpha=34.56 epsHOMO=-0.2424 epsLUMO=0.0859 epsgap=0.3283 =236.9759 zpve=0.086675 U0=-193.034094 U=-193.029968 H=-193.029024 G=-193.060777 Cv=12.915 pbc="F F F" +C -0.03489789 1.55259455 -0.08507691 +C 1.49349183 1.45459700 0.10114677 +O 1.42725884 0.02348990 0.27254886 +C -0.00634758 0.02236494 0.10944630 +H -0.56579210 2.11301721 0.68591527 +H -0.36628352 1.89393380 -1.06692327 +H 2.10031724 1.73525720 -0.76898349 +H 1.90023090 1.95506611 0.98896748 +H -0.51987849 -0.35595179 1.00235948 +H -0.31970062 -0.57567421 -0.75559275 +12 +Properties=species:S:1:pos:R:3 A=8.63483 B=4.11977 C=2.88825 mu=0.6875 alpha=45.37 epsHOMO=-0.2392 epsLUMO=0.0192 epsgap=0.2584 =452.5112 zpve=0.100501 U0=-248.375248 U=-248.368823 H=-248.367879 G=-248.405354 Cv=21.616 pbc="F F F" +C -0.10255370 1.49907127 -0.00133642 +C -0.00519774 -0.00343114 -0.02723470 +C -0.00688536 -0.76890740 1.26434744 +N 0.08186799 -0.69202791 -1.10087306 +O 0.07439067 0.13215394 -2.24195258 +H 0.78342093 1.94690862 -0.46354050 +H -0.96150430 1.83614082 -0.59021965 +H -0.19854173 1.87462989 1.01931607 +H -0.92620012 -0.57297946 1.82982479 +H 0.07256154 -1.84064782 1.07516863 +H 0.82937178 -0.45553340 1.90133089 +H 0.13975924 -0.51254299 -2.95389260 +10 +Properties=species:S:1:pos:R:3 A=9.17136 B=9.04195 C=4.5531 mu=1.8689 alpha=43.14 epsHOMO=-0.2029 epsLUMO=0.0499 epsgap=0.2528 =303.9808 zpve=0.082433 U0=-210.101789 U=-210.097816 H=-210.096872 G=-210.12818 Cv=14.821 pbc="F F F" +N -0.00829694 1.35362838 0.00995971 +C 1.28033254 1.82457421 -0.00022459 +C 2.12216639 0.73698898 -0.01445600 +C 1.30849904 -0.43109580 -0.01284154 +C -0.00342782 -0.01836884 0.00235736 +H -0.83243234 1.92772668 0.02122995 +H 1.48471820 2.88312630 0.00354313 +H 3.20066918 0.77343077 -0.02488416 +H 1.64810599 -1.45539683 -0.02180394 +H -0.92551647 -0.57697054 0.00839402 +9 +Properties=species:S:1:pos:R:3 A=9.77329 B=9.41192 C=4.7946 mu=3.6193 alpha=39.13 epsHOMO=-0.2253 epsLUMO=0.0332 epsgap=0.2585 =283.6817 zpve=0.071145 U0=-226.160842 U=-226.157088 H=-226.156144 G=-226.187104 Cv=13.371 pbc="F F F" +N -0.00996090 1.35636172 0.01000855 +C 1.29535422 1.79575578 -0.00047017 +C 2.05550519 0.65637438 -0.01422927 +N 1.25385745 -0.46275132 -0.01260894 +C 0.02301170 -0.00706382 0.00200146 +H -0.83195718 1.93618436 0.02132575 +H 1.54553961 2.84344998 0.00289054 +H 3.13177434 0.57569766 -0.02524155 +H -0.87667864 -0.60414531 0.00750794 +9 +Properties=species:S:1:pos:R:3 A=9.50228 B=9.29497 C=4.69874 mu=0.5571 alpha=39.2 epsHOMO=-0.2246 epsLUMO=0.0199 epsgap=0.2445 =289.005 zpve=0.069883 U0=-229.969129 U=-229.965414 H=-229.96447 G=-229.995393 Cv=13.358 pbc="F F F" +O -0.03255819 1.35065130 0.00967376 +C 1.25319237 1.79167710 -0.00030351 +C 2.11664681 0.74375623 -0.01441494 +C 1.30397796 -0.43852387 -0.01283316 +C 0.01629568 -0.00777185 0.00191294 +H 1.37951089 2.86161135 0.00427433 +H 3.19376406 0.79865501 -0.02458604 +H 1.63858893 -1.46383271 -0.02156949 +H -0.93736295 -0.50899925 0.00843891 +8 +Properties=species:S:1:pos:R:3 A=10.10926 B=9.69372 C=4.94857 mu=1.5081 alpha=35.17 epsHOMO=-0.2509 epsLUMO=0.001 epsgap=0.2519 =269.2444 zpve=0.058593 U0=-246.02915 U=-246.025614 H=-246.024669 G=-246.055309 Cv=12.04 pbc="F F F" +O -0.03808298 1.35643965 0.00975193 +C 1.26496982 1.76855319 -0.00061744 +C 2.04955750 0.66630033 -0.01406047 +N 1.24227075 -0.46732066 -0.01237541 +C 0.04019820 0.00561577 0.00183569 +H 1.43513907 2.83095265 0.00340823 +H 3.12532898 0.59783015 -0.02480757 +H -0.89387707 -0.53342154 0.00796935 +17 +Properties=species:S:1:pos:R:3 A=4.4178 B=4.41753 C=4.41717 mu=0.0003 alpha=56.01 epsHOMO=-0.3145 epsLUMO=0.0737 epsgap=0.3882 =486.2719 zpve=0.158836 U0=-197.632222 U=-197.625241 H=-197.624297 G=-197.661411 Cv=26.084 pbc="F F F" +C -0.01859029 1.53486266 0.01039904 +C 0.00210320 -0.00413672 0.00196980 +C 0.74643954 -0.51390760 1.24887638 +C -1.44190166 -0.53673615 0.01311457 +C 0.72234971 -0.50049606 -1.26445632 +H 0.99776928 1.94420529 0.00435474 +H -0.54181883 1.92841415 -0.86819911 +H -0.52758402 1.91888376 0.90148530 +H 0.25549576 -0.17602728 2.16833067 +H 0.77815389 -1.60892372 1.27088904 +H 1.77964786 -0.14975834 1.26944035 +H -1.99871895 -0.18888794 -0.86408066 +H -1.45956909 -1.63227235 0.00649916 +H -1.98088827 -0.19979639 0.90561580 +H 1.75482473 -0.13554018 -1.30118083 +H 0.75396989 -1.59524036 -1.29822280 +H 0.21358221 -0.15343900 -2.17067181 +15 +Properties=species:S:1:pos:R:3 A=4.69474 B=4.66938 C=4.47909 mu=1.384 alpha=49.04 epsHOMO=-0.2601 epsLUMO=0.0664 epsgap=0.3265 =449.0573 zpve=0.134977 U0=-233.560626 U=-233.553779 H=-233.552834 G=-233.589759 Cv=25.128 pbc="F F F" +C -0.00855999 1.54270147 0.00152717 +C 0.00506780 0.00702635 0.01856160 +C 0.76137731 -0.51839196 1.24766443 +C -1.42012774 -0.54933183 -0.02116008 +O 0.62590477 -0.48363745 -1.17657057 +H 1.01361406 1.94020776 0.00281128 +H -0.51459669 1.90702466 -0.89705781 +H -0.52214815 1.94882514 0.87918344 +H 0.28130613 -0.20165548 2.17943598 +H 0.79965506 -1.61131746 1.23022549 +H 1.79096916 -0.14072935 1.26083003 +H -1.93854829 -0.19910724 -0.91828281 +H -1.39937632 -1.64259062 -0.04563833 +H -1.98850725 -0.23059656 0.85726520 +H 1.53111188 -0.15488046 -1.19210222 +9 +Properties=species:S:1:pos:R:3 A=10.21876 B=4.04324 C=2.94978 mu=2.8579 alpha=42.02 epsHOMO=-0.2654 epsLUMO=-0.0575 epsgap=0.2079 =416.7799 zpve=0.065175 U0=-229.927277 U=-229.921622 H=-229.920677 G=-229.955843 Cv=18.723 pbc="F F F" +C -0.00693851 1.49559567 -0.01063358 +C -0.02986170 -0.01594623 0.06248673 +O -0.08815239 -0.63215062 1.10334812 +C 0.02336981 -0.70256747 -1.22062379 +C 0.06738132 -1.26058341 -2.28623129 +H 0.90429806 1.83281887 -0.51655384 +H -0.85338524 1.85556926 -0.60552819 +H -0.05237764 1.91099807 0.99695949 +H 0.10466868 -1.77036047 -3.21832617 +8 +Properties=species:S:1:pos:R:3 A=10.16063 B=4.15847 C=3.0056 mu=3.3351 alpha=37.08 epsHOMO=-0.3007 epsLUMO=-0.0889 epsgap=0.2118 =397.7757 zpve=0.05451 U0=-246.027383 U=-246.022024 H=-246.02108 G=-246.055769 Cv=16.963 pbc="F F F" +C -0.01171097 1.49973776 -0.01213268 +C -0.02919740 -0.00338745 0.07151218 +O -0.09164028 -0.64592927 1.08732241 +C 0.03831104 -0.69690258 -1.23748557 +N 0.09136286 -1.22982650 -2.26228068 +H 0.90093132 1.83370670 -0.51814928 +H -0.85663933 1.84864400 -0.61618135 +H -0.06416540 1.92131542 0.99203818 +8 +Properties=species:S:1:pos:R:3 A=10.68423 B=4.3198 C=3.07993 mu=5.1815 alpha=38.31 epsHOMO=-0.2739 epsLUMO=-0.0438 epsgap=0.2301 =384.5574 zpve=0.056619 U0=-242.19573 U=-242.190591 H=-242.189646 G=-242.223513 Cv=17.465 pbc="F F F" +N -0.05232108 1.34991769 0.15535538 +C 0.08549378 -0.01476951 0.02668890 +N 1.14555215 -0.71993906 -0.03966037 +C -1.19426556 -0.71152088 0.01802151 +N -2.22747610 -1.22790543 0.00132148 +H 0.75474469 1.91998737 -0.04411334 +H -0.94458527 1.76600473 -0.05932293 +H 1.98312429 -0.13415500 -0.02878551 +9 +Properties=species:S:1:pos:R:3 A=9.08854 B=4.42607 C=3.03169 mu=0.9461 alpha=36.51 epsHOMO=-0.2538 epsLUMO=-0.0964 epsgap=0.1574 =399.222 zpve=0.064992 U0=-267.10335 U=-267.097658 H=-267.096714 G=-267.132534 Cv=17.806 pbc="F F F" +C -0.43126066 1.30586664 -0.12758585 +C 0.25285715 -0.01026988 0.13138867 +O 0.69872099 -0.36890333 1.19604690 +C 0.38978943 -0.96773680 -1.06226208 +O -0.01611268 -0.71564293 -2.16583718 +H 0.10006565 1.85324490 -0.91332597 +H -1.44270433 1.13069361 -0.50923371 +H -0.46757554 1.89548158 0.78836479 +H 0.90329886 -1.91558845 -0.79531972 +9 +Properties=species:S:1:pos:R:3 A=10.08927 B=4.54115 C=3.13487 mu=2.7707 alpha=38.09 epsHOMO=-0.2561 epsLUMO=-0.064 epsgap=0.192 =384.4827 zpve=0.067668 U0=-263.278851 U=-263.273589 H=-263.272645 G=-263.306835 Cv=17.972 pbc="F F F" +N -0.16032929 1.08528962 -0.45398652 +C 0.18649127 -0.08762327 0.14758021 +N 1.28979627 -0.46427423 0.67927030 +C -0.94204384 -1.08440264 0.20423621 +O -2.01802205 -0.89007687 -0.30583149 +H 0.54574437 1.73837930 -0.74689246 +H -1.04684920 1.09570857 -0.93607796 +H 2.01738195 0.24991828 0.59881811 +H -0.67740148 -2.01003995 0.74746441 +13 +Properties=species:S:1:pos:R:3 A=7.92874 B=3.8272 C=2.82581 mu=0.6578 alpha=51.2 epsHOMO=-0.2589 epsLUMO=0.0571 epsgap=0.316 =481.9854 zpve=0.112471 U0=-195.186772 U=-195.180446 H=-195.179502 G=-195.215658 Cv=22.569 pbc="F F F" +C -0.01763434 1.54859468 -0.00253584 +C -0.01719180 0.00735789 0.03269604 +C 0.75818463 -0.52820155 1.25278862 +C -1.38213303 -0.51768438 0.00775516 +C -2.50796392 -0.94005629 0.00478552 +H 1.00944396 1.92639613 -0.02632830 +H -0.54514614 1.92217052 -0.88393459 +H -0.51243000 1.95339892 0.88560642 +H 0.49366179 -0.34904155 -0.87265890 +H 0.28968458 -0.19345372 2.18334679 +H 0.77833392 -1.62102506 1.25783727 +H 1.78952492 -0.16181727 1.23574954 +H -3.49998244 -1.31810165 -0.00723572 +12 +Properties=species:S:1:pos:R:3 A=7.90009 B=3.95466 C=2.88643 mu=3.9512 alpha=46.23 epsHOMO=-0.318 epsLUMO=0.0365 epsgap=0.3545 =460.694 zpve=0.102281 U0=-211.295796 U=-211.289821 H=-211.288877 G=-211.324525 Cv=20.467 pbc="F F F" +C -0.00242350 1.55035837 0.01056187 +C -0.01856600 0.01004352 -0.02261770 +C -1.45045318 -0.55766178 0.01293347 +C 0.70125749 -0.48583168 -1.20172764 +N 1.26190946 -0.87126766 -2.13619740 +H 1.01959496 1.93673215 0.00349668 +H -0.52972844 1.96141639 -0.85498386 +H -0.50134251 1.90346839 0.91755862 +H 0.52481877 -0.36222456 0.85525462 +H -2.02427903 -0.21428716 -0.85251869 +H -1.44438296 -1.65026927 0.00754107 +H -1.95805494 -0.21725882 0.91996760 +11 +Properties=species:S:1:pos:R:3 A=8.30095 B=3.97615 C=2.93764 mu=2.7429 alpha=42.87 epsHOMO=-0.2704 epsLUMO=0.0278 epsgap=0.2983 =440.0738 zpve=0.091554 U0=-227.338075 U=-227.332253 H=-227.331309 G=-227.366638 Cv=19.946 pbc="F F F" +C -0.01064295 1.54128691 0.00722087 +C -0.00203811 0.00756015 0.03863463 +N 0.76268677 -0.47101822 1.19250856 +C -1.38541954 -0.52099256 -0.00194097 +N -2.45680847 -0.95636072 0.00694969 +H 1.02043523 1.90106589 0.00392365 +H -0.52873161 1.91193452 -0.88031480 +H -0.51849536 1.94150431 0.89013197 +H 0.50418828 -0.35805500 -0.86276072 +H 0.30070681 -0.18364934 2.05155305 +H 0.78148992 -1.48670299 1.20428183 +11 +Properties=species:S:1:pos:R:3 A=8.55919 B=3.89952 C=2.91869 mu=1.3582 alpha=44.03 epsHOMO=-0.2665 epsLUMO=0.0336 epsgap=0.3001 =444.6452 zpve=0.088908 U0=-231.108368 U=-231.102292 H=-231.101348 G=-231.137061 Cv=21.306 pbc="F F F" +C -0.00754278 1.55566144 0.08650633 +C 0.01207541 0.02096553 0.04935916 +O -1.29150251 -0.52785128 0.22126386 +C 0.65093362 -0.47718651 -1.17430507 +C 1.13902673 -0.86577343 -2.20205518 +H 1.00824243 1.95969458 0.04929733 +H -0.56272245 1.95192010 -0.76978085 +H -0.49328161 1.88929438 1.00704123 +H 0.57811967 -0.34464907 0.91458864 +H -1.78516532 -0.35903262 -0.58909400 +H 1.58078877 -1.22365060 -3.09919447 +10 +Properties=species:S:1:pos:R:3 A=8.55908 B=4.01671 C=2.97882 mu=3.269 alpha=39.28 epsHOMO=-0.3051 epsLUMO=0.0115 epsgap=0.3166 =424.3395 zpve=0.078602 U0=-247.214861 U=-247.209162 H=-247.208218 G=-247.243338 Cv=19.252 pbc="F F F" +C -0.00992462 1.54951908 0.00732200 +C 0.00740485 0.01722020 0.05031270 +O 0.72085722 -0.49630479 1.15864583 +C -1.36995095 -0.52355929 0.00894432 +N -2.45081572 -0.93233138 0.00716912 +H 1.01892314 1.91630447 0.02724149 +H -0.50261490 1.90969362 -0.89997951 +H -0.54800426 1.95377611 0.87053664 +H 0.53602846 -0.36494195 -0.82970945 +H 0.27702643 -0.20644534 1.96421773 +13 +Properties=species:S:1:pos:R:3 A=7.66289 B=3.70925 C=2.79937 mu=2.6921 alpha=46.58 epsHOMO=-0.2469 epsLUMO=-0.0188 epsgap=0.2281 =482.0475 zpve=0.112328 U0=-232.364952 U=-232.358577 H=-232.357633 G=-232.394589 Cv=21.434 pbc="F F F" +C -0.02629647 1.53877116 -0.00783747 +C 0.01468904 0.00095310 0.00166037 +C 0.74737862 -0.53388859 1.24420471 +C -1.40211264 -0.53859257 -0.01557820 +O -1.87620455 -1.23582351 -0.87399559 +H 0.98823696 1.94625080 0.03705522 +H -0.50725090 1.92153422 -0.91285565 +H -0.57756514 1.92360883 0.85796386 +H 0.50584680 -0.36421091 -0.90619124 +H 0.22958380 -0.23909403 2.16431052 +H 0.81692736 -1.62559499 1.22973438 +H 1.76267153 -0.12846566 1.29050755 +H -2.00861510 -0.22792742 0.87121666 +11 +Properties=species:S:1:pos:R:3 A=8.31096 B=4.07963 C=2.92918 mu=2.8354 alpha=39.16 epsHOMO=-0.255 epsLUMO=-0.0279 epsgap=0.2271 =432.1489 zpve=0.088443 U0=-268.287661 U=-268.281505 H=-268.280561 G=-268.316982 Cv=20.344 pbc="F F F" +C -0.05483118 1.46032843 -0.17068647 +C 0.07105714 -0.03524485 0.11225841 +O 0.58204486 -0.33316656 1.40176256 +C -1.27639279 -0.74383027 0.03051185 +O -2.11855775 -0.49643175 -0.79163412 +H 0.93158072 1.93091398 -0.23353204 +H -0.57713995 1.61290939 -1.11835562 +H -0.62444315 1.94776119 0.62573670 +H 0.69687521 -0.50071620 -0.67159471 +H 1.45603316 0.06066659 1.47858584 +H -1.40723217 -1.53388627 0.80211181 +12 +Properties=species:S:1:pos:R:3 A=8.9331 B=4.19405 C=2.96046 mu=3.7163 alpha=44.42 epsHOMO=-0.2424 epsLUMO=0.0327 epsgap=0.2751 =441.85 zpve=0.10227 U0=-248.430371 U=-248.424309 H=-248.423365 G=-248.459383 Cv=19.918 pbc="F F F" +C -0.09776499 1.44917268 0.04561984 +N 0.01043053 0.00373818 -0.00070600 +C 0.05323028 -0.71432112 1.25264891 +C 0.06728716 -0.64067225 -1.20060778 +O 0.03636432 -0.11006515 -2.29109228 +H 0.75650660 1.88747109 0.57647421 +H -0.11648577 1.81632103 -0.98049172 +H -1.01641106 1.75521548 0.56151415 +H -0.85453556 -0.53657675 1.84390168 +H 0.13297722 -1.78696336 1.05851351 +H 0.91637348 -0.40737846 1.85761345 +H 0.14762240 -1.73801339 -1.06805139 +11 +Properties=species:S:1:pos:R:3 A=10.13982 B=3.81346 C=2.86965 mu=2.9514 alpha=39.33 epsHOMO=-0.2699 epsLUMO=-0.0262 epsgap=0.2437 =440.1727 zpve=0.088924 U0=-268.301176 U=-268.295084 H=-268.29414 G=-268.331307 Cv=19.824 pbc="F F F" +C -0.01708808 1.44281136 0.03225501 +C -0.05544542 -0.06560572 -0.02375999 +O -0.17379913 -0.76196233 0.96223129 +C 0.06068107 -0.73615179 -1.38825252 +O 0.00877771 -2.12574390 -1.27749486 +H 0.92062950 1.81463913 -0.39522215 +H -0.83050523 1.86542281 -0.56780350 +H -0.10911975 1.78049045 1.06493675 +H -0.75015067 -0.35235060 -2.03056074 +H 1.00312898 -0.40389029 -1.85592942 +H -0.09063255 -2.29450960 -0.32608019 +13 +Properties=species:S:1:pos:R:3 A=9.55216 B=3.57844 C=2.7341 mu=2.6168 alpha=46.19 epsHOMO=-0.2423 epsLUMO=-0.0072 epsgap=0.2351 =489.8518 zpve=0.112006 U0=-232.377706 U=-232.371073 H=-232.370129 G=-232.408256 Cv=21.716 pbc="F F F" +C -0.04384102 1.54099793 -0.03913814 +C 0.02765132 0.01885817 0.04778773 +C 0.76814644 -0.48842218 1.28000847 +C 0.87850208 -1.99746312 1.42393323 +O 1.24179142 0.26651340 2.09788702 +H 0.95796454 1.97690198 -0.06816012 +H -0.58447717 1.85356031 -0.93690369 +H -0.55173626 1.95737759 0.83440529 +H -0.97692824 -0.42709877 0.05353178 +H 0.51853486 -0.40806507 -0.83809409 +H 1.39924980 -2.42678188 0.56053177 +H 1.42001187 -2.24449367 2.33776426 +H -0.11750602 -2.45360651 1.45141965 +12 +Properties=species:S:1:pos:R:3 A=9.78802 B=3.78441 C=2.84416 mu=3.499 alpha=42.54 epsHOMO=-0.2438 epsLUMO=0.0355 epsgap=0.2793 =457.447 zpve=0.101847 U0=-248.448467 U=-248.441988 H=-248.441044 G=-248.478935 Cv=21.374 pbc="F F F" +C -0.00220144 1.53344329 -0.05960369 +C -0.03235837 0.01206167 0.06840265 +C 0.69666086 -0.48196462 1.31828322 +N 0.98104007 -1.82034162 1.31984698 +O 1.00392124 0.24606232 2.24136749 +H 1.02111190 1.89525169 -0.19182672 +H -0.59707204 1.86206427 -0.91645604 +H -0.39728839 1.99920712 0.84545201 +H -1.06936083 -0.34552935 0.13040806 +H 0.39947165 -0.46906818 -0.81777020 +H 0.63281951 -2.43917647 0.60874785 +H 1.35708014 -2.22217793 2.16303522 +12 +Properties=species:S:1:pos:R:3 A=10.01185 B=3.84195 C=2.87635 mu=3.5402 alpha=43.61 epsHOMO=-0.2418 epsLUMO=0.0387 epsgap=0.2805 =458.9803 zpve=0.101735 U0=-248.443503 U=-248.436899 H=-248.435955 G=-248.474272 Cv=20.967 pbc="F F F" +C 0.00619941 1.45933202 -0.03893859 +N -0.06411616 0.01422963 -0.12046901 +C -1.20595394 -0.68196796 0.16117120 +C -1.08982704 -2.19284899 0.02095775 +O -2.24482911 -0.14443077 0.49994418 +H 0.75053989 1.78372520 0.69715573 +H 0.25692001 1.90395263 -1.00876215 +H -0.97856026 1.81121438 0.27082194 +H 0.75820982 -0.49543660 -0.39464024 +H -0.09909703 -2.53543104 -0.28970003 +H -1.34097671 -2.65395851 0.97972885 +H -1.82903100 -2.53483935 -0.70813076 +11 +Properties=species:S:1:pos:R:3 A=10.44045 B=4.04692 C=2.98547 mu=3.5648 alpha=39.51 epsHOMO=-0.2436 epsLUMO=0.0599 epsgap=0.3034 =428.404 zpve=0.091713 U0=-264.504487 U=-264.498452 H=-264.497508 G=-264.533633 Cv=20.274 pbc="F F F" +C 0.00922630 1.45021814 -0.03194543 +N -0.01429488 -0.00054646 -0.01782667 +C -1.21576579 -0.67252403 0.04421896 +N -1.09733352 -2.04644898 -0.15997741 +O -2.28599299 -0.12893711 0.24196027 +H 0.89659038 1.81885022 0.49120949 +H 0.00233950 1.86388504 -1.04914155 +H -0.88562684 1.79943346 0.48353298 +H 0.75257305 -0.47506631 -0.46719265 +H -0.24882333 -2.48772194 0.16375654 +H -1.93419610 -2.53898393 0.11482880 +12 +Properties=species:S:1:pos:R:3 A=9.69683 B=4.1533 C=3.01703 mu=1.1876 alpha=43.57 epsHOMO=-0.2595 epsLUMO=0.0352 epsgap=0.2948 =443.1687 zpve=0.102062 U0=-248.416462 U=-248.410358 H=-248.409414 G=-248.445651 Cv=20.256 pbc="F F F" +C -0.09160695 1.37540046 -0.00729426 +O -0.06964534 -0.04831581 -0.11148812 +C 0.68114625 -0.56142673 -1.10732458 +C 0.60405298 -2.06701550 -1.08766892 +N 1.32645533 0.19266343 -1.89967731 +H 0.91463916 1.76843655 0.16257460 +H -0.48562826 1.82624615 -0.92235216 +H -0.73971430 1.60007423 0.84110605 +H -0.43430065 -2.39242162 -1.20325205 +H 1.20627110 -2.50049977 -1.88745640 +H 0.95651337 -2.44976670 -0.12501838 +H 1.83504115 -0.36104361 -2.58486055 +11 +Properties=species:S:1:pos:R:3 A=10.20392 B=4.16834 C=3.07281 mu=1.7569 alpha=39.33 epsHOMO=-0.2685 epsLUMO=0.0174 epsgap=0.2859 =427.6606 zpve=0.089436 U0=-268.32127 U=-268.315051 H=-268.314106 G=-268.351214 Cv=19.501 pbc="F F F" +C 0.07295254 1.38840919 0.06442046 +O 0.21049114 -0.03740028 0.04612736 +C 0.50102805 -0.57224288 -1.15975346 +C 0.62218715 -2.07378323 -1.06030684 +O 0.63922154 0.08224418 -2.16157325 +H 1.00029720 1.87062570 -0.25532064 +H -0.73338957 1.70782089 -0.60080454 +H -0.15751280 1.65154060 1.09692954 +H -0.31330001 -2.50202851 -0.68941906 +H 0.85646588 -2.48430275 -2.04157352 +H 1.40651685 -2.34055496 -0.34634301 +10 +Properties=species:S:1:pos:R:3 A=10.68182 B=4.39532 C=3.17969 mu=2.329 alpha=35.5 epsHOMO=-0.2669 epsLUMO=0.0575 epsgap=0.3244 =398.5908 zpve=0.079271 U0=-284.385189 U=-284.379361 H=-284.378417 G=-284.414085 Cv=19.084 pbc="F F F" +C -0.02645771 1.38305753 0.02085660 +O 0.04139566 -0.04439503 -0.00277452 +C 0.66775338 -0.56001625 -1.09000344 +N 0.72605063 -1.92219983 -0.98822954 +O 1.12952381 0.09648143 -1.99322180 +H 0.97529779 1.82044307 0.02387306 +H -0.57085698 1.76214621 -0.84790425 +H -0.55410722 1.63835731 0.94043594 +H 0.12662696 -2.38401590 -0.32566929 +H 0.97230070 -2.41798421 -1.82732573 +10 +Properties=species:S:1:pos:R:3 A=10.20696 B=3.93135 C=2.9219 mu=4.5676 alpha=35.87 epsHOMO=-0.246 epsLUMO=0.0273 epsgap=0.2733 =418.5967 zpve=0.078222 U0=-284.360325 U=-284.354148 H=-284.353204 G=-284.390143 Cv=20.089 pbc="F F F" +N -0.08115607 1.31807026 0.01276742 +C 0.05442259 -0.04477733 0.08155388 +O 1.12163074 -0.59783950 0.20940553 +C -1.28687786 -0.79011642 0.06178435 +O -1.04605114 -2.13954195 -0.23957158 +H 0.76623366 1.85991128 -0.04483425 +H -0.93021346 1.74567447 -0.31565615 +H -1.74559696 -0.65521334 1.05526700 +H -1.96026061 -0.31149222 -0.67026256 +H -1.85637296 -2.63017646 -0.07625478 +10 +Properties=species:S:1:pos:R:3 A=10.14389 B=4.0714 C=3.02223 mu=5.3004 alpha=35.19 epsHOMO=-0.2527 epsLUMO=0.0208 epsgap=0.2735 =408.0279 zpve=0.080317 U0=-284.372483 U=-284.367172 H=-284.366228 G=-284.40095 Cv=17.931 pbc="F F F" +N 0.01838100 0.93057357 0.04943058 +H -0.70674506 0.56116798 -0.55550134 +H 0.68248307 0.18430002 0.21487099 +H 0.21928084 2.79858558 -0.32670585 +C -0.54586914 1.44688585 1.30274586 +C -0.80466975 2.96030569 1.21052835 +O -0.21468822 3.53648884 0.15531687 +O -1.45295676 3.56338618 2.02143528 +H -1.47662579 0.96512183 1.62072169 +H 0.17781209 1.30324286 2.11157176 +13 +Properties=species:S:1:pos:R:3 A=6.6508 B=4.19317 C=3.39441 mu=2.2854 alpha=42.01 epsHOMO=-0.2597 epsLUMO=0.0631 epsgap=0.3228 =438.3028 zpve=0.11345 U0=-269.479234 U=-269.472993 H=-269.472049 G=-269.508213 Cv=22.072 pbc="F F F" +C -0.02775167 1.53421433 0.00651151 +C 0.08343246 0.01218277 0.05258986 +O 0.95856392 -0.48200710 -0.96694113 +C 0.69767574 -0.49516451 1.35948812 +O 2.02247062 -0.02842530 1.52222186 +H 0.94333763 1.98841434 0.21841589 +H -0.37320516 1.87354041 -0.97716908 +H -0.74773817 1.89256394 0.74926853 +H -0.91671848 -0.43697036 -0.06040528 +H 0.76726710 -0.01412177 -1.78502043 +H 0.11650002 -0.13351914 2.21392431 +H 0.65814685 -1.59563445 1.36274474 +H 2.46378566 -0.22762476 0.68698431 +17 +Properties=species:S:1:pos:R:3 A=7.26511 B=3.32874 C=2.54491 mu=0.0618 alpha=56.26 epsHOMO=-0.3085 epsLUMO=0.085 epsgap=0.3934 =565.8412 zpve=0.159632 U0=-197.629387 U=-197.622325 H=-197.621381 G=-197.659365 Cv=25.169 pbc="F F F" +C 0.05879035 1.56174169 -0.01945240 +C -0.01544024 0.03182306 0.00308332 +C -1.44103237 -0.54862028 0.05028629 +C -1.40777007 -2.07231030 -0.13012010 +C -2.18400529 -0.17659759 1.34114303 +H 1.09435638 1.90233607 -0.11900072 +H -0.50689566 1.97217319 -0.86388098 +H -0.34407951 2.00628082 0.89579522 +H 0.48926758 -0.36011214 -0.88953902 +H 0.55254938 -0.35139446 0.86269887 +H -2.00031575 -0.12153682 -0.79559684 +H -0.85501131 -2.55065810 0.68775438 +H -2.41787513 -2.49543628 -0.13720127 +H -0.91928762 -2.35363802 -1.06914014 +H -3.19100197 -0.60699559 1.35137051 +H -1.65197294 -0.56010584 2.22063481 +H -2.28793759 0.90575132 1.46079572 +15 +Properties=species:S:1:pos:R:3 A=8.11598 B=3.43678 C=2.66869 mu=1.3894 alpha=49.45 epsHOMO=-0.2617 epsLUMO=0.0733 epsgap=0.335 =521.8605 zpve=0.136091 U0=-233.555951 U=-233.549143 H=-233.548199 G=-233.585602 Cv=23.99 pbc="F F F" +C -0.03841227 1.55621396 0.00935837 +C 0.01907135 0.02716079 -0.02074203 +C 0.73141506 -0.52709328 -1.25454422 +C 0.83975868 -2.05206973 -1.22872655 +O -0.01226470 -0.08514394 -2.38973758 +H 0.96845664 1.98863424 0.03526234 +H -0.54377006 1.93824134 -0.88074407 +H -0.57652955 1.91383386 0.89256698 +H 0.53166867 -0.34991486 0.87240999 +H -0.99727186 -0.38638654 -0.00185289 +H 1.74909346 -0.09943025 -1.28826184 +H 1.34143968 -2.42487137 -2.12957624 +H 1.41822012 -2.39229108 -0.36340871 +H -0.15616765 -2.50443859 -1.18308875 +H 0.43090825 -0.40901616 -3.17979642 +15 +Properties=species:S:1:pos:R:3 A=7.55335 B=3.78323 C=2.80566 mu=1.0758 alpha=49.8 epsHOMO=-0.2476 epsLUMO=0.086 epsgap=0.3336 =507.9614 zpve=0.135681 U0=-233.545899 U=-233.539034 H=-233.53809 G=-233.57582 Cv=23.573 pbc="F F F" +C -0.00857605 1.38097833 0.09454670 +O -0.02255106 -0.00739461 -0.13062576 +C -1.30243341 -0.61997805 -0.02088309 +C -1.18687286 -1.97885751 -0.70303918 +C -1.75587824 -0.74662760 1.43714508 +H 1.00321550 1.73258087 -0.12443496 +H -0.71511468 1.90838275 -0.56674280 +H -0.24909065 1.64967237 1.13384681 +H -2.03737978 -0.00432241 -0.56884198 +H -0.44792779 -2.59945605 -0.18596870 +H -2.14751041 -2.50225525 -0.69102581 +H -0.86524212 -1.85860679 -1.74077836 +H -2.73321482 -1.23674908 1.49205117 +H -1.03621350 -1.34483828 2.00544671 +H -1.84898410 0.22935483 1.92198087 +15 +Properties=species:S:1:pos:R:3 A=6.14183 B=5.17679 C=3.79297 mu=0.1068 alpha=52.92 epsHOMO=-0.2633 epsLUMO=0.0893 epsgap=0.3526 =439.1643 zpve=0.137025 U0=-196.409349 U=-196.403398 H=-196.402453 G=-196.437676 Cv=22.258 pbc="F F F" +C -0.03913204 1.50456305 0.04978913 +C 0.00985856 -0.01113880 0.01248619 +C -1.24167981 -0.66663044 -0.53989979 +C 1.33803387 -0.66895748 -0.27400430 +C 0.75126442 -0.72221586 1.11862571 +H 0.88633040 1.92490040 0.45579358 +H -0.18183878 1.92045743 -0.95489291 +H -0.86832076 1.85815718 0.67439648 +H -1.43570890 -0.34344387 -1.56976411 +H -1.15326757 -1.75757800 -0.54433832 +H -2.12221416 -0.40570820 0.05951361 +H 1.34398374 -1.58235208 -0.86005084 +H 2.20196897 -0.03329084 -0.43929326 +H 1.21949576 -0.12246018 1.89246580 +H 0.36153319 -1.67153717 1.47171932 +13 +Properties=species:S:1:pos:R:3 A=6.49534 B=5.52329 C=3.9108 mu=1.8235 alpha=45.7 epsHOMO=-0.2596 epsLUMO=0.091 epsgap=0.3505 =405.521 zpve=0.112851 U0=-232.335768 U=-232.329981 H=-232.329037 G=-232.364091 Cv=20.719 pbc="F F F" +C -0.03970330 1.50954998 -0.04112233 +C -0.03023556 -0.00335329 -0.06498361 +C -1.24613189 -0.68356648 0.52531190 +C 0.78937201 -0.71129193 -1.06027559 +O 1.22546798 -0.60059036 0.29712283 +H 0.88992772 1.90948478 -0.45296558 +H -0.87952723 1.90350108 -0.62376642 +H -0.14448576 1.87590604 0.98604429 +H -2.15218727 -0.41012616 -0.02629495 +H -1.13412584 -1.77005431 0.49747032 +H -1.38586631 -0.38055453 1.56882757 +H 0.50712690 -1.71386874 -1.38085018 +H 1.37088104 -0.14369322 -1.78640853 +13 +Properties=species:S:1:pos:R:3 A=6.57648 B=5.31603 C=3.98453 mu=1.3822 alpha=45.85 epsHOMO=-0.2494 epsLUMO=0.0776 epsgap=0.327 =401.4888 zpve=0.113237 U0=-232.33341 U=-232.327734 H=-232.32679 G=-232.36147 Cv=21.17 pbc="F F F" +C -0.03714052 1.53215920 0.01332310 +C 0.01344335 0.02117019 0.01922005 +O -1.17476104 -0.59735284 -0.40931260 +C 1.30744798 -0.69902106 -0.27389650 +C 0.70844749 -0.71373504 1.12226318 +H 0.89026861 1.96240279 0.40276135 +H -0.17846151 1.91561262 -1.00518522 +H -0.87011232 1.88955201 0.62730953 +H -1.28352265 -0.40225391 -1.34690641 +H 1.23973813 -1.61642115 -0.84783774 +H 2.20543993 -0.11523820 -0.44744474 +H 1.19539159 -0.13889834 1.90240284 +H 0.24735439 -1.63670241 1.45378480 +10 +Properties=species:S:1:pos:R:3 A=12.18399 B=5.1384 C=3.78868 mu=2.5732 alpha=40.19 epsHOMO=-0.263 epsLUMO=0.0277 epsgap=0.2907 =352.0378 zpve=0.080558 U0=-247.201165 U=-247.196699 H=-247.195755 G=-247.22841 Cv=15.51 pbc="F F F" +N -0.04445152 1.25623533 0.31681915 +C -0.03914559 0.04913710 -0.01670558 +C -1.08749619 -1.04164446 -0.11488033 +C 0.09869688 -1.90754844 -0.58225894 +O 0.99647508 -0.76306629 -0.44028010 +H 0.88935980 1.66481350 0.24916893 +H -1.54324114 -1.32235812 0.83572172 +H -1.86910036 -0.85713839 -0.85325910 +H 0.39739753 -2.72227350 0.08158721 +H 0.06945080 -2.25418345 -1.61796084 +11 +Properties=species:S:1:pos:R:3 A=10.79571 B=4.78732 C=3.54292 mu=2.7119 alpha=42.77 epsHOMO=-0.2415 epsLUMO=-0.0194 epsgap=0.2222 =379.6371 zpve=0.090544 U0=-231.15578 U=-231.150804 H=-231.149859 G=-231.184401 Cv=17.076 pbc="F F F" +O -0.00101746 0.01846628 -0.20114742 +C -0.01405811 1.19658059 0.00205306 +C -1.13542911 2.22979148 0.21957980 +C -0.03500884 3.29097637 0.53052223 +C 1.08469664 2.25947795 0.18994331 +H -1.71642814 2.41772662 -0.68901078 +H -1.83392757 1.98415059 1.02444244 +H -0.05534741 4.17585264 -0.10670963 +H -0.02541477 3.61399048 1.57278917 +H 1.81074389 2.03288534 0.97578973 +H 1.63600801 2.46255380 -0.73376244 +10 +Properties=species:S:1:pos:R:3 A=12.23436 B=4.97895 C=3.70561 mu=3.6671 alpha=39.73 epsHOMO=-0.25 epsLUMO=0.038 epsgap=0.288 =355.0934 zpve=0.080442 U0=-247.225618 U=-247.220897 H=-247.219953 G=-247.253218 Cv=16.1 pbc="F F F" +O 0.03184134 -0.03461682 0.00849836 +C -0.02440334 1.16440533 0.02160811 +C -1.14541322 2.23712809 0.03012901 +C 0.00928805 3.27945878 0.04557758 +N 0.93843838 2.14652109 0.03554396 +H -1.77030529 2.23779730 -0.86428437 +H -1.77632809 2.21765386 0.92007934 +H 0.07170564 3.91863516 -0.84072193 +H 0.06622603 3.89826625 0.94657952 +H 1.94616840 2.09535713 0.03855945 +9 +Properties=species:S:1:pos:R:3 A=12.44643 B=5.23328 C=3.86599 mu=3.9339 alpha=35.4 epsHOMO=-0.2788 epsLUMO=0.0089 epsgap=0.2878 =336.0792 zpve=0.068574 U0=-267.106213 U=-267.101929 H=-267.100985 G=-267.13332 Cv=14.483 pbc="F F F" +O 0.04424004 0.03933243 -0.33071104 +C -0.04854479 1.17416230 0.00410076 +C -1.14211656 2.23611850 0.15338361 +C 0.02332538 3.12357010 0.61681625 +O 0.95663808 2.01190122 0.42603746 +H -1.62573755 2.51482212 -0.78401102 +H -1.90009213 1.99553386 0.90028663 +H 0.28368077 3.96172751 -0.03229287 +H 0.00782250 3.43942655 1.66162725 +10 +Properties=species:S:1:pos:R:3 A=11.54185 B=4.90368 C=3.63309 mu=2.5257 alpha=39.34 epsHOMO=-0.2437 epsLUMO=-0.0258 epsgap=0.2179 =359.152 zpve=0.07965 U0=-247.190194 U=-247.185543 H=-247.184599 G=-247.217688 Cv=16.083 pbc="F F F" +O 0.00053891 0.00665475 -0.09743049 +C -0.01371990 1.19213881 0.03139936 +C -1.10668681 2.26612284 0.17247913 +N -0.03543445 3.25123475 0.48533693 +C 1.05328615 2.29521506 0.14383904 +H -1.65047970 2.42796175 -0.76886054 +H -1.83606786 2.11370530 0.97567410 +H -0.05434600 4.07193609 -0.10727051 +H 1.80754206 2.16277968 0.92736250 +H 1.56737937 2.47130277 -0.81152688 +9 +Properties=species:S:1:pos:R:3 A=12.18264 B=4.94228 C=3.68162 mu=0.8477 alpha=35.94 epsHOMO=-0.2647 epsLUMO=-0.0352 epsgap=0.2295 =344.5473 zpve=0.066989 U0=-267.068488 U=-267.063976 H=-267.063032 G=-267.095887 Cv=15.115 pbc="F F F" +O -0.00031692 0.00676321 -0.17139774 +C -0.01417098 1.18672865 -0.00980279 +C -1.08283120 2.27653381 0.15574094 +O -0.03856115 3.26460423 0.27513986 +C 1.02857270 2.30515693 0.12774311 +H -1.72923855 2.43647507 -0.71671274 +H -1.70219898 2.19346725 1.05800754 +H 1.67366781 2.23923293 1.01324179 +H 1.64705068 2.48224548 -0.76148355 +15 +Properties=species:S:1:pos:R:3 A=9.63416 B=4.10254 C=3.28665 mu=0.095 alpha=52.94 epsHOMO=-0.2896 epsLUMO=0.0927 epsgap=0.3823 =455.0215 zpve=0.138424 U0=-196.407957 U=-196.40245 H=-196.401505 G=-196.436159 Cv=20.299 pbc="F F F" +C -0.47005934 1.44206547 -0.06684548 +C 0.14287306 0.05485144 0.03747984 +C 1.37254693 -0.30295273 -0.84679168 +C 1.95947994 -1.09364561 0.35326039 +C 0.99887433 -0.30768787 1.28563099 +H 0.29210839 2.21844829 0.06844100 +H -0.93614604 1.60094605 -1.04612799 +H -1.24148161 1.59707353 0.69627593 +H -0.63517341 -0.70560132 -0.10055095 +H 1.19338376 -0.84118177 -1.78129390 +H 1.96867777 0.58857708 -1.07004184 +H 1.69873597 -2.15500718 0.30521100 +H 3.03253510 -1.01077235 0.54148058 +H 1.48290386 0.58242428 1.70211026 +H 0.51304296 -0.84979686 2.10121062 +13 +Properties=species:S:1:pos:R:3 A=9.93129 B=4.56362 C=3.63704 mu=1.6826 alpha=45.72 epsHOMO=-0.241 epsLUMO=0.0915 epsgap=0.3325 =407.6909 zpve=0.11459 U0=-232.33123 U=-232.325877 H=-232.324933 G=-232.359589 Cv=18.582 pbc="F F F" +C -0.32308228 1.53751451 0.01947624 +C 0.11847214 0.08900172 -0.00523140 +C 0.87489284 -0.43763303 -1.24721738 +C 1.97841048 -0.80657483 -0.23740356 +O 1.27344926 -0.15419108 0.83794040 +H 0.49211985 2.19658795 -0.29527664 +H -1.17615835 1.68923490 -0.65134808 +H -0.62776963 1.82747912 1.03013205 +H -0.71410200 -0.56389187 0.29597305 +H 0.41033314 -1.26269706 -1.78910031 +H 1.15560811 0.34596269 -1.95459519 +H 2.09501012 -1.88349764 -0.05606083 +H 2.96970344 -0.36924147 -0.40408009 +13 +Properties=species:S:1:pos:R:3 A=10.13697 B=4.32512 C=3.50912 mu=1.8995 alpha=45.45 epsHOMO=-0.2419 epsLUMO=0.0814 epsgap=0.3233 =414.1575 zpve=0.114694 U0=-232.325947 U=-232.320548 H=-232.319604 G=-232.354576 Cv=18.443 pbc="F F F" +C -0.18371124 1.54668909 -0.01671129 +C 0.04513382 0.04386724 0.02270494 +C 1.20301104 -0.54034580 -0.81983464 +O 1.80061686 -1.15530615 0.33924991 +C 0.83391983 -0.54313754 1.21648003 +H 0.75102609 2.09256015 0.15344911 +H -0.58319248 1.86155707 -0.98694169 +H -0.89843724 1.85917126 0.75244153 +H -0.89506736 -0.48768372 -0.14843995 +H 0.93560472 -1.27857588 -1.58543917 +H 1.86392938 0.21379924 -1.27081649 +H 1.29414565 0.20948993 1.87273952 +H 0.31517042 -1.28326856 1.83756393 +13 +Properties=species:S:1:pos:R:3 A=10.09703 B=4.26865 C=3.40487 mu=1.4604 alpha=45.55 epsHOMO=-0.256 epsLUMO=0.0801 epsgap=0.3361 =413.9118 zpve=0.115063 U0=-232.333258 U=-232.328097 H=-232.327153 G=-232.361103 Cv=19.023 pbc="F F F" +O 0.54622847 1.03270424 -0.58398083 +C -0.00112269 -0.11036621 0.01898238 +C 0.13945950 -0.34310429 1.54777117 +C -1.26863784 -0.99876517 1.51632654 +C -1.53844651 -0.26418236 0.17423510 +H 0.20332379 1.80433874 -0.12071219 +H 0.41296647 -0.95857955 -0.53560402 +H 0.98890738 -0.92719626 1.90921867 +H 0.11786549 0.61323034 2.08356053 +H -1.20828813 -2.08191064 1.38036699 +H -1.94143614 -0.79119746 2.35014116 +H -2.00495682 0.71307933 0.34581493 +H -2.09160311 -0.78230202 -0.61249171 +11 +Properties=species:S:1:pos:R:3 A=10.85394 B=4.52867 C=3.62328 mu=2.4158 alpha=38.58 epsHOMO=-0.2465 epsLUMO=0.0604 epsgap=0.3069 =374.4087 zpve=0.091005 U0=-268.248371 U=-268.243234 H=-268.24229 G=-268.276572 Cv=17.344 pbc="F F F" +O 0.07721714 1.41738724 -0.14439016 +C 0.01675156 0.02484791 0.03233817 +C 0.11193823 -0.54392541 1.47000744 +O -1.16387804 -1.20093191 1.32441605 +C -1.41930178 -0.52040930 0.07750673 +H 1.00022214 1.67889479 -0.21697466 +H 0.66036495 -0.50380879 -0.68180327 +H 0.91806589 -1.25385265 1.68878628 +H 0.09146208 0.24427487 2.23499232 +H -2.16139683 0.28183960 0.18222436 +H -1.72867456 -1.20941157 -0.71550887 +15 +Properties=species:S:1:pos:R:3 A=7.14221 B=4.37083 C=3.30265 mu=0.1023 alpha=52.92 epsHOMO=-0.2632 epsLUMO=0.094 epsgap=0.3573 =465.3301 zpve=0.137341 U0=-196.406419 U=-196.40034 H=-196.399396 G=-196.435152 Cv=22.005 pbc="F F F" +C -0.05189850 1.55217435 -0.10318438 +C 0.01226648 0.04690675 0.03747520 +C 1.30115692 -0.70661553 -0.19725724 +C 0.70431939 -0.64893239 1.19003562 +C 1.39750324 0.09481280 2.31078011 +H 0.87404209 2.03543171 0.22162228 +H -0.21641357 1.83695278 -1.14852958 +H -0.87157646 1.97673684 0.48797046 +H -0.88508206 -0.45596941 -0.31580786 +H 1.27663658 -1.64149022 -0.74697967 +H 2.19424067 -0.11404121 -0.37569359 +H 0.21672461 -1.56377934 1.51902400 +H 1.91317356 0.99051175 1.95271747 +H 0.68738009 0.40901468 3.08446972 +H 2.14934633 -0.54151807 2.79111543 +13 +Properties=species:S:1:pos:R:3 A=7.36997 B=4.78662 C=3.53123 mu=1.3092 alpha=45.84 epsHOMO=-0.2518 epsLUMO=0.0822 epsgap=0.334 =418.298 zpve=0.113827 U0=-232.32907 U=-232.323327 H=-232.322383 G=-232.357426 Cv=20.702 pbc="F F F" +C -0.07992786 1.55914739 -0.03875994 +C 0.00042206 0.05111569 0.04346551 +C 1.31748624 -0.66230034 -0.20269965 +C 0.71624326 -0.61854924 1.18128126 +O 1.28134126 0.21474798 2.15341739 +H 0.80207677 2.01979988 0.41147972 +H -0.15235410 1.89225261 -1.07968732 +H -0.95836082 1.93564781 0.49643179 +H -0.88615174 -0.46939753 -0.30918496 +H 1.32384464 -1.60086657 -0.74666557 +H 2.18619315 -0.03316813 -0.37068758 +H 0.28509951 -1.54025035 1.57291630 +H 2.12931661 -0.16234387 2.40895930 +14 +Properties=species:S:1:pos:R:3 A=7.53724 B=4.74514 C=3.54049 mu=1.2483 alpha=49.79 epsHOMO=-0.2199 epsLUMO=0.0931 epsgap=0.313 =432.5081 zpve=0.125556 U0=-212.438188 U=-212.432286 H=-212.431342 G=-212.466725 Cv=20.993 pbc="F F F" +C -0.17034561 1.55765735 -0.10065470 +C 0.01075256 0.05574638 -0.05225833 +C 0.71794239 -0.67802425 -1.14204150 +N 1.29811574 -0.59777508 0.19386866 +C 2.50047290 0.20256923 0.36428818 +H 0.60876703 2.05717913 -0.68119301 +H -1.13238698 1.79957181 -0.56489127 +H -0.17350949 1.98946323 0.90659028 +H -0.81010441 -0.46148051 0.44427396 +H 0.39136106 -1.66274618 -1.46771171 +H 1.16668484 -0.06908735 -1.92776126 +H 2.58340476 1.06745445 -0.31262255 +H 2.55143652 0.56892747 1.39502638 +H 3.37185012 -0.43769461 0.19201862 +13 +Properties=species:S:1:pos:R:3 A=8.15202 B=4.38313 C=3.43318 mu=1.8159 alpha=46.02 epsHOMO=-0.2573 epsLUMO=0.0984 epsgap=0.3557 =432.2224 zpve=0.113178 U0=-232.334436 U=-232.32857 H=-232.327626 G=-232.363064 Cv=20.451 pbc="F F F" +C -0.03345961 1.54674842 -0.13373520 +C -0.04966080 0.05914273 0.10861437 +O 1.17261123 -0.65888877 -0.09925231 +C 0.62653087 -0.62548063 1.22492030 +C 1.43849738 0.05647689 2.29618065 +H 0.84261573 2.02417904 0.30895947 +H -0.02020603 1.75197977 -1.20938503 +H -0.93419215 2.01073729 0.28317577 +H -0.92262410 -0.44789053 -0.31001063 +H 0.19593793 -1.58039168 1.53656778 +H 1.84118250 1.01302927 1.95813013 +H 0.82514514 0.22925358 3.18745348 +H 2.28152757 -0.57796414 2.58961605 diff --git a/latest/_downloads/c870c524cd59017137a48f0e141edd5f/run_ase.ipynb b/latest/_downloads/c870c524cd59017137a48f0e141edd5f/run_ase.ipynb new file mode 100644 index 000000000..db8249b64 --- /dev/null +++ b/latest/_downloads/c870c524cd59017137a48f0e141edd5f/run_ase.ipynb @@ -0,0 +1,266 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# Running molecular dynamics with ASE\n\nThis tutorial demonstrates how to use an already trained and exported model to run an\nASE simulation of a single ethanol molecule in vacuum. We use a model that was trained\nusing the `architecture-soap-bpnn` architecture on 100 ethanol systems\ncontaining energies and forces. You can obtain the :download:`dataset file\n` used in this example from our website. The dataset is a\nsubset of the [rMD17 dataset](https://iopscience.iop.org/article/10.1088/2632-2153/abba6f/meta).\n\nThe model was trained using the following training options.\n\n.. literalinclude:: options.yaml\n :language: yaml\n\nYou can use the pretrained and exported :download:`model `\nor train the model yourself with\n\n.. literalinclude:: train.sh\n :language: bash\n\nA detailed step-by-step introduction on how to train a model is provided in\nthe `label_basic_usage` tutorial.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, we start by importing the necessary libraries, including the integration of ASE\ncalculators for metatensor atomistic models.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import ase.md\nimport ase.md.velocitydistribution\nimport ase.units\nimport ase.visualize.plot\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom ase.geometry.analysis import Analysis\nfrom metatensor.torch.atomistic.ase_calculator import MetatensorCalculator" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Note

We have to import ``rascaline.torch`` even though it is not used explicitly in this\n tutorial. The SOAP-BPNN model contains compiled extensions and therefore the import\n is required.

\n\n## Setting up the simulation\n\nNext, we initialize the simulation by extracting the initial positions from the\ndataset file which we initially trained the model on.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "train_frames = ase.io.read(\"ethanol_reduced_100.xyz\", \":\")\natoms = train_frames[0].copy()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Below we show the initial configuration of a single ethanol molecule in vacuum.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "ase.visualize.plot.plot_atoms(atoms)\n\nplt.xlabel(\"\u00c5\")\nplt.ylabel(\"\u00c5\")\n\nplt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our initial coordinates do not include velocities. We initialize the velocities\naccording to a Maxwell-Boltzmann Distribution at 300 K.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "ase.md.velocitydistribution.MaxwellBoltzmannDistribution(atoms, temperature_K=300)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now register our exported model as the energy calculator to obtain energies and\nforces.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "atoms.calc = MetatensorCalculator(\"model.pt\", extensions_directory=\"extensions/\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we define the integrator which we use to obtain new positions and velocities\nbased on our energy calculator. We use a common timestep of 0.5 fs.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "integrator = ase.md.VelocityVerlet(atoms, timestep=0.5 * ase.units.fs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run the simulation\n\nWe now have everything ready to run the MD simulation at constant energy (NVE). To\nkeep the execution time of this tutorial small we run the simulations only for 100\nsteps. If you want to run a longer simulation you can increase the ``n_steps``\nvariable.\n\nDuring the simulation loop we collect data about the simulation for later analysis.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "n_steps = 100\n\npotential_energy = np.zeros(n_steps)\nkinetic_energy = np.zeros(n_steps)\ntotal_energy = np.zeros(n_steps)\ntrajectory = []\n\nfor step in range(n_steps):\n # run a single simulation step\n integrator.run(1)\n\n trajectory.append(atoms.copy())\n potential_energy[step] = atoms.get_potential_energy()\n kinetic_energy[step] = atoms.get_kinetic_energy()\n total_energy[step] = atoms.get_total_energy()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Analyse the results\n\n### Energy conservation\n\nFor a first analysis, we plot the evolution of the mean of the kinetic, potential, and\ntotal energy which is an important measure for the stability of a simulation.\n\nAs shown below we see that both the kinetic, potential, and total energy\nfluctuate but the total energy is conserved over the length of the simulation.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "plt.plot(potential_energy - potential_energy.mean(), label=\"potential energy\")\nplt.plot(kinetic_energy - kinetic_energy.mean(), label=\"kinetic energy\")\nplt.plot(total_energy - total_energy.mean(), label=\"total energy\")\n\nplt.xlabel(\"step\")\nplt.ylabel(\"energy / kcal/mol\")\nplt.legend()\n\nplt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Inspect the systems\n\nEven though the total energy is conserved, we also have to verify that the ethanol\nmolecule is stable and the bonds did not break.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "animation = ase.visualize.plot.animate(trajectory, interval=100, save_count=None)\nplt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Carbon-hydrogen radial distribution function\n\nAs a final analysis we also calculate and plot the carbon-hydrogen radial distribution\nfunction (RDF) from the trajectory and compare this to the RDF from the training set.\n\nTo use the RDF code from ase we first have to define a unit cell for our systems.\nWe choose a cubic one with a side length of 10 \u00c5.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "for atoms in train_frames:\n atoms.cell = 10 * np.ones(3)\n atoms.pbc = True\n\nfor atoms in trajectory:\n atoms.cell = 10 * np.ones(3)\n atoms.pbc = True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now can initilize the :py:class:`ase.geometry.analysis.Analysis` objects and\ncompute the the RDF using the :py:meth:`ase.geometry.analysis.Analysis.get_rdf`\nmethod.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "ana_traj = Analysis(trajectory)\nana_train = Analysis(train_frames)\n\nrdf_traj = ana_traj.get_rdf(rmax=5, nbins=50, elements=[\"C\", \"H\"], return_dists=True)\nrdf_train = ana_train.get_rdf(rmax=5, nbins=50, elements=[\"C\", \"H\"], return_dists=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We extract the bin positions from the returned values and and averege the RDF over the\nwhole trajectory and dataset, respectively.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "bins = rdf_traj[0][1]\nrdf_traj_mean = np.mean([rdf_traj[i][0] for i in range(n_steps)], axis=0)\nrdf_train_mean = np.mean([rdf_train[i][0] for i in range(n_steps)], axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting the RDF verifies that the hydrogen bonds are stable, confirming that we\nperformed an energy-conserving and stable simulation.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "plt.plot(bins, rdf_traj_mean, label=\"trajectory\")\nplt.plot(bins, rdf_train_mean, label=\"training set\")\n\nplt.legend()\nplt.xlabel(\"r / \u00c5\")\nplt.ylabel(\"radial distribution function\")\n\nplt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/latest/_images/sphx_glr_run_ase_001.png b/latest/_images/sphx_glr_run_ase_001.png new file mode 100644 index 000000000..a5e1cc34f Binary files /dev/null and b/latest/_images/sphx_glr_run_ase_001.png differ diff --git a/latest/_images/sphx_glr_run_ase_002.png b/latest/_images/sphx_glr_run_ase_002.png new file mode 100644 index 000000000..5736896ed Binary files /dev/null and b/latest/_images/sphx_glr_run_ase_002.png differ diff --git a/latest/_images/sphx_glr_run_ase_004.png b/latest/_images/sphx_glr_run_ase_004.png new file mode 100644 index 000000000..4bc94c47d Binary files /dev/null and b/latest/_images/sphx_glr_run_ase_004.png differ diff --git a/latest/_modules/index.html b/latest/_modules/index.html new file mode 100644 index 000000000..836976e0d --- /dev/null +++ b/latest/_modules/index.html @@ -0,0 +1,398 @@ + + + + + + + + Overview: module code - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/cli/eval.html b/latest/_modules/metatrain/cli/eval.html new file mode 100644 index 000000000..ede91c7aa --- /dev/null +++ b/latest/_modules/metatrain/cli/eval.html @@ -0,0 +1,676 @@ + + + + + + + + metatrain.cli.eval - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.cli.eval

+import argparse
+import itertools
+import logging
+from pathlib import Path
+from typing import Dict, List, Optional, Union
+
+import metatensor.torch
+import torch
+from metatensor.torch import Labels, TensorBlock, TensorMap
+from metatensor.torch.atomistic import MetatensorAtomisticModel
+from omegaconf import DictConfig, OmegaConf
+
+from ..utils.data import (
+    Dataset,
+    TargetInfo,
+    TargetInfoDict,
+    collate_fn,
+    read_systems,
+    read_targets,
+    write_predictions,
+)
+from ..utils.errors import ArchitectureError
+from ..utils.evaluate_model import evaluate_model
+from ..utils.logging import MetricLogger
+from ..utils.metrics import RMSEAccumulator
+from ..utils.neighbor_lists import get_system_with_neighbor_lists
+from ..utils.omegaconf import expand_dataset_config
+from ..utils.per_atom import average_by_num_atoms
+from .formatter import CustomHelpFormatter
+
+
+logger = logging.getLogger(__name__)
+
+
+def _add_eval_model_parser(subparser: argparse._SubParsersAction) -> None:
+    """Add the `eval_model` paramaters to an argparse (sub)-parser"""
+
+    if eval_model.__doc__ is not None:
+        description = eval_model.__doc__.split(r":param")[0]
+    else:
+        description = None
+
+    # If you change the synopsis of these commands or add new ones adjust the completion
+    # script at `src/metatrain/share/metatrain-completion.bash`.
+    parser = subparser.add_parser(
+        "eval",
+        description=description,
+        formatter_class=CustomHelpFormatter,
+    )
+    parser.set_defaults(callable="eval_model")
+    parser.add_argument(
+        "path",
+        type=str,
+        help="Saved exported model to be evaluated.",
+    )
+    parser.add_argument(
+        "options",
+        type=str,
+        help="Eval options file to define a dataset for evaluation.",
+    )
+    parser.add_argument(
+        "-e",
+        "--extensions-dir",
+        type=str,
+        required=False,
+        dest="extensions_directory",
+        default=None,
+        help=(
+            "path to a directory containing all extensions required by the exported "
+            "model"
+        ),
+    )
+    parser.add_argument(
+        "-o",
+        "--output",
+        dest="output",
+        type=str,
+        required=False,
+        default="output.xyz",
+        help="filename of the predictions (default: %(default)s)",
+    )
+
+
+def _prepare_eval_model_args(args: argparse.Namespace) -> None:
+    """Prepare arguments for eval_model."""
+    args.options = OmegaConf.load(args.options)
+    args.model = metatensor.torch.atomistic.load_atomistic_model(
+        path=args.__dict__.pop("path"),
+        extensions_directory=args.__dict__.pop("extensions_directory"),
+    )
+
+
+def _concatenate_tensormaps(
+    tensormap_dict_list: List[Dict[str, TensorMap]]
+) -> Dict[str, TensorMap]:
+    # Concatenating TensorMaps is tricky, because the model does not know the
+    # "number" of the system it is predicting. For example, if a model predicts
+    # 3 batches of 4 atoms each, the system labels will be [0, 1, 2, 3],
+    # [0, 1, 2, 3], [0, 1, 2, 3] for the three batches, respectively. Due
+    # to this, the join operation would not achieve the desired result
+    # ([0, 1, 2, ..., 11, 12]). Here, we fix this by renaming the system labels.
+
+    system_counter = 0
+    n_systems = 0
+    tensormaps_shifted_systems = []
+    for tensormap_dict in tensormap_dict_list:
+        tensormap_dict_shifted = {}
+        for name, tensormap in tensormap_dict.items():
+            new_keys = []
+            new_blocks = []
+            for key, block in tensormap.items():
+                new_key = key
+                where_system = block.samples.names.index("system")
+                n_systems = torch.max(block.samples.column("system")) + 1
+                new_samples_values = block.samples.values
+                new_samples_values[:, where_system] += system_counter
+                new_block = TensorBlock(
+                    values=block.values,
+                    samples=Labels(block.samples.names, values=new_samples_values),
+                    components=block.components,
+                    properties=block.properties,
+                )
+                for gradient_name, gradient_block in block.gradients():
+                    new_block.add_gradient(
+                        gradient_name,
+                        gradient_block,
+                    )
+                new_keys.append(new_key)
+                new_blocks.append(new_block)
+            tensormap_dict_shifted[name] = TensorMap(
+                keys=Labels(
+                    names=tensormap.keys.names,
+                    values=torch.stack([new_key.values for new_key in new_keys]),
+                ),
+                blocks=new_blocks,
+            )
+        tensormaps_shifted_systems.append(tensormap_dict_shifted)
+        system_counter += n_systems
+
+    return {
+        target: metatensor.torch.join(
+            [pred[target] for pred in tensormaps_shifted_systems], axis="samples"
+        )
+        for target in tensormaps_shifted_systems[0].keys()
+    }
+
+
+def _eval_targets(
+    model: Union[MetatensorAtomisticModel, torch.jit._script.RecursiveScriptModule],
+    dataset: Union[Dataset, torch.utils.data.Subset],
+    options: TargetInfoDict,
+    return_predictions: bool,
+) -> Optional[Dict[str, TensorMap]]:
+    """Evaluates an exported model on a dataset and prints the RMSEs for each target.
+    Optionally, it also returns the predictions of the model.
+
+    Wraps around metatrain.cli.evaluate_model.
+    """
+
+    if len(dataset) == 0:
+        logger.info("This dataset is empty. No evaluation will be performed.")
+
+    # Attach neighbor lists to the systems:
+    # TODO: these might already be present... find a way to avoid recomputing
+    # if already present (e.g. if this function is called after training)
+    for sample in dataset:
+        system = sample["system"]
+        get_system_with_neighbor_lists(system, model.requested_neighbor_lists())
+
+    # Infer the device from the model
+    device = next(itertools.chain(model.parameters(), model.buffers())).device
+
+    # Create a dataloader
+    dataloader = torch.utils.data.DataLoader(
+        dataset,
+        batch_size=1,  # TODO: allow to set from outside!!
+        collate_fn=collate_fn,
+        shuffle=False,
+    )
+
+    # Initialize RMSE accumulator:
+    rmse_accumulator = RMSEAccumulator()
+
+    # If we're returning the predictions, we need to store them:
+    if return_predictions:
+        all_predictions = []
+
+    # Evaluate the model
+    for batch in dataloader:
+        systems, batch_targets = batch
+        systems = [system.to(device=device) for system in systems]
+        batch_targets = {
+            key: value.to(device=device) for key, value in batch_targets.items()
+        }
+        batch_predictions = evaluate_model(model, systems, options, is_training=False)
+        batch_predictions = average_by_num_atoms(
+            batch_predictions, systems, per_structure_keys=[]
+        )
+        batch_targets = average_by_num_atoms(
+            batch_targets, systems, per_structure_keys=[]
+        )
+        rmse_accumulator.update(batch_predictions, batch_targets)
+        if return_predictions:
+            all_predictions.append(batch_predictions)
+
+    # Finalize the RMSEs
+    rmse_values = rmse_accumulator.finalize(not_per_atom=["positions_gradients"])
+    # print the RMSEs with MetricLogger
+    metric_logger = MetricLogger(
+        logobj=logger,
+        dataset_info=model.capabilities(),
+        initial_metrics=rmse_values,
+    )
+    metric_logger.log(rmse_values)
+
+    if return_predictions:
+        # concatenate the TensorMaps
+        all_predictions_joined = _concatenate_tensormaps(all_predictions)
+        return all_predictions_joined
+    else:
+        return None
+
+
+
+[docs] +def eval_model( + model: Union[MetatensorAtomisticModel, torch.jit._script.RecursiveScriptModule], + options: DictConfig, + output: Union[Path, str] = "output.xyz", +) -> None: + """Evaluate an exported model on a given data set. + + If ``options`` contains a ``targets`` sub-section, RMSE values will be reported. If + this sub-section is missing, only a xyz-file with containing the properties the + model was trained against is written. + + :param model: Saved model to be evaluated. + :param options: DictConfig to define a test dataset taken for the evaluation. + :param output: Path to save the predicted values + """ + logger.info("Setting up evaluation set.") + + # TODO: once https://github.com/lab-cosmo/metatensor/pull/551 is merged and released + # use capabilities instead of this workaround + dtype = next(model.parameters()).dtype + + if isinstance(output, str): + output = Path(output) + + options_list = expand_dataset_config(options) + for i, options in enumerate(options_list): + if len(options_list) == 1: + extra_log_message = "" + file_index_suffix = "" + else: + extra_log_message = f" with index {i}" + file_index_suffix = f"_{i}" + logger.info(f"Evaluating dataset{extra_log_message}") + + eval_systems = read_systems( + filename=options["systems"]["read_from"], + fileformat=options["systems"]["file_format"], + dtype=dtype, + ) + + if hasattr(options, "targets"): + # in this case, we only evaluate the targets specified in the options + # and we calculate RMSEs + eval_targets, eval_info_dict = read_targets(options["targets"], dtype=dtype) + else: + # in this case, we have no targets: we evaluate everything + # (but we don't/can't calculate RMSEs) + # TODO: allow the user to specify which outputs to evaluate + eval_targets = {} + eval_info_dict = TargetInfoDict() + gradients = {"positions"} + if all(not torch.all(system.cell == 0) for system in eval_systems): + # only add strain if all structures have cells + gradients.add("strain") + for key in model.capabilities().outputs.keys(): + eval_info_dict[key] = TargetInfo( + quantity=model.capabilities().outputs[key].quantity, + unit=model.capabilities().outputs[key].unit, + per_atom=False, # TODO: allow the user to specify this + gradients=gradients, + ) + + eval_dataset = Dataset({"system": eval_systems, **eval_targets}) + + # Evaluate the model + try: + predictions = _eval_targets( + model=model, + dataset=eval_dataset, + options=eval_info_dict, + return_predictions=True, + ) + except Exception as e: + raise ArchitectureError(e) + + write_predictions( + filename=f"{output.stem}{file_index_suffix}{output.suffix}", + systems=eval_systems, + capabilities=model.capabilities(), + predictions=predictions, + )
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/cli/export.html b/latest/_modules/metatrain/cli/export.html new file mode 100644 index 000000000..3dcb1fd13 --- /dev/null +++ b/latest/_modules/metatrain/cli/export.html @@ -0,0 +1,460 @@ + + + + + + + + metatrain.cli.export - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.cli.export

+import argparse
+import importlib
+import logging
+from pathlib import Path
+from typing import Any, Union
+
+import torch
+
+from ..utils.architectures import check_architecture_name, find_all_architectures
+from ..utils.export import is_exported
+from ..utils.io import check_suffix
+from .formatter import CustomHelpFormatter
+
+
+logger = logging.getLogger(__name__)
+
+
+def _add_export_model_parser(subparser: argparse._SubParsersAction) -> None:
+    """Add `export_model` paramaters to an argparse (sub)-parser."""
+
+    if export_model.__doc__ is not None:
+        description = export_model.__doc__.split(r":param")[0]
+    else:
+        description = None
+
+    # If you change the synopsis of these commands or add new ones adjust the completion
+    # script at `src/metatrain/share/metatrain-completion.bash`.
+    parser = subparser.add_parser(
+        "export",
+        description=description,
+        formatter_class=CustomHelpFormatter,
+    )
+    parser.set_defaults(callable="export_model")
+
+    parser.add_argument(
+        "architecture_name",
+        type=str,
+        choices=find_all_architectures(),
+        help="name of the model's architecture",
+    )
+    parser.add_argument(
+        "path",
+        type=str,
+        help="Saved model which should be exported",
+    )
+    parser.add_argument(
+        "-o",
+        "--output",
+        dest="output",
+        type=str,
+        required=False,
+        default="exported-model.pt",
+        help="Filename of the exported model (default: %(default)s).",
+    )
+
+
+def _prepare_export_model_args(args: argparse.Namespace) -> None:
+    """Prepare arguments for export_model."""
+    architecture_name = args.__dict__.pop("architecture_name")
+    check_architecture_name(architecture_name)
+    architecture = importlib.import_module(f"metatrain.{architecture_name}")
+
+    args.model = architecture.__model__.load_checkpoint(args.__dict__.pop("path"))
+
+
+
+[docs] +def export_model(model: Any, output: Union[Path, str] = "exported-model.pt") -> None: + """Export a trained model to allow it to make predictions. + + This includes predictions within molecular simulation engines. Exported models will + be saved with a ``.pt`` file ending. If ``path`` does not end with this file + extensions ``.pt`` will be added and a warning emitted. + + :param model: model to be exported + :param output: path to save the exported model + """ + path = str(check_suffix(filename=output, suffix=".pt")) + + if is_exported(model): + logger.info(f"The model is already exported. Saving it to `{path}`.") + torch.jit.save(model, path) + else: + extensions_path = "extensions/" + logger.info( + f"Exporting model to '{path}' and extensions to '{extensions_path}'" + ) + mts_atomistic_model = model.export() + mts_atomistic_model.export(path, collect_extensions=extensions_path) + logger.info("Model exported successfully")
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/cli/formatter.html b/latest/_modules/metatrain/cli/formatter.html new file mode 100644 index 000000000..adcdebb5b --- /dev/null +++ b/latest/_modules/metatrain/cli/formatter.html @@ -0,0 +1,398 @@ + + + + + + + + metatrain.cli.formatter - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.cli.formatter

+import argparse
+
+
+
+[docs] +class CustomHelpFormatter(argparse.RawDescriptionHelpFormatter): + """Descriptions formatter showing positional arguments before optionals.""" + + def _format_usage(self, usage, actions, groups, prefix): + if usage is None: + # split optionals from positionals + optionals = [] + positionals = [] + for action in actions: + if action.option_strings: + optionals.append(action) + else: + positionals.append(action) + + prog = "%(prog)s" % dict(prog=self._prog) + + # build full usage string + format = self._format_actions_usage + action_usage = format(positionals + optionals, groups) + usage = " ".join([s for s in [prog, action_usage] if s]) + + # Call the superclass method to format the usage + return super()._format_usage(usage, actions, groups, prefix)
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/cli/train.html b/latest/_modules/metatrain/cli/train.html new file mode 100644 index 000000000..543e086ff --- /dev/null +++ b/latest/_modules/metatrain/cli/train.html @@ -0,0 +1,840 @@ + + + + + + + + metatrain.cli.train - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.cli.train

+import argparse
+import importlib
+import logging
+import os
+import random
+from pathlib import Path
+from typing import Dict, Optional, Union
+
+import numpy as np
+import torch
+from omegaconf import DictConfig, OmegaConf
+from omegaconf.errors import ConfigKeyError
+
+from ..utils.architectures import check_architecture_name, get_default_hypers
+from ..utils.data import (
+    Dataset,
+    DatasetInfo,
+    TargetInfoDict,
+    get_atomic_types,
+    read_systems,
+    read_targets,
+)
+from ..utils.data.dataset import _train_test_random_split
+from ..utils.devices import pick_devices
+from ..utils.distributed.logging import is_main_process
+from ..utils.errors import ArchitectureError
+from ..utils.io import check_suffix
+from ..utils.omegaconf import (
+    BASE_OPTIONS,
+    check_options_list,
+    check_units,
+    expand_dataset_config,
+)
+from .eval import _eval_targets
+from .formatter import CustomHelpFormatter
+
+
+logger = logging.getLogger(__name__)
+
+
+def _add_train_model_parser(subparser: argparse._SubParsersAction) -> None:
+    """Add `train_model` paramaters to an argparse (sub)-parser."""
+
+    if train_model.__doc__ is not None:
+        description = train_model.__doc__.split(r":param")[0]
+    else:
+        description = None
+
+    # If you change the synopsis of these commands or add new ones adjust the completion
+    # script at `src/metatrain/share/metatrain-completion.bash`.
+    parser = subparser.add_parser(
+        "train",
+        description=description,
+        formatter_class=CustomHelpFormatter,
+    )
+    parser.set_defaults(callable="train_model")
+
+    parser.add_argument(
+        "options",
+        type=str,
+        help="Options file",
+    )
+    parser.add_argument(
+        "-o",
+        "--output",
+        dest="output",
+        type=str,
+        required=False,
+        default="model.pt",
+        help="Path to save the final model (default: %(default)s).",
+    )
+    parser.add_argument(
+        "-c",
+        "--continue",
+        dest="continue_from",
+        type=str,
+        required=False,
+        help="File to continue training from.",
+    )
+    parser.add_argument(
+        "-r",
+        "--override",
+        dest="override_options",
+        type=lambda string: OmegaConf.from_dotlist(string.split()),
+        help="Command line override flags.",
+    )
+
+
+def _prepare_train_model_args(args: argparse.Namespace) -> None:
+    """Prepare arguments for train_model."""
+    args.options = OmegaConf.load(args.options)
+    # merge/override file options with command line options
+    override_options = args.__dict__.pop("override_options")
+    if override_options is None:
+        override_options = {}
+
+    args.options = OmegaConf.merge(args.options, override_options)
+
+
+
+[docs] +def train_model( + options: Union[DictConfig, Dict], + output: str = "model.pt", + checkpoint_dir: Union[str, Path] = ".", + continue_from: Optional[str] = None, +) -> None: + """Train an atomistic machine learning model using provided ``options``. + + This function sets up the dataset and model architecture, then runs the training + process. The dataset is prepared by reading structural data and target values from + specified paths. The model architecture is dynamically imported and instantiated + based on the configuration. Training is executed with the specified hyperparameters, + and the trained model is saved to a designated output path. + + :param options: DictConfig containing the training options + :param output: Path to save the final model + :param checkpoint_dir: Path to save checkpoints and other intermediate output files + like the fully expanded training options for a later restart. + :param continue_from: File to continue training from. + """ + ########################### + # LOAD ARCHITECTURE ####### + ########################### + + try: + architecture_name = options["architecture"]["name"] + except ConfigKeyError as exc: + raise ValueError("Architecture name is not defined!") from exc + + check_architecture_name(architecture_name) + architecture = importlib.import_module(f"metatrain.{architecture_name}") + + Model = architecture.__model__ + Trainer = architecture.__trainer__ + + ########################### + # CREATE OPTIONS ########## + ########################### + + options = OmegaConf.merge( + BASE_OPTIONS, + {"architecture": get_default_hypers(architecture_name)}, + options, + ) + hypers = OmegaConf.to_container(options["architecture"]) + + ########################### + # PROCESS BASE PARAMETERS # + ########################### + + # process devices + devices = pick_devices( + architecture_devices=Model.__supported_devices__, + desired_device=options["device"], + ) + + # process base_precision/dtypes + if options["base_precision"] == 64: + dtype = torch.float64 + elif options["base_precision"] == 32: + dtype = torch.float32 + elif options["base_precision"] == 16: + dtype = torch.float16 + else: + raise ValueError("Only 64, 32 or 16 are possible values for `base_precision`.") + + if dtype not in Model.__supported_dtypes__: + raise ValueError( + f"Requested dtype {dtype} is not supported. {architecture_name} only " + f"supports {Model.__supported_dtypes__}." + ) + + # process random seeds + if options["seed"] < 0: + raise ValueError("`seed` should be a positive number") + else: + logger.info(f"Random seed of this run is {options['seed']}") + torch.manual_seed(options["seed"]) + np.random.seed(options["seed"]) + random.seed(options["seed"]) + os.environ["PYTHONHASHSEED"] = str(options["seed"]) + if torch.cuda.is_available(): + torch.cuda.manual_seed(options["seed"]) + torch.cuda.manual_seed_all(options["seed"]) + + ########################### + # SETUP TRAINING SET ###### + ########################### + + logger.info("Setting up training set") + train_options_list = expand_dataset_config(options["training_set"]) + check_options_list(train_options_list) + + train_datasets = [] + target_infos = TargetInfoDict() + for train_options in train_options_list: + train_systems = read_systems( + filename=train_options["systems"]["read_from"], + fileformat=train_options["systems"]["file_format"], + dtype=dtype, + ) + train_targets, target_info_dictionary = read_targets( + conf=train_options["targets"], dtype=dtype + ) + + target_infos.update(target_info_dictionary) + train_datasets.append(Dataset({"system": train_systems, **train_targets})) + + train_size = 1.0 + + ########################### + # SETUP TEST SET ########## + ########################### + + logger.info("Setting up test set") + test_options = options["test_set"] + test_datasets = [] + if isinstance(test_options, float): + test_size = test_options + train_size -= test_size + + if test_size < 0 or test_size >= 1: + raise ValueError( + "Test set split must be greater or equal than 0 and lesser than 1." + ) + + generator = torch.Generator() + if options["seed"] is not None: + generator.manual_seed(options["seed"]) + + for i_dataset, train_dataset in enumerate(train_datasets): + train_dataset_new, test_dataset = _train_test_random_split( + train_dataset=train_dataset, + train_size=train_size, + test_size=test_size, + generator=generator, + ) + + train_datasets[i_dataset] = train_dataset_new + test_datasets.append(test_dataset) + else: + test_options_list = expand_dataset_config(test_options) + check_options_list(test_options_list) + + if len(test_options_list) != len(train_options_list): + raise ValueError( + f"Test dataset with length {len(test_options_list)} has a different " + f"size than the train datatset with length {len(train_options_list)}." + ) + + check_units( + actual_options=test_options_list, desired_options=train_options_list + ) + + for test_options in test_options_list: + test_systems = read_systems( + filename=test_options["systems"]["read_from"], + fileformat=test_options["systems"]["file_format"], + dtype=dtype, + ) + test_targets, _ = read_targets(conf=test_options["targets"], dtype=dtype) + test_dataset = Dataset({"system": test_systems, **test_targets}) + test_datasets.append(test_dataset) + + ########################### + # SETUP VALIDATION SET #### + ########################### + + logger.info("Setting up validation set") + val_options = options["validation_set"] + val_datasets = [] + if isinstance(val_options, float): + val_size = val_options + train_size -= val_size + + if val_size <= 0 or val_size >= 1: + raise ValueError( + "Validation set split must be greater than 0 and lesser than 1." + ) + + generator = torch.Generator() + if options["seed"] is not None: + generator.manual_seed(options["seed"]) + + for i_dataset, train_dataset in enumerate(train_datasets): + train_dataset_new, val_dataset = _train_test_random_split( + train_dataset=train_dataset, + train_size=train_size, + test_size=val_size, + generator=generator, + ) + + train_datasets[i_dataset] = train_dataset_new + val_datasets.append(val_dataset) + else: + val_options_list = expand_dataset_config(val_options) + check_options_list(val_options_list) + + if len(val_options_list) != len(train_options_list): + raise ValueError( + f"Validation dataset with length {len(val_options_list)} has " + "a different size than the train datatset with length " + f"{len(train_options_list)}." + ) + + check_units(actual_options=val_options_list, desired_options=train_options_list) + + for val_options in val_options_list: + val_systems = read_systems( + filename=val_options["systems"]["read_from"], + fileformat=val_options["systems"]["file_format"], + dtype=dtype, + ) + val_targets, _ = read_targets(conf=val_options["targets"], dtype=dtype) + val_dataset = Dataset({"system": val_systems, **val_targets}) + val_datasets.append(val_dataset) + + ########################### + # CREATE DATASET_INFO ##### + ########################### + + atomic_types = get_atomic_types(train_datasets + val_datasets) + + dataset_info = DatasetInfo( + length_unit=train_options_list[0]["systems"]["length_unit"], + atomic_types=atomic_types, + targets=target_infos, + ) + + ########################### + # PRINT DATASET STATS ##### + ########################### + + for i, train_dataset in enumerate(train_datasets): + if len(train_datasets) == 1: + index = "" + else: + index = f" {i}" + logger.info( + f"Training dataset{index}:\n {train_dataset.get_stats(dataset_info)}" + ) + + for i, val_dataset in enumerate(val_datasets): + if len(val_datasets) == 1: + index = "" + else: + index = f" {i}" + logger.info( + f"Validation dataset{index}:\n {val_dataset.get_stats(dataset_info)}" + ) + + for i, test_dataset in enumerate(test_datasets): + if len(test_datasets) == 1: + index = "" + else: + index = f" {i}" + logger.info(f"Test dataset{index}:\n {test_dataset.get_stats(dataset_info)}") + + ########################### + # SAVE EXPANDED OPTIONS ### + ########################### + + OmegaConf.save( + config=options, f=Path(checkpoint_dir) / "options_restart.yaml", resolve=True + ) + + ########################### + # SETTING UP MODEL ######## + ########################### + + logger.info("Setting up model") + try: + if continue_from is not None: + logger.info(f"Loading checkpoint from `{continue_from}`") + trainer = Trainer.load_checkpoint(continue_from, hypers["training"]) + model = Model.load_checkpoint(continue_from) + model = model.restart(dataset_info) + else: + model = Model(hypers["model"], dataset_info) + trainer = Trainer(hypers["training"]) + except Exception as e: + raise ArchitectureError(e) + + ########################### + # TRAIN MODEL ############# + ########################### + + logger.info("Calling trainer") + try: + trainer.train( + model=model, + devices=devices, + train_datasets=train_datasets, + val_datasets=val_datasets, + checkpoint_dir=str(checkpoint_dir), + ) + except Exception as e: + raise ArchitectureError(e) + + if not is_main_process(): + return # only save and evaluate on the main process + + ########################### + # SAVE FINAL MODEL ######## + ########################### + + output_checked = check_suffix(filename=output, suffix=".pt") + logger.info( + "Training finished, saving final checkpoint " + f"to `{str(Path(output_checked).stem)}.ckpt`" + ) + try: + trainer.save_checkpoint(model, f"{Path(output_checked).stem}.ckpt") + except Exception as e: + raise ArchitectureError(e) + + mts_atomistic_model = model.export() + extensions_path = "extensions/" + + logger.info( + f"Exporting model to `{output_checked}` and extensions to `{extensions_path}`" + ) + mts_atomistic_model.export(str(output_checked), collect_extensions=extensions_path) + + ########################### + # EVALUATE FINAL MODEL #### + ########################### + + for i, train_dataset in enumerate(train_datasets): + if len(train_datasets) == 1: + extra_log_message = "" + else: + extra_log_message = f" with index {i}" + + logger.info(f"Evaluating training dataset{extra_log_message}") + _eval_targets( + mts_atomistic_model, + train_dataset, + dataset_info.targets, + return_predictions=False, + ) + + for i, val_dataset in enumerate(val_datasets): + if len(val_datasets) == 1: + extra_log_message = "" + else: + extra_log_message = f" with index {i}" + + logger.info(f"Evaluating validation dataset{extra_log_message}") + _eval_targets( + mts_atomistic_model, + val_dataset, + dataset_info.targets, + return_predictions=False, + ) + + for i, test_dataset in enumerate(test_datasets): + if len(test_datasets) == 1: + extra_log_message = "" + else: + extra_log_message = f" with index {i}" + + logger.info(f"Evaluating test dataset{extra_log_message}") + _eval_targets( + mts_atomistic_model, + test_dataset, + dataset_info.targets, + return_predictions=False, + )
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/architectures.html b/latest/_modules/metatrain/utils/architectures.html new file mode 100644 index 000000000..6381dd46f --- /dev/null +++ b/latest/_modules/metatrain/utils/architectures.html @@ -0,0 +1,515 @@ + + + + + + + + metatrain.utils.architectures - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.architectures

+import difflib
+from importlib.util import find_spec
+from pathlib import Path
+from typing import Dict, List, Union
+
+from omegaconf import OmegaConf
+
+from .. import PACKAGE_ROOT
+
+
+
+[docs] +def check_architecture_name(name: str) -> None: + """Check if the requested architecture is avalible. + + If the architecture is not found an :func:`ValueError` is raised. If an architecture + with the same name as an experimental or deprecated architecture exist, this + architecture is suggested. If no architecture exist the closest architecture is + given to help debugging typos. + + :param name: name of the architecture + :raises ValueError: if the architecture is not found + """ + try: + if find_spec(f"metatrain.{name}") is not None: + return + elif find_spec(f"metatrain.experimental.{name}") is not None: + msg = ( + f"Architecture {name!r} is not a stable architecture. An " + "experimental architecture with the same name was found. Set " + f"`name: experimental.{name}` in your options file to use this " + "experimental architecture." + ) + elif find_spec(f"metatrain.deprecated.{name}") is not None: + msg = ( + f"Architecture {name!r} is not a stable architecture. A " + "deprecated architecture with the same name was found. Set " + f"`name: deprecated.{name}` in your options file to use this " + "deprecated architecture." + ) + except ModuleNotFoundError: + closest_match = difflib.get_close_matches( + word=name, + possibilities=find_all_architectures(), + cutoff=0.3, + ) + msg = ( + f"Architecture {name!r} is not a valid architecture. Do you mean " + f"{', '.join(closest_match)}?" + ) + + raise ValueError(msg)
+ + + +
+[docs] +def get_architecture_name(path: Union[str, Path]) -> str: + """Name of an architecture based on path to pointing inside an architecture. + + The function should be used to determine the ``ARCHITECTURE_NAME`` based on the name + of the folder. + + :param absolute_architecture_path: absolute path of the architecture directory + :returns: architecture name + :raises ValueError: if ``absolute_architecture_path`` does not point to a valid + architecture directory. + + .. seealso:: + :py:func:`get_architecture_path` to get the relative path within the metatrain + project of an architecture name. + """ + path = Path(path) + + if path.is_dir(): + directory = path + elif path.is_file(): + directory = path.parent + else: + raise ValueError(f"`path` {str(path)!r} does not exist") + + architecture_path = directory.relative_to(PACKAGE_ROOT) + name = str(architecture_path).replace("/", ".") + + try: + check_architecture_name(name) + except ValueError as err: + raise ValueError( + f"`path` {str(path)!r} does not point to a valid architecture folder" + ) from err + + return name
+ + + +
+[docs] +def get_architecture_path(name: str) -> Path: + """Return the relative path to the architeture directory. + + Path based on the ``name`` within the metatrain project directory. + + :param name: name of the architecture + :returns: path to the architecture directory + + .. seealso:: + :py:func:`get_architecture_name` to get the name based on an absolute path of an + architecture. + """ + check_architecture_name(name) + return PACKAGE_ROOT / Path(name.replace(".", "/"))
+ + + +
+[docs] +def find_all_architectures() -> List[str]: + """Find all currentlty available architectures. + + To find the architectures the function searches for the mandatory + ``default-hypers.yaml`` file in each architectire directory. + + :returns: List of architectures names + """ + options_files_path = PACKAGE_ROOT.rglob("default-hypers.yaml") + + architecture_names = [] + for option_file_path in options_files_path: + architecture_names.append(get_architecture_name(option_file_path)) + + return architecture_names
+ + + +
+[docs] +def get_default_hypers(name: str) -> Dict: + """Dictionary of the default architecture hyperparameters. + + :param: name of the architecture + :returns: default hyper paremeters of the architectures + """ + check_architecture_name(name) + default_hypers = OmegaConf.load(get_architecture_path(name) / "default-hypers.yaml") + return OmegaConf.to_container(default_hypers)
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/composition.html b/latest/_modules/metatrain/utils/composition.html new file mode 100644 index 000000000..3a158bc4d --- /dev/null +++ b/latest/_modules/metatrain/utils/composition.html @@ -0,0 +1,475 @@ + + + + + + + + metatrain.utils.composition - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.composition

+from typing import List, Tuple, Union
+
+import torch
+from metatensor.torch import Labels, TensorBlock, TensorMap
+
+from metatrain.utils.data import Dataset, get_atomic_types
+
+
+
+[docs] +def calculate_composition_weights( + datasets: Union[Dataset, List[Dataset]], property: str +) -> Tuple[torch.Tensor, List[int]]: + """Calculate the composition weights for a dataset. + + For now, it assumes per-system properties. + + :param dataset: Dataset to calculate the composition weights for. + :returns: Composition weights for the dataset, as well as the + list of species that the weights correspond to. + """ + if not isinstance(datasets, list): + datasets = [datasets] + + # Note: `atomic_types` are sorted, and the composition weights are sorted as + # well, because the species are sorted in the composition features. + atomic_types = sorted(get_atomic_types(datasets)) + + targets = torch.stack( + [sample[property].block().values for dataset in datasets for sample in dataset] + ) + targets = targets.squeeze(dim=(1, 2)) # remove component and property dimensions + + structure_list = [sample["system"] for dataset in datasets for sample in dataset] + + dtype = structure_list[0].positions.dtype + composition_features = torch.empty( + (len(structure_list), len(atomic_types)), dtype=dtype + ) + for i, structure in enumerate(structure_list): + for j, s in enumerate(atomic_types): + composition_features[i, j] = torch.sum(structure.types == s) + + regularizer = 1e-20 + while regularizer: + if regularizer > 1e5: + raise RuntimeError( + "Failed to solve the linear system to calculate the " + "composition weights. The dataset is probably too small " + "or ill-conditioned." + ) + try: + solution = torch.linalg.solve( + composition_features.T @ composition_features + + regularizer + * torch.eye( + composition_features.shape[1], + dtype=composition_features.dtype, + device=composition_features.device, + ), + composition_features.T @ targets, + ) + break + except torch._C._LinAlgError: + regularizer *= 10.0 + + return solution, atomic_types
+ + + +
+[docs] +def apply_composition_contribution( + atomic_property: TensorMap, composition_weights: torch.Tensor +) -> TensorMap: + """Apply the composition contribution to an atomic property. + + :param atomic_property: Atomic property to apply the composition contribution to. + :param composition_weights: Composition weights to apply. + :returns: Atomic property with the composition contribution applied. + """ + + new_keys: List[int] = [] + new_blocks: List[TensorBlock] = [] + for key, block in atomic_property.items(): + atomic_type = int(key.values.item()) + new_keys.append(atomic_type) + new_values = block.values + composition_weights[atomic_type] + new_blocks.append( + TensorBlock( + values=new_values, + samples=block.samples, + components=block.components, + properties=block.properties, + ) + ) + + new_keys_labels = Labels( + names=["center_type"], + values=torch.tensor(new_keys, device=new_blocks[0].values.device).reshape( + -1, 1 + ), + ) + + return TensorMap(keys=new_keys_labels, blocks=new_blocks)
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/data/combine_dataloaders.html b/latest/_modules/metatrain/utils/data/combine_dataloaders.html new file mode 100644 index 000000000..a09e1e14d --- /dev/null +++ b/latest/_modules/metatrain/utils/data/combine_dataloaders.html @@ -0,0 +1,435 @@ + + + + + + + + metatrain.utils.data.combine_dataloaders - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.data.combine_dataloaders

+from typing import List
+
+import numpy as np
+import torch
+
+
+
+[docs] +class CombinedDataLoader: + """ + Combines multiple dataloaders into a single dataloader. + + This is useful for learning from multiple datasets at the same time, + each of which may have different batch sizes, properties, etc. + + :param dataloaders: list of dataloaders to combine + :param shuffle: whether to shuffle the combined dataloader (this does not + act on the individual batches, but it shuffles the order in which + they are returned) + + :return: the combined dataloader + """ + + def __init__(self, dataloaders: List[torch.utils.data.DataLoader], shuffle: bool): + self.dataloaders = dataloaders + self.shuffle = shuffle + + # Create the indices: + self.indices = list(range(len(self))) + + # Shuffle the indices if requested + if self.shuffle: + np.random.shuffle(self.indices) + + self.reset() + + def reset(self): + self.current_index = 0 + self.full_list = [batch for dl in self.dataloaders for batch in dl] + + def __iter__(self): + return self + + def __next__(self): + if self.current_index >= len(self.indices): + self.reset() # Reset the index for the next iteration + raise StopIteration + + idx = self.indices[self.current_index] + self.current_index += 1 + return self.full_list[idx] + +
+[docs] + def __len__(self): + """Total number of batches in all dataloaders. + + This returns the total number of batches in all dataloaders + (as opposed to the total number of samples or the number of + individual dataloaders). + + :return: the total number of batches in all dataloaders + """ + return sum(len(dl) for dl in self.dataloaders)
+
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/data/dataset.html b/latest/_modules/metatrain/utils/data/dataset.html new file mode 100644 index 000000000..4bd64dd61 --- /dev/null +++ b/latest/_modules/metatrain/utils/data/dataset.html @@ -0,0 +1,946 @@ + + + + + + + + metatrain.utils.data.dataset - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.data.dataset

+import itertools
+import math
+import warnings
+from collections import UserDict
+from dataclasses import dataclass, field
+from typing import Any, Dict, List, Optional, Set, Tuple, Union
+
+import metatensor.learn
+import torch
+from metatensor.torch import TensorMap
+from torch import Generator, default_generator
+
+from ..external_naming import to_external_name
+from ..units import get_gradient_units
+
+
+
+[docs] +@dataclass +class TargetInfo: + """A class that contains information about a target. + + :param quantity: The quantity of the target. + :param unit: The unit of the target. If :py:obj:`None` the ``unit`` will be set to + an empty string ``""``. + :param per_atom: Whether the target is a per-atom quantity. + :param gradients: Set of gradients of the target that are defined in the current + dataset. Examples are ``"positions"`` or ``"strain"``. + """ + + quantity: str + unit: str = "" + per_atom: bool = False + gradients: Set[str] = field(default_factory=set) + + def __post_init__(self): + if self.unit is None: + self.unit = "" + + # For compatibility with list convert to set + self.gradients = set(self.gradients) + +
+[docs] + def copy(self) -> "TargetInfo": + """Return a shallow copy of the TargetInfo.""" + return TargetInfo( + quantity=self.quantity, + unit=self.unit, + per_atom=self.per_atom, + gradients=self.gradients.copy(), + )
+ + +
+[docs] + def update(self, other: "TargetInfo") -> None: + """Update this instance with the union of itself and ``other``. + + :raises ValueError: If ``quantity``, ``unit`` or ``per_atom`` do not match. + """ + if self.quantity != other.quantity: + raise ValueError( + f"Can't update TargetInfo with a different `quantity`: " + f"({self.quantity} != {other.quantity})" + ) + + if self.unit != other.unit: + raise ValueError( + f"Can't update TargetInfo with a different `unit`: " + f"({self.unit} != {other.unit})" + ) + + if self.per_atom != other.per_atom: + raise ValueError( + f"Can't update TargetInfo with a different `per_atom` property: " + f"({self.per_atom} != {other.per_atom})" + ) + + self.gradients = self.gradients.union(other.gradients)
+ + +
+[docs] + def union(self, other: "TargetInfo") -> "TargetInfo": + """Return the union of this instance with ``other``.""" + new = self.copy() + new.update(other) + return new
+
+ + + +
+[docs] +class TargetInfoDict(UserDict): + """ + A custom dictionary class for storing and managing ``TargetInfo`` instances. + + The subclass handles the update of :py:class:`TargetInfo` if a ``key`` is already + present. + """ + + # We use a `UserDict` with special methods because a normal dict does not support + # the update of nested instances. + def __setitem__(self, key, value): + if not isinstance(value, TargetInfo): + raise ValueError("value to set is not a `TargetInfo` instance") + if key in self: + self[key].update(value) + else: + super().__setitem__(key, value) + + def __and__(self, other: "TargetInfoDict") -> "TargetInfoDict": + return self.intersection(other) + + def __sub__(self, other: "TargetInfoDict") -> "TargetInfoDict": + return self.difference(other) + +
+[docs] + def union(self, other: "TargetInfoDict") -> "TargetInfoDict": + """Union of this instance with ``other``.""" + new = self.copy() + new.update(other) + return new
+ + +
+[docs] + def intersection(self, other: "TargetInfoDict") -> "TargetInfoDict": + """Intersection of the the two instances as a new ``TargetInfoDict``. + + (i.e. all elements that are in both sets.) + + :raises ValueError: If intersected items with the same key are not the same. + """ + new_keys = self.keys() & other.keys() + + self_intersect = TargetInfoDict(**{key: self[key] for key in new_keys}) + other_intersect = TargetInfoDict(**{key: other[key] for key in new_keys}) + + if self_intersect == other_intersect: + return self_intersect + else: + raise ValueError( + "Intersected items with the same key are not the same. Intersected " + f"keys are {','.join(new_keys)}" + )
+ + +
+[docs] + def difference(self, other: "TargetInfoDict") -> "TargetInfoDict": + """Difference of two instances as a new ``TargetInfoDict``. + + (i.e. all elements that are in this set but not in the other.) + """ + + new_keys = self.keys() - other.keys() + return TargetInfoDict(**{key: self[key] for key in new_keys})
+
+ + + +
+[docs] +@dataclass +class DatasetInfo: + """A class that contains information about datasets. + + This dataclass is used to communicate additional dataset details to the + training functions of the individual models. + + :param length_unit: Unit of length used in the dataset. + :param atomic_types: Unordered set of all atomic types present in the dataset. + + .. note:: + + ``atomic_types`` is a :py:class:`set` and **not ordered**. Use + :py:func:`sorted` for an ordered :py:class:`list`. + :param targets: Information about targets in the dataset. + """ + + length_unit: str + atomic_types: Set[int] + targets: TargetInfoDict + + def __post_init__(self): + if self.length_unit is None: + self.length_unit = "" + + # For compatibility with list convert to set + self.atomic_types = set(self.atomic_types) + +
+[docs] + def copy(self) -> "DatasetInfo": + """Return a shallow copy of the DatasetInfo.""" + return DatasetInfo( + length_unit=self.length_unit, + atomic_types=self.atomic_types.copy(), + targets=self.targets.copy(), + )
+ + +
+[docs] + def update(self, other: "DatasetInfo") -> None: + """Update this instance with the union of itself and ``other``. + + :raises ValueError: If the ``length_units`` are different. + """ + if self.length_unit != other.length_unit: + raise ValueError( + "Can't update DatasetInfo with a different `length_unit`: " + f"({self.length_unit} != {other.length_unit})" + ) + + self.atomic_types = self.atomic_types.union(other.atomic_types) + self.targets = self.targets.union(other.targets)
+ + +
+[docs] + def union(self, other: "DatasetInfo") -> "DatasetInfo": + """Return the union of this instance with ``other``.""" + new = self.copy() + new.update(other) + return new
+
+ + + +
+[docs] +class Dataset: + """A version of the `metatensor.learn.Dataset` class that allows for + the use of `mtt::` prefixes in the keys of the dictionary. See + https://github.com/lab-cosmo/metatensor/issues/621. + + It is important to note that, instead of named tuples, this class + accepts and returns dictionaries. + + :param dict: A dictionary with the data to be stored in the dataset. + """ + + def __init__(self, dict: Dict): + + new_dict = {} + for key, value in dict.items(): + key = key.replace("mtt::", "mtt_") + new_dict[key] = value + + self.mts_learn_dataset = metatensor.learn.Dataset(**new_dict) + + def __getitem__(self, idx: int) -> Dict: + + mts_dataset_item = self.mts_learn_dataset[idx]._asdict() + new_dict = {} + for key, value in mts_dataset_item.items(): + key = key.replace("mtt_", "mtt::") + new_dict[key] = value + + return new_dict + + def __len__(self) -> int: + return len(self.mts_learn_dataset) + + def __iter__(self): + for i in range(len(self)): + yield self[i] + +
+[docs] + def get_stats(self, dataset_info: DatasetInfo) -> str: + return _get_dataset_stats(self, dataset_info)
+
+ + + +
+[docs] +class Subset(torch.utils.data.Subset): + """ + A version of `torch.utils.data.Subset` containing a `get_stats` method + allowing us to print information about atomistic datasets. + """ + +
+[docs] + def get_stats(self, dataset_info: DatasetInfo) -> str: + return _get_dataset_stats(self, dataset_info)
+
+ + + +def _get_dataset_stats( + dataset: Union[Dataset, Subset], dataset_info: DatasetInfo +) -> str: + """Returns the statistics of a dataset or subset as a string.""" + + dataset_len = len(dataset) + stats = f"Dataset of size {dataset_len}" + if dataset_len == 0: + return stats + + # target_names will be used to store names of the targets, + # along with their gradients + target_names = [] + for key, tensor_map in dataset[0].items(): + if key == "system": + continue + target_names.append(key) + gradients_list = tensor_map.block(0).gradients_list() + for gradient in gradients_list: + target_names.append(f"{key}_{gradient}_gradients") + + sums = {key: 0.0 for key in target_names} + sums_of_squares = {key: 0.0 for key in target_names} + n_elements = {key: 0 for key in target_names} + for sample in dataset: + for key in target_names: + if "_gradients" not in key: # not a gradient + tensors = [block.values for block in sample[key].blocks()] + else: + original_key = key.split("_")[0] + gradient_name = key.replace(f"{original_key}_", "").replace( + "_gradients", "" + ) + tensors = [ + block.gradient(gradient_name).values + for block in sample[original_key].blocks() + ] + sums[key] += sum(tensor.sum() for tensor in tensors) + sums_of_squares[key] += sum((tensor**2).sum() for tensor in tensors) + n_elements[key] += sum(tensor.numel() for tensor in tensors) + means = {key: sums[key] / n_elements[key] for key in target_names} + means_of_squares = { + key: sums_of_squares[key] / n_elements[key] for key in target_names + } + stds = { + key: (means_of_squares[key] - means[key] ** 2) ** 0.5 for key in target_names + } + + # Find units + units = {} + for key in target_names: + # Gets the units of an output + if key.endswith("_gradients"): + # handling <base_name>_<gradient_name>_gradients + base_name = key[:-10] + gradient_name = base_name.split("_")[-1] + base_name = base_name.replace(f"_{gradient_name}", "") + base_unit = dataset_info.targets[base_name].unit + unit = get_gradient_units( + base_unit, gradient_name, dataset_info.length_unit + ) + else: + unit = dataset_info.targets[key].unit + units[key] = unit + + stats += "\n Mean and standard deviation of targets:" + for key in target_names: + stats += ( + f"\n - {to_external_name(key, dataset_info.targets)}: " # type: ignore + + f"\n - mean {means[key]:.4g}" + + (f" {units[key]}" if units[key] != "" else "") + + f"\n - std {stds[key]:.4g}" + + (f" {units[key]}" if units[key] != "" else "") + ) + + return stats + + +
+[docs] +def get_atomic_types(datasets: Union[Dataset, List[Dataset]]) -> Set[int]: + """List of all atomic types present in a dataset or list of datasets. + + :param datasets: the dataset, or list of datasets + :returns: sorted list of all atomic types present in the datasets + """ + + if not isinstance(datasets, list): + datasets = [datasets] + + types = [] + for dataset in datasets: + for index in range(len(dataset)): + system = dataset[index]["system"] + types += system.types.tolist() + + return set(types)
+ + + +
+[docs] +def get_all_targets(datasets: Union[Dataset, List[Dataset]]) -> List[str]: + """Sorted list of all unique targets present in a dataset or list of datasets. + + :param datasets: the dataset(s). + :returns: Sorted list of all targets present in the dataset(s). + """ + + if not isinstance(datasets, list): + datasets = [datasets] + + # The following does not work because the `dataset` can also + # be a `Subset` object: + # return list(dataset.targets.keys()) + + # Iterate over all single instances of the dataset: + target_names = [] + for dataset in datasets: + for sample in dataset: + sample.pop("system") # system not needed + target_names += list(sample.keys()) + + return sorted(set(target_names))
+ + + +
+[docs] +def collate_fn(batch: List[Dict[str, Any]]) -> Tuple[List, Dict[str, TensorMap]]: + """ + Wraps `group_and_join` to + return the data fields as a list of systems, and a dictionary of nameed + targets. + """ + + collated_targets = group_and_join(batch) + systems = collated_targets.pop("system") + return systems, collated_targets
+ + + +
+[docs] +def check_datasets(train_datasets: List[Dataset], val_datasets: List[Dataset]): + """Check that the training and validation sets are compatible with one another + + Although these checks will not fit all use cases, most models would be expected + to be able to use this function. + + :param train_datasets: A list of training datasets to check. + :param val_datasets: A list of validation datasets to check + :raises TypeError: If the ``dtype`` within the datasets are inconsistent. + :raises ValueError: If the `val_datasets` has a target that is not present in + the ``train_datasets``. + :raises ValueError: If the training or validation set contains chemical species + or targets that are not present in the training set + """ + # Check that system `dtypes` are consistent within datasets + desired_dtype = train_datasets[0][0]["system"].positions.dtype + msg = f"`dtype` between datasets is inconsistent, found {desired_dtype} and " + for train_dataset in train_datasets: + actual_dtype = train_dataset[0]["system"].positions.dtype + if actual_dtype != desired_dtype: + raise TypeError(f"{msg}{actual_dtype} found in `train_datasets`") + + for val_dataset in val_datasets: + actual_dtype = val_dataset[0]["system"].positions.dtype + if actual_dtype != desired_dtype: + raise TypeError(f"{msg}{actual_dtype} found in `val_datasets`") + + # Get all targets in the training and validation sets: + train_targets = get_all_targets(train_datasets) + val_targets = get_all_targets(val_datasets) + + # Check that the validation sets do not have targets that are not in the + # training sets: + for target in val_targets: + if target not in train_targets: + raise ValueError( + f"The validation dataset has a target ({target}) that is not present " + "in the training dataset." + ) + # Get all the species in the training and validation sets: + all_train_species = get_atomic_types(train_datasets) + all_val_species = get_atomic_types(val_datasets) + + # Check that the validation sets do not have species that are not in the + # training sets: + for species in all_val_species: + if species not in all_train_species: + raise ValueError( + f"The validation dataset has a species ({species}) that is not in the " + "training dataset. This could be a result of a random train/validation " + "split. You can avoid this by providing a validation dataset manually." + )
+ + + +def _train_test_random_split( + train_dataset: Dataset, + train_size: float, + test_size: float, + generator: Optional[Generator] = default_generator, +) -> List[Dataset]: + if train_size <= 0: + raise ValueError("Fraction of the train set is smaller or equal to 0!") + + # normalize fractions + lengths = torch.tensor([train_size, test_size]) + lengths /= lengths.sum() + + if math.isclose(sum(lengths), 1) and sum(lengths) <= 1: + subset_lengths: List[int] = [] + for i, frac in enumerate(lengths): + if frac < 0 or frac > 1: + raise ValueError(f"Fraction at index {i} is not between 0 and 1") + n_items_in_split = int( + math.floor(len(train_dataset) * frac) # type: ignore[arg-type] + ) + subset_lengths.append(n_items_in_split) + remainder = len(train_dataset) - sum(subset_lengths) # type: ignore[arg-type] + # add 1 to all the lengths in round-robin fashion until the remainder is 0 + for i in range(remainder): + idx_to_add_at = i % len(subset_lengths) + subset_lengths[idx_to_add_at] += 1 + lengths = subset_lengths + for i, length in enumerate(lengths): + if length == 0: + warnings.warn( + f"Length of split at index {i} is 0. " + f"This might result in an empty dataset.", + UserWarning, + stacklevel=2, + ) + + # Cannot verify that train_dataset is Sized + if sum(lengths) != len(train_dataset): # type: ignore[arg-type] + raise ValueError( + "Sum of input lengths does not equal the length of the input dataset!" + ) + + indices = torch.randperm(sum(lengths), generator=generator).tolist() + return [ + Subset(train_dataset, indices[offset - length : offset]) + for offset, length in zip(itertools.accumulate(lengths), lengths) + ] + + +
+[docs] +def group_and_join( + batch: List[Dict[str, Any]], +) -> Dict[str, Any]: + """ + Same as metatenor.learn.data.group_and_join, but joins dicts and not named tuples. + + :param batch: A list of dictionaries, each containing the data for a single sample. + + :returns: A single dictionary with the data fields joined together among all + samples. + """ + data: List[Union[TensorMap, torch.Tensor]] = [] + names = batch[0].keys() + for name, f in zip(names, zip(*(item.values() for item in batch))): + if name == "sample_id": # special case, keep as is + data.append(f) + continue + + if isinstance(f[0], torch.ScriptObject) and f[0]._has_method( + "keys_to_properties" + ): # inferred metatensor.torch.TensorMap type + data.append(metatensor.torch.join(f, axis="samples")) + elif isinstance(f[0], torch.Tensor): # torch.Tensor type + data.append(torch.vstack(f)) + else: # otherwise just keep as a list + data.append(f) + + return {name: value for name, value in zip(names, data)}
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/data/readers/readers.html b/latest/_modules/metatrain/utils/data/readers/readers.html new file mode 100644 index 000000000..b41c93248 --- /dev/null +++ b/latest/_modules/metatrain/utils/data/readers/readers.html @@ -0,0 +1,679 @@ + + + + + + + + metatrain.utils.data.readers.readers - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.data.readers.readers

+import logging
+from pathlib import Path
+from typing import Dict, List, Optional, Tuple
+
+import torch
+from metatensor.torch import Labels, TensorBlock, TensorMap
+from metatensor.torch.atomistic import System
+from omegaconf import DictConfig
+
+from ..dataset import TargetInfo, TargetInfoDict
+from .systems import SYSTEM_READERS
+from .targets import ENERGY_READERS, FORCES_READERS, STRESS_READERS, VIRIAL_READERS
+
+
+logger = logging.getLogger(__name__)
+
+
+def _base_reader(
+    readers: dict,
+    filename: str,
+    fileformat: Optional[str] = None,
+    dtype: torch.dtype = torch.float32,
+    **reader_kwargs,
+):
+    if fileformat is None:
+        fileformat = Path(filename).suffix
+
+    try:
+        reader = readers[fileformat]
+    except KeyError:
+        raise ValueError(f"fileformat {fileformat!r} is not supported")
+
+    return reader(filename, dtype=dtype, **reader_kwargs)
+
+
+
+[docs] +def read_energy( + filename: str, + target_value: str = "energy", + fileformat: Optional[str] = None, + dtype: torch.dtype = torch.float32, +) -> List[TensorBlock]: + """Read energy informations from a file. + + :param filename: name of the file to read + :param target_value: target value key name to be parsed from the file. + :param fileformat: format of the system file. If :py:obj:`None` the format is + determined from the suffix + :param dtype: desired data type of returned tensor + :returns: target value stored stored as a :class:`metatensor.TensorBlock` + """ + return _base_reader( + readers=ENERGY_READERS, + filename=filename, + fileformat=fileformat, + key=target_value, + dtype=dtype, + )
+ + + +
+[docs] +def read_forces( + filename: str, + target_value: str = "forces", + fileformat: Optional[str] = None, + dtype: torch.dtype = torch.float32, +) -> List[TensorBlock]: + """Read force informations from a file. + + :param filename: name of the file to read + :param target_value: target value key name to be parsed from the file + :param fileformat: format of the system file. If :py:obj:`None` the format is + determined from the suffix + :param dtype: desired data type of returned tensor + :returns: target value stored stored as a :class:`metatensor.TensorBlock` + """ + return _base_reader( + readers=FORCES_READERS, + filename=filename, + fileformat=fileformat, + key=target_value, + dtype=dtype, + )
+ + + +
+[docs] +def read_stress( + filename: str, + target_value: str = "stress", + fileformat: Optional[str] = None, + dtype: torch.dtype = torch.float32, +) -> List[TensorBlock]: + """Read stress informations from a file. + + :param filename: name of the file to read + :param target_value: target value key name to be parsed from the file. + :param fileformat: format of the system file. If :py:obj:`None` the format is + determined from the suffix + :param dtype: desired data type of returned tensor + :returns: target value stored stored as a :class:`metatensor.TensorBlock` + """ + return _base_reader( + readers=STRESS_READERS, + filename=filename, + fileformat=fileformat, + key=target_value, + dtype=dtype, + )
+ + + +
+[docs] +def read_systems( + filename: str, + fileformat: Optional[str] = None, + dtype: torch.dtype = torch.float32, +) -> List[System]: + """Read system informations from a file. + + :param filename: name of the file to read + :param fileformat: format of the system file. If :py:obj:`None` the format is + determined from the suffix. + :param dtype: desired data type of returned tensor + :returns: list of systems + """ + return _base_reader( + readers=SYSTEM_READERS, + filename=filename, + fileformat=fileformat, + dtype=dtype, + )
+ + + +
+[docs] +def read_virial( + filename: str, + target_value: str = "virial", + fileformat: Optional[str] = None, + dtype: torch.dtype = torch.float32, +) -> List[TensorBlock]: + """Read virial informations from a file. + + :param filename: name of the file to read + :param target_value: target value key name to be parsed from the file. + :param fileformat: format of the system file. If :py:obj:`None` the format is + determined from the suffix. + :param dtype: desired data type of returned tensor + :returns: target value stored stored as a :class:`metatensor.TensorBlock` + """ + return _base_reader( + readers=VIRIAL_READERS, + filename=filename, + fileformat=fileformat, + key=target_value, + dtype=dtype, + )
+ + + +
+[docs] +def read_targets( + conf: DictConfig, + dtype: torch.dtype = torch.float32, +) -> Tuple[Dict[str, List[TensorMap]], TargetInfoDict]: + """Reading all target information from a fully expanded config. + + To get such a config you can use + :func:`metatrain.utils.omegaconf.expand_dataset_config`. + + This function uses subfunctions like :func:`read_energy` to parse the requested + target quantity. Currently only `energy` is a supported target property. But, within + the `energy` section gradients such as `forces`, the `stress` or the `virial` can be + added. Other gradients are silentlty irgnored. + + :param conf: config containing the keys for what should be read. + :param dtype: desired data type of returned tensor + :returns: Dictionary containing one TensorMaps for each target section in the config + as well as a ``TargetInfoDict`` instance containing the metadata of the targets. + + :raises ValueError: if the target name is not valid. Valid target names are + those that either start with ``mtt::`` or those that are in the list of + standard outputs of ``metatensor.torch.atomistic`` (see + https://docs.metatensor.org/latest/atomistic/outputs.html) + """ + target_dictionary = {} + target_info_dictionary = TargetInfoDict() + standard_outputs_list = ["energy"] + + for target_key, target in conf.items(): + target_info_gradients = set() + + if target_key not in standard_outputs_list and not target_key.startswith( + "mtt::" + ): + raise ValueError( + f"Target names must either be one of {standard_outputs_list} " + "or start with `mtt::`." + ) + if target["quantity"] == "energy": + blocks = read_energy( + filename=target["read_from"], + target_value=target["key"], + fileformat=target["file_format"], + dtype=dtype, + ) + + if target["forces"]: + try: + position_gradients = read_forces( + filename=target["forces"]["read_from"], + target_value=target["forces"]["key"], + fileformat=target["forces"]["file_format"], + dtype=dtype, + ) + except Exception: + logger.warning( + f"No Forces found in section {target_key!r}. " + "Continue without forces!" + ) + else: + logger.info( + f"Forces found in section {target_key!r}. Forces are taken for " + "training!" + ) + for block, position_gradient in zip(blocks, position_gradients): + block.add_gradient( + parameter="positions", gradient=position_gradient + ) + + target_info_gradients.add("positions") + + if target["stress"] and target["virial"]: + raise ValueError("Cannot use stress and virial at the same time!") + + if target["stress"]: + try: + strain_gradients = read_stress( + filename=target["stress"]["read_from"], + target_value=target["stress"]["key"], + fileformat=target["stress"]["file_format"], + dtype=dtype, + ) + except Exception: + logger.warning( + f"No Stress found in section {target_key!r}. " + "Continue without stress!" + ) + else: + logger.info( + f"Stress found in section {target_key!r}. Stress is taken for " + f"training!" + ) + for block, strain_gradient in zip(blocks, strain_gradients): + block.add_gradient(parameter="strain", gradient=strain_gradient) + + target_info_gradients.add("strain") + + if target["virial"]: + try: + strain_gradients = read_virial( + filename=target["virial"]["read_from"], + target_value=target["virial"]["key"], + fileformat=target["virial"]["file_format"], + dtype=dtype, + ) + except Exception: + logger.warning( + f"No Virial found in section {target_key!r}. " + "Continue without virial!" + ) + else: + logger.info( + f"Virial found in section {target_key!r}. Virial is taken for " + f"training!" + ) + for block, strain_gradient in zip(blocks, strain_gradients): + block.add_gradient(parameter="strain", gradient=strain_gradient) + + target_info_gradients.add("strain") + else: + raise ValueError( + f"Quantity: {target['quantity']!r} is not supported. Choose 'energy'." + ) + + target_dictionary[target_key] = [ + TensorMap( + keys=Labels(["_"], torch.tensor([[0]])), + blocks=[block], + ) + for block in blocks + ] + + target_info_dictionary[target_key] = TargetInfo( + quantity=target["quantity"], + unit=target["unit"], + per_atom=False, # TODO: read this from the config + gradients=target_info_gradients, + ) + + return target_dictionary, target_info_dictionary
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/data/readers/systems/ase.html b/latest/_modules/metatrain/utils/data/readers/systems/ase.html new file mode 100644 index 000000000..e2cdecf01 --- /dev/null +++ b/latest/_modules/metatrain/utils/data/readers/systems/ase.html @@ -0,0 +1,391 @@ + + + + + + + + metatrain.utils.data.readers.systems.ase - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.data.readers.systems.ase

+from typing import List
+
+import ase.io
+import torch
+from metatensor.torch.atomistic import System, systems_to_torch
+
+
+
+[docs] +def read_systems_ase(filename: str, dtype: torch.dtype = torch.float32) -> List[System]: + """Store system informations using ase. + + :param filename: name of the file to read + :param dtype: desired data type of returned tensor + + :returns: + A list of systems + """ + systems = [atoms for atoms in ase.io.read(filename, ":")] + + return [s.to(dtype=dtype) for s in systems_to_torch(systems)]
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/data/readers/targets/ase.html b/latest/_modules/metatrain/utils/data/readers/targets/ase.html new file mode 100644 index 000000000..058c99918 --- /dev/null +++ b/latest/_modules/metatrain/utils/data/readers/targets/ase.html @@ -0,0 +1,593 @@ + + + + + + + + metatrain.utils.data.readers.targets.ase - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.data.readers.targets.ase

+import warnings
+from typing import List
+
+import ase.io
+import torch
+from metatensor.torch import Labels, TensorBlock
+
+
+
+[docs] +def read_energy_ase( + filename: str, + key: str, + dtype: torch.dtype = torch.float32, +) -> List[TensorBlock]: + """Store energy information in a List of :class:`metatensor.TensorBlock`. + + :param filename: name of the file to read + :param key: target value key name to be parsed from the file. + :param dtype: desired data type of returned tensor + + :returns: + TensorMap containing the given information + """ + frames = ase.io.read(filename, ":") + + properties = Labels("energy", torch.tensor([[0]])) + + blocks = [] + for i_system, atoms in enumerate(frames): + if key not in atoms.info: + raise ValueError( + f"energy key {key!r} was not found in system {filename!r} at index " + f"{i_system}" + ) + + values = torch.tensor([[atoms.info[key]]], dtype=dtype) + samples = Labels(["system"], torch.tensor([[i_system]])) + + block = TensorBlock( + values=values, + samples=samples, + components=[], + properties=properties, + ) + blocks.append(block) + + return blocks
+ + + +
+[docs] +def read_forces_ase( + filename: str, + key: str = "energy", + dtype: torch.dtype = torch.float32, +) -> List[TensorBlock]: + """Store force information in a List of :class:`metatensor.TensorBlock` which can be + used as ``position`` gradients. + + :param filename: name of the file to read + :param key: target value key name to be parsed from the file. + :param dtype: desired data type of returned tensor + + :returns: + TensorMap containing the given information + """ + frames = ase.io.read(filename, ":") + + components = [Labels(["xyz"], torch.arange(3).reshape(-1, 1))] + properties = Labels("energy", torch.tensor([[0]])) + + blocks = [] + for i_system, atoms in enumerate(frames): + + if key not in atoms.arrays: + raise ValueError( + f"forces key {key!r} was not found in system {filename!r} at index " + f"{i_system}" + ) + + # We store forces as positions gradients which means we invert the sign + values = -torch.tensor(atoms.arrays[key], dtype=dtype) + values = values.reshape(-1, 3, 1) + + samples = Labels( + ["sample", "system", "atom"], + torch.tensor([[0, i_system, a] for a in range(len(values))]), + ) + + block = TensorBlock( + values=values, + samples=samples, + components=components, + properties=properties, + ) + + blocks.append(block) + + return blocks
+ + + +
+[docs] +def read_virial_ase( + filename: str, + key: str = "virial", + dtype: torch.dtype = torch.float32, +) -> List[TensorBlock]: + """Store virial information in a List of :class:`metatensor.TensorBlock` which can + be used as ``strain`` gradients. + + :param filename: name of the file to read + :param key: target value key name to be parsed from the file + :param dtype: desired data type of returned tensor + + :returns: + TensorMap containing the given information + """ + return _read_virial_stress_ase( + filename=filename, key=key, is_virial=True, dtype=dtype + )
+ + + +
+[docs] +def read_stress_ase( + filename: str, + key: str = "stress", + dtype: torch.dtype = torch.float32, +) -> List[TensorBlock]: + """Store stress information in a List of :class:`metatensor.TensorBlock` which can + be used as ``strain`` gradients. + + :param filename: name of the file to read + :param key: target value key name to be parsed from the file + :param dtype: desired data type of returned tensor + + :returns: + TensorMap containing the given information + """ + return _read_virial_stress_ase( + filename=filename, key=key, is_virial=False, dtype=dtype + )
+ + + +def _read_virial_stress_ase( + filename: str, + key: str, + is_virial: bool = True, + dtype: torch.dtype = torch.float32, +) -> List[TensorBlock]: + """Store stress or virial information in a List of :class:`metatensor.TensorBlock` + which can be used as ``strain`` gradients. + + :param filename: name of the file to read + :param key: target value key name to be parsed from the file + :param is_virial: if target values are stored as stress or virials. + :param dtype: desired data type of returned tensor + + :returns: TensorMap containing the given information + """ + frames = ase.io.read(filename, ":") + + samples = Labels(["sample"], torch.tensor([[0]])) + components = [ + Labels(["xyz_1"], torch.arange(3).reshape(-1, 1)), + Labels(["xyz_2"], torch.arange(3).reshape(-1, 1)), + ] + properties = Labels("energy", torch.tensor([[0]])) + + blocks = [] + for i_system, atoms in enumerate(frames): + if key not in atoms.info: + if is_virial: + target_name = "virial" + else: + target_name = "stress" + + raise ValueError( + f"{target_name} key {key!r} was not found in system {filename!r} at " + f"index {i_system}" + ) + + values = torch.tensor(atoms.info[key].tolist(), dtype=dtype) + + if values.shape == (9,): + warnings.warn( + "Found 9-long numerical vector for the stress/virial in system " + f"{i_system}. Assume a row major format for the conversion into a " + "3 x 3 matrix.", + stacklevel=2, + ) + elif values.shape != (3, 3): + raise ValueError( + f"Values in system {i_system} has shape {values.shape}. " + "Stress/virial must be a 3 x 3 matrix or a 9-long numerical vector." + ) + + values = values.reshape(-1, 3, 3, 1) + + if is_virial: + values *= -1 + else: # is stress + if atoms.cell.volume == 0: + raise ValueError( + f"system {i_system} has zero cell vectors. Stress can only " + "be used if cell is non zero." + ) + values *= atoms.cell.volume + + block = TensorBlock( + values=values, + samples=samples, + components=components, + properties=properties, + ) + blocks.append(block) + + return blocks +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/data/system_to_ase.html b/latest/_modules/metatrain/utils/data/system_to_ase.html new file mode 100644 index 000000000..8ae4b517c --- /dev/null +++ b/latest/_modules/metatrain/utils/data/system_to_ase.html @@ -0,0 +1,398 @@ + + + + + + + + metatrain.utils.data.system_to_ase - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.data.system_to_ase

+import ase
+from metatensor.torch.atomistic import System
+
+
+
+[docs] +def system_to_ase(system: System) -> ase.Atoms: + """Converts a ``metatensor.torch.atomistic.System`` to an ``ase.Atoms`` object. + This will discard any neighbor lists attached to the ``System``. + + :param system: The system to convert. + + :return: The system as an ``ase.Atoms`` object. + """ + + # Convert the system to an ASE atoms object + positions = system.positions.detach().cpu().numpy() + numbers = system.types.detach().cpu().numpy() + cell = system.cell.detach().cpu().numpy() + pbc = list(cell.any(axis=1)) + atoms = ase.Atoms( + numbers=numbers, + positions=positions, + cell=cell, + pbc=pbc, + ) + + return atoms
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/data/writers.html b/latest/_modules/metatrain/utils/data/writers.html new file mode 100644 index 000000000..fbdd057d9 --- /dev/null +++ b/latest/_modules/metatrain/utils/data/writers.html @@ -0,0 +1,420 @@ + + + + + + + + metatrain.utils.data.writers - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.data.writers

+from typing import List, Optional
+
+from pathlib import Path
+from metatensor.torch import TensorMap
+from metatensor.torch.atomistic import System, ModelCapabilities
+
+from .xyz import write_xyz
+
+
+PREDICTIONS_WRITERS = {".xyz": write_xyz}
+""":py:class:`dict`: dictionary mapping file suffixes to a prediction writers"""
+
+
+
+[docs] +def write_predictions( + filename: str, + systems: List[System], + capabilities: ModelCapabilities, + predictions: TensorMap, + fileformat: Optional[str] = None, +) -> None: + """Writes predictions to a file. + + For certain file suffixes, the systems will also be written (i.e ``xyz``). + + The capabilities of the model are used to infer the type (physical quantity) of + the predictions. In this way, for example, position gradients of energies can be + saved as forces. + + For the moment, strain gradients of the energy are saved as stresses + (and not as virials). + + :param filename: name of the file to write + :param systems: list of systems that for some writers will also be written + :param capabilities: capabilities of the model + :param predictions: :py:class:`metatensor.torch.TensorMap` containing the + predictions that should be written + :param fileformat: format of the target value file. If :py:obj:`None` the format is + determined from the suffix. + """ + if fileformat is None: + fileformat = Path(filename).suffix + + try: + writer = PREDICTIONS_WRITERS[fileformat] + except KeyError: + raise ValueError(f"fileformat '{fileformat}' is not supported") + + return writer(filename, systems, capabilities, predictions)
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/data/writers/xyz.html b/latest/_modules/metatrain/utils/data/writers/xyz.html new file mode 100644 index 000000000..5ebaa4ff4 --- /dev/null +++ b/latest/_modules/metatrain/utils/data/writers/xyz.html @@ -0,0 +1,499 @@ + + + + + + + + metatrain.utils.data.writers.xyz - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.data.writers.xyz

+from typing import Dict, List
+
+import ase
+import ase.io
+import metatensor.torch
+import torch
+from metatensor.torch import Labels, TensorMap
+from metatensor.torch.atomistic import ModelCapabilities, System
+
+from ...external_naming import to_external_name
+
+
+
+[docs] +def write_xyz( + filename: str, + systems: List[System], + capabilities: ModelCapabilities, + predictions: Dict[str, TensorMap], +) -> None: + """An ase-based xyz file writer. Writes the systems and predictions to an xyz file. + + According to ASE practice, arrays which have a dimension corresponding + to each atom are saved inside atoms.arrays, while any other arrays are + saved inside atoms.info. + + :param filename: name of the file to read. + :param systems: structures to be written to the file. + :param: capabilities: capabilities of the model. + :param predictions: prediction values to be written to the file. + """ + + # we first split the predictions by structure + predictions_by_structure: List[Dict[str, TensorMap]] = [{} for _ in systems] + split_labels = [ + Labels(names=["system"], values=torch.tensor([[i_system]])) + for i_system in range(len(systems)) + ] + for target_name, target_tensor_map in predictions.items(): + # split this target by structure + split_target = metatensor.torch.split( + target_tensor_map, "samples", split_labels + ) + for i_system, system_target in enumerate(split_target): + # add the split target to the dict corresponding to the structure + predictions_by_structure[i_system][target_name] = system_target + + frames = [] + for system, system_predictions in zip(systems, predictions_by_structure): + info = {} + arrays = {} + for target_name, target_map in system_predictions.items(): + if len(target_map.keys.names) != 1: + raise ValueError( + "Only single-block `TensorMap`s can be " + "written to xyz files for the moment." + ) + block = target_map.block() + if "atom" in block.samples.names: + # save inside arrays + arrays[target_name] = block.values.detach().cpu().numpy() + else: + # save inside info + if block.values.numel() == 1: + info[target_name] = block.values.item() + else: + info[target_name] = block.values.detach().cpu().numpy() + + for gradient_name, gradient_block in block.gradients(): + # here, we assume that gradients are always an array, and never a scalar + internal_name = f"{target_name}_{gradient_name}_gradients" + external_name = to_external_name(internal_name, capabilities.outputs) + + if "forces" in external_name: + arrays[external_name] = ( + # squeeze the property dimension + -gradient_block.values.detach() + .cpu() + .squeeze(-1) + .numpy() + ) + elif "virial" in external_name: + # in this case, we write both the virial and the stress + external_name_virial = external_name + external_name_stress = external_name.replace("virial", "stress") + strain_derivatives = ( + # squeeze the property dimension + gradient_block.values.detach() + .cpu() + .squeeze(-1) + .numpy() + ) + if not torch.any(system.cell != 0): + raise ValueError( + "stresses cannot be written for non-periodic systems." + ) + cell_volume = torch.det(system.cell).item() + if cell_volume == 0: + raise ValueError( + "stresses cannot be written for " + "systems with zero volume." + ) + info[external_name_virial] = -strain_derivatives + info[external_name_stress] = strain_derivatives / cell_volume + else: + info[external_name] = ( + # squeeze the property dimension + gradient_block.values.detach() + .cpu() + .squeeze(-1) + .numpy() + ) + + atoms = ase.Atoms( + symbols=system.types, positions=system.positions.detach(), info=info + ) + + # assign cell and pbcs + if torch.any(system.cell != 0): + atoms.pbc = True + atoms.cell = system.cell.detach().cpu().numpy() + + # assign arrays + for array_name, array in arrays.items(): + atoms.arrays[array_name] = array + + frames.append(atoms) + + ase.io.write(filename, frames)
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/devices.html b/latest/_modules/metatrain/utils/devices.html new file mode 100644 index 000000000..42e4127c6 --- /dev/null +++ b/latest/_modules/metatrain/utils/devices.html @@ -0,0 +1,463 @@ + + + + + + + + metatrain.utils.devices - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.devices

+import warnings
+from typing import List, Optional
+
+import torch
+
+
+def _get_available_devices() -> List[str]:
+    available_devices = ["cpu"]
+    if torch.cuda.is_available():
+        available_devices.append("cuda")
+        if torch.cuda.device_count() > 1:
+            available_devices.append("multi-cuda")
+    # for torch<2.0 `torch.backends.mps.is_available()` is required for a reasonable
+    # check.
+    if torch.backends.mps.is_built() and torch.backends.mps.is_available():
+        available_devices.append("mps")
+
+    return available_devices
+
+
+
+[docs] +def pick_devices( + architecture_devices: List[str], + desired_device: Optional[str] = None, +) -> List[torch.device]: + """Pick (best) devices for training. + + The choice is made on the intersection of the ``architecture_devices`` and the + available devices on the current system. If no ``desired_device`` is provided the + first device of this intersection will be returned. + + :param architecture_devices: Devices supported by the architecture. The list should + be sorted by the preference of the architecture while the most prefferred device + should be first and the least one last. + :param desired_device: desired device by the user + """ + + available_devices = _get_available_devices() + + # intersect between available and architecture's devices. keep order of architecture + possible_devices = [d for d in architecture_devices if d in available_devices] + + if not possible_devices: + raise ValueError( + f"No matching device found! The architecture requires " + f"{', '.join(architecture_devices)}; but your system only has " + f"{', '.join(available_devices)}." + ) + + # If desired device given compare the possible devices and try to find a match + if desired_device is None: + desired_device = possible_devices[0] + else: + desired_device = desired_device.lower() + + # convert "gpu" and "multi-gpu" to "cuda" or "mps" if available + if desired_device == "gpu": + if torch.cuda.is_available(): + desired_device = "cuda" + elif torch.backends.mps.is_built() and torch.backends.mps.is_available(): + desired_device = "mps" + else: + raise ValueError( + "Requested 'gpu' device, but found no GPU (CUDA or MPS) devices." + ) + if desired_device == "multi-gpu": + desired_device = "multi-cuda" + + if desired_device not in possible_devices: + raise ValueError( + f"Unsupported desired device {desired_device!r}. " + f"Please choose from {', '.join(possible_devices)}." + ) + if desired_device == "multi-cuda" and torch.cuda.device_count() < 2: + raise ValueError( + "Requested device 'multi-gpu' or 'multi-cuda', but found only one CUDA " + "device. If you want to run on a single GPU, please use 'gpu' or " + "'cuda' instead." + ) + + if possible_devices.index(desired_device) > 0: + warnings.warn( + f"Device {desired_device!r} requested, but {possible_devices[0]!r} is " + "prefferred by the architecture and available on current system.", + stacklevel=2, + ) + + # convert the requested device to a list of torch devices + if desired_device == "multi-cuda": + return [torch.device(f"cuda:{i}") for i in range(torch.cuda.device_count())] + else: + return [torch.device(desired_device)]
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/dtype.html b/latest/_modules/metatrain/utils/dtype.html new file mode 100644 index 000000000..401b26705 --- /dev/null +++ b/latest/_modules/metatrain/utils/dtype.html @@ -0,0 +1,391 @@ + + + + + + + + metatrain.utils.dtype - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.dtype

+import torch
+
+
+
+[docs] +def dtype_to_str(dtype: torch.dtype) -> str: + """ + Convert a torch dtype to its string representation. + + :param dtype: torch dtype to convert + :returns: string representation of the torch dtype + + Example + ------- + >>> import torch + >>> dtype_to_str(torch.float64) + "float64" + >>> dtype_to_str(torch.int32) + "int32" + """ + return str(dtype).split(".")[-1]
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/errors.html b/latest/_modules/metatrain/utils/errors.html new file mode 100644 index 000000000..e3b920e82 --- /dev/null +++ b/latest/_modules/metatrain/utils/errors.html @@ -0,0 +1,391 @@ + + + + + + + + metatrain.utils.errors - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.errors

+
+[docs] +class ArchitectureError(Exception): + """ + Exception raised for errors originating from architectures + + This exception should be raised when an error occurs within an architecture's + operation, indicating that the problem is not directly related to the + metatrain infrastructure but rather to the specific architecture being used. + + :param exception: The original exception that was caught, which led to raising this + custom exception. + """ + + def __init__(self, exception): + super().__init__( + f"{exception}\n\nThe error above most likely originates from an " + "architecture.\n\nIf you think this is a bug, please contact its " + "maintainer (see the architecture's documentation) and include the full " + "traceback error.log." + )
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/evaluate_model.html b/latest/_modules/metatrain/utils/evaluate_model.html new file mode 100644 index 000000000..c7f13354f --- /dev/null +++ b/latest/_modules/metatrain/utils/evaluate_model.html @@ -0,0 +1,672 @@ + + + + + + + + metatrain.utils.evaluate_model - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.evaluate_model

+import warnings
+from typing import Dict, List, Union
+
+import metatensor.torch
+import torch
+from metatensor.torch import Labels, TensorBlock, TensorMap
+from metatensor.torch.atomistic import (
+    MetatensorAtomisticModel,
+    ModelEvaluationOptions,
+    ModelOutput,
+    System,
+    register_autograd_neighbors,
+)
+
+from .data import TargetInfoDict
+from .export import is_exported
+from .output_gradient import compute_gradient
+
+
+# Ignore metatensor-torch warning due to the fact that positions/cell
+# already require grad when registering the NL
+warnings.filterwarnings(
+    "ignore",
+    category=UserWarning,
+    message="neighbor",
+)  # TODO: this is not filtering out the warning for some reason, therefore:
+
+
+
+[docs] +def evaluate_model( + model: Union[ + torch.nn.Module, + MetatensorAtomisticModel, + torch.jit._script.RecursiveScriptModule, + ], + systems: List[System], + targets: TargetInfoDict, + is_training: bool, +) -> Dict[str, TensorMap]: + """ + Evaluate the model (in training or exported) on a set of requested targets. + + :param model: The model to use. This can either be a model in training + (``torch.nn.Module``) or an exported model + (``torch.jit._script.RecursiveScriptModule``). + :param systems: The systems to use. + :param targets: The names of the targets to evaluate (keys), along with + their associated gradients (values). + :param is_training: Whether the model is being computed during training. + + :returns: The predictions of the model for the requested targets. + """ + model_outputs = _get_outputs(model) + # Assert that all targets are within the model's capabilities: + if not set(targets.keys()).issubset(model_outputs.keys()): + raise ValueError("Not all targets are within the model's capabilities.") + + # Find if there are any energy targets that require gradients: + energy_targets = [] + energy_targets_that_require_position_gradients = [] + energy_targets_that_require_strain_gradients = [] + for target_name in targets.keys(): + # Check if the target is an energy: + if model_outputs[target_name].quantity == "energy": + energy_targets.append(target_name) + # Check if the energy requires gradients: + if "positions" in targets[target_name].gradients: + energy_targets_that_require_position_gradients.append(target_name) + if "strain" in targets[target_name].gradients: + energy_targets_that_require_strain_gradients.append(target_name) + + new_systems = [] + strains = [] + for system in systems: + new_system, strain = _prepare_system( + system, + positions_grad=len(energy_targets_that_require_position_gradients) > 0, + strain_grad=len(energy_targets_that_require_strain_gradients) > 0, + ) + new_systems.append(new_system) + strains.append(strain) + systems = new_systems + + # Based on the keys of the targets, get the outputs of the model: + model_outputs = _get_model_outputs(model, systems, targets) + + for energy_target in energy_targets: + # If the energy target requires gradients, compute them: + target_requires_pos_gradients = ( + energy_target in energy_targets_that_require_position_gradients + ) + target_requires_strain_gradients = ( + energy_target in energy_targets_that_require_strain_gradients + ) + if target_requires_pos_gradients and target_requires_strain_gradients: + gradients = compute_gradient( + model_outputs[energy_target].block().values, + [system.positions for system in systems] + strains, + is_training=is_training, + ) + old_energy_tensor_map = model_outputs[energy_target] + new_block = old_energy_tensor_map.block().copy() + new_block.add_gradient( + "positions", _position_gradients_to_block(gradients[: len(systems)]) + ) + new_block.add_gradient( + "strain", + _strain_gradients_to_block(gradients[len(systems) :]), + ) + new_energy_tensor_map = TensorMap( + keys=old_energy_tensor_map.keys, + blocks=[new_block], + ) + model_outputs[energy_target] = new_energy_tensor_map + elif target_requires_pos_gradients: + gradients = compute_gradient( + model_outputs[energy_target].block().values, + [system.positions for system in systems], + is_training=is_training, + ) + old_energy_tensor_map = model_outputs[energy_target] + new_block = old_energy_tensor_map.block().copy() + new_block.add_gradient("positions", _position_gradients_to_block(gradients)) + new_energy_tensor_map = TensorMap( + keys=old_energy_tensor_map.keys, + blocks=[new_block], + ) + model_outputs[energy_target] = new_energy_tensor_map + elif target_requires_strain_gradients: + gradients = compute_gradient( + model_outputs[energy_target].block().values, + strains, + is_training=is_training, + ) + old_energy_tensor_map = model_outputs[energy_target] + new_block = old_energy_tensor_map.block().copy() + new_block.add_gradient("strain", _strain_gradients_to_block(gradients)) + new_energy_tensor_map = TensorMap( + keys=old_energy_tensor_map.keys, + blocks=[new_block], + ) + model_outputs[energy_target] = new_energy_tensor_map + else: + pass + + return model_outputs
+ + + +def _position_gradients_to_block(gradients_list): + """Convert a list of position gradients to a `TensorBlock` + which can act as a gradient block to an energy block.""" + + # `gradients` consists of a list of tensors where the second dimension is 3 + gradients = torch.concatenate(gradients_list, dim=0).unsqueeze(-1) + # unsqueeze for the property dimension + + samples = Labels( + names=["sample", "atom"], + values=torch.stack( + [ + torch.concatenate( + [ + torch.tensor([i] * len(system)) + for i, system in enumerate(gradients_list) + ] + ), + torch.concatenate( + [torch.arange(len(system)) for system in gradients_list] + ), + ], + dim=1, + ), + ) + + components = [ + Labels( + names=["xyz"], + values=torch.tensor([[0], [1], [2]]), + ) + ] + + return TensorBlock( + values=gradients, + samples=samples.to(gradients.device), + components=[c.to(gradients.device) for c in components], + properties=Labels("energy", torch.tensor([[0]])).to(gradients.device), + ) + + +def _strain_gradients_to_block(gradients_list): + """Convert a list of strain gradients to a `TensorBlock` + which can act as a gradient block to an energy block.""" + + gradients = torch.stack(gradients_list, dim=0).unsqueeze(-1) + # unsqueeze for the property dimension + + samples = Labels( + names=["sample"], values=torch.arange(len(gradients_list)).unsqueeze(-1) + ) + + components = [ + Labels( + names=["xyz_1"], + values=torch.tensor([[0], [1], [2]]), + ), + Labels( + names=["xyz_2"], + values=torch.tensor([[0], [1], [2]]), + ), + ] + + return TensorBlock( + values=gradients, + samples=samples.to(gradients.device), + components=[c.to(gradients.device) for c in components], + properties=Labels("energy", torch.tensor([[0]])).to(gradients.device), + ) + + +def _get_outputs( + model: Union[torch.nn.Module, torch.jit._script.RecursiveScriptModule] +): + if is_exported(model): + return model.capabilities().outputs + else: + return model.outputs + + +def _get_model_outputs( + model: Union[ + torch.nn.Module, + MetatensorAtomisticModel, + torch.jit._script.RecursiveScriptModule, + ], + systems: List[System], + targets: TargetInfoDict, +) -> Dict[str, TensorMap]: + if is_exported(model): + # put together an EvaluationOptions object + options = ModelEvaluationOptions( + length_unit="", # this is only needed for unit conversions in MD engines + outputs={ + key: ModelOutput( + quantity=value.quantity, unit=value.unit, per_atom=value.per_atom + ) + for key, value in targets.items() + }, + ) + # we check consistency here because this could be called from eval + return model(systems, options, check_consistency=True) + else: + return model( + systems, + { + key: ModelOutput( + quantity=value.quantity, unit=value.unit, per_atom=value.per_atom + ) + for key, value in targets.items() + }, + ) + + +def _prepare_system(system: System, positions_grad: bool, strain_grad: bool): + """ + Prepares a system for gradient calculation. + """ + if strain_grad: + strain = torch.eye( + 3, + requires_grad=True, + dtype=system.cell.dtype, + device=system.cell.device, + ) + new_system = System( + positions=system.positions @ strain, + cell=system.cell @ strain, + types=system.types, + ) + else: + if positions_grad: + new_system = System( + positions=system.positions.detach().clone().requires_grad_(True), + cell=system.cell, + types=system.types, + ) + strain = None + else: + new_system = System( + positions=system.positions, + cell=system.cell, + types=system.types, + ) + strain = None + + for nl_options in system.known_neighbor_lists(): + nl = system.get_neighbor_list(nl_options) + nl = metatensor.torch.detach_block(nl) + register_autograd_neighbors(new_system, nl, check_consistency=True) + new_system.add_neighbor_list(nl_options, nl) + + return new_system, strain +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/export.html b/latest/_modules/metatrain/utils/export.html new file mode 100644 index 000000000..54ceff2b3 --- /dev/null +++ b/latest/_modules/metatrain/utils/export.html @@ -0,0 +1,440 @@ + + + + + + + + metatrain.utils.export - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.export

+import warnings
+from typing import Any
+
+import torch
+from metatensor.torch.atomistic import (
+    MetatensorAtomisticModel,
+    ModelCapabilities,
+    ModelMetadata,
+)
+
+
+# TODO: DELETE OR CHANGE THIS FUNCTION.
+# EXPORT IS NOW PER-ARCHITECTURE
+
+
+
+[docs] +def export( + model: torch.nn.Module, model_capabilities: ModelCapabilities +) -> MetatensorAtomisticModel: + """Export a torch.nn.Module model to a MetatensorAtomisticModel. + + The exoort allows the model to make predictions especially in molecular simulation + engines. Exported models can be be saved to a file with + ``exported_model.export(path)``. + + :param model: model to be exported + :param model_capabilities: capabilities of the model + :returns: exprted model + """ + + if is_exported(model): + return model + + if model_capabilities.length_unit == "": + warnings.warn( + "No `length_unit` was provided for the model. As a result, lengths " + "and any derived quantities will be passed to MD engines as is.", + stacklevel=1, + ) + + for model_output_name, model_output in model_capabilities.outputs.items(): + if model_output.unit == "": + warnings.warn( + f"No target units were provided for output {model_output_name!r}. " + "As a result, this model output will be passed to MD engines as is.", + stacklevel=1, + ) + + return MetatensorAtomisticModel(model.eval(), ModelMetadata(), model_capabilities)
+ + + +
+[docs] +def is_exported(model: Any) -> bool: + """Check if a model has been exported to a MetatensorAtomisticModel. + + :param model: The model to check + :return: :py:obj:`True` if the ``model`` has been exported, :py:obj:`False` + otherwise. + """ + # If the model is saved and loaded again, its type is RecursiveScriptModule + if type(model) in [ + MetatensorAtomisticModel, + torch.jit._script.RecursiveScriptModule, + ]: + return True + else: + return False
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/external_naming.html b/latest/_modules/metatrain/utils/external_naming.html new file mode 100644 index 000000000..8ba8e5b31 --- /dev/null +++ b/latest/_modules/metatrain/utils/external_naming.html @@ -0,0 +1,446 @@ + + + + + + + + metatrain.utils.external_naming - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.external_naming

+from typing import Dict, Union
+
+from metatensor.torch.atomistic import ModelOutput
+
+
+
+[docs] +def to_external_name( + internal_name: str, quantities: Union[Dict[str, ModelOutput]] +) -> str: + """Converts internal names to external names. + + Very often, the "common" names for quantities are different from the + internal names used in the code. Two important examples are forces and + virials, which are referred to as energy_positions_gradients and + energy_strain_gradients, respectively, in the code. This function + converts an internal name to an external name. + + :param internal_name: An internal name to convert. + :param quantities: A dictionary of physical quantities, either as + :py:class:`TargetInfo` objects or as :py:class:`ModelOutput` objects. + + :return: The name for external use. + """ + + if internal_name.endswith("_positions_gradients"): + base_name = internal_name.replace("_positions_gradients", "") + if quantities[base_name].quantity == "energy": + if base_name == "energy": # we treat "energy" as a special case + external_name = "forces" + else: + external_name = f"forces[{base_name}]" + else: + external_name = internal_name + elif internal_name.endswith("_strain_gradients"): + base_name = internal_name.replace("_strain_gradients", "") + if quantities[base_name].quantity == "energy": + if base_name == "energy": + external_name = "virial" + else: + external_name = f"virial[{base_name}]" + else: + external_name = internal_name + else: + external_name = internal_name + + return external_name
+ + + +
+[docs] +def to_internal_name(external_name: str) -> str: + """Converts an external names to internal names. + + This function is the inverse of :func:`to_external_names`. + + :param external_names: A list of names to convert. + + :return: The list of names for internal use. + """ + + if external_name == "forces": + internal_name = "energy_positions_gradients" + elif external_name.startswith("forces[") and external_name.endswith("]"): + base_name = external_name[7:-1] + internal_name = f"{base_name}_positions_gradients" + elif external_name == "virial": + internal_name = "energy_strain_gradients" + elif external_name.startswith("virial[") and external_name.endswith("]"): + base_name = external_name[7:-1] + internal_name = f"{base_name}_strain_gradients" + else: + internal_name = external_name + + return internal_name
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/io.html b/latest/_modules/metatrain/utils/io.html new file mode 100644 index 000000000..5511bef52 --- /dev/null +++ b/latest/_modules/metatrain/utils/io.html @@ -0,0 +1,402 @@ + + + + + + + + metatrain.utils.io - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.io

+import warnings
+from pathlib import Path
+from typing import Union
+
+
+
+[docs] +def check_suffix(filename: Union[str, Path], suffix: str) -> Union[str, Path]: + """Check the suffix of a file name and adds if it not existing. + + If ``filename`` does not end with ``suffix`` the ``suffix`` is added and a warning + will be issued. + + :param filename: Name of the file to be checked. + :param suffix: Expected filesuffix i.e. ``.txt``. + :returns: Checked and probably extended file name. + """ + path_filename = Path(filename) + + if path_filename.suffix != suffix: + warnings.warn( + f"The file name should have a '{suffix}' extension. The user " + f"requested the file with name '{filename}', but it will be saved as " + f"'{filename}{suffix}'.", + stacklevel=1, + ) + path_filename = path_filename.parent / (path_filename.name + suffix) + + if type(filename) is str: + return str(path_filename) + else: + return path_filename
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/logging.html b/latest/_modules/metatrain/utils/logging.html new file mode 100644 index 000000000..e0fff7cdd --- /dev/null +++ b/latest/_modules/metatrain/utils/logging.html @@ -0,0 +1,629 @@ + + + + + + + + metatrain.utils.logging - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.logging

+"""Logging."""
+
+import contextlib
+import logging
+import sys
+from pathlib import Path
+from typing import Dict, List, Optional, Tuple, Union
+
+import numpy as np
+import torch
+from metatensor.torch.atomistic import ModelCapabilities
+
+from .data import DatasetInfo
+from .distributed.logging import is_main_process
+from .external_naming import to_external_name
+from .io import check_suffix
+from .units import ev_to_mev, get_gradient_units
+
+
+
+[docs] +class MetricLogger: + def __init__( + self, + logobj: logging.Logger, + dataset_info: Union[ModelCapabilities, DatasetInfo], + initial_metrics: Union[Dict[str, float], List[Dict[str, float]]], + names: Union[str, List[str]] = "", + ): + """ + Simple interface to log training metrics logging instance. + + Initialize the metric logger. The logger is initialized with the initial metrics + and names relative to the metrics (e.g., "train", "validation"). + + In this way, and by assuming that these metrics never increase, the logger can + align the output to make it easier to read. + + :param logobj: A logging instance + :param model_outputs: outputs of the model. Used to infer physical quantities + and units + :param initial_metrics: initial training metrics + :param names: names of the metrics (e.g., "train", "validation") + """ + self.logobj = logobj + + # Length units will be used to infer units of forces/virials + assert isinstance(dataset_info.length_unit, str) + self.length_unit = dataset_info.length_unit + + # Save the model outputs. This will be useful to know + # what physical quantities we are printing, along with their units + if isinstance(dataset_info, DatasetInfo): + self.model_outputs = dataset_info.targets + elif isinstance(dataset_info, torch.ScriptObject): # ModelCapabilities + self.model_outputs = dataset_info.outputs + else: + raise ValueError( + f"dataset_info must be of type `DatasetInfo` or `ModelCapabilities`, " + f"not {type(dataset_info)}" + ) + + if isinstance(initial_metrics, dict): + initial_metrics = [initial_metrics] + if isinstance(names, str): + names = [names] + + self.names = names + + # Since the quantities are supposed to decrease, we want to store the + # number of digits at the start of the training, so that we can align + # the output later: + self.digits = {} + for name, metrics_dict in zip(names, initial_metrics): + for key, value in metrics_dict.items(): + target_name = key.split(" ", 1)[0] + if "loss" in key: + # losses will be printed in scientific notation + continue + unit = self._get_units(target_name) + value, unit = ev_to_mev(value, unit) + self.digits[f"{name}_{key}"] = _get_digits(value) + +
+[docs] + def log( + self, + metrics: Union[Dict[str, float], List[Dict[str, float]]], + epoch: Optional[int] = None, + rank: Optional[int] = None, + ): + """ + Log the metrics. + + The metrics are automatically aligned to make them easier to read, based on + the order of magnitude of each metric given to the class at initialization. + + :param metrics: The current metrics to be printed. + :param epoch: The current epoch (optional). If :py:class:`None`, the epoch + will not be printed, and the logging string will start with the first + metric in the ``metrics`` dictionary. + :param rank: The rank of the process, if the training is distributed. In that + case, the logger will only print the metrics for the process with rank 0. + """ + + if isinstance(metrics, dict): + metrics = [metrics] + + if epoch is None: + logging_string = "" + else: + # The epoch is printed with 4 digits, assuming that the training + # will not last more than 9999 epochs + logging_string = f"Epoch {epoch:4}" + + for name, metrics_dict in zip(self.names, metrics): + for key, value in metrics_dict.items(): + + new_key = key + if key != "loss": # special case: not a metric associated with a target + target_name, metric = new_key.split(" ", 1) + external_name = to_external_name(target_name, self.model_outputs) # type: ignore # noqa: E501 + new_key = f"{external_name} {metric}" + + if name == "": + logging_string += f", {new_key}: " + else: + logging_string += f", {name} {new_key}: " + if "loss" in key: # print losses with scientific notation + logging_string += f"{value:.3e}" + else: + unit = self._get_units(target_name) + value, unit = ev_to_mev(value, unit) + logging_string += ( + f"{value:{self.digits[f'{name}_{key}'][0]}.{self.digits[f'{name}_{key}'][1]}f}" # noqa: E501 + + (f" {unit}" if unit != "" else "") + ) + + # If there is no epoch, the string will start with a comma. Remove it: + if logging_string.startswith(", "): + logging_string = logging_string[2:] + + if rank is None or rank == 0: + self.logobj.info(logging_string)
+ + + def _get_units(self, output: str) -> str: + # Gets the units of an output + if output.endswith("_gradients"): + # handling <base_name>_<gradient_name>_gradients + base_name = output[:-10] + gradient_name = base_name.split("_")[-1] + base_name = base_name.replace(f"_{gradient_name}", "") + base_unit = self.model_outputs[base_name].unit + unit = self._get_gradient_units(base_unit, gradient_name) + else: + unit = self.model_outputs[output].unit + return unit + + def _get_gradient_units(self, base_unit: str, gradient_name: str) -> str: + # Get the gradient units based on the unit of the base quantity + # for example, if the base unit is "<unit>" and the gradient name is + # "positions", the gradient unit will be "<unit>/<length_unit>". + return get_gradient_units(base_unit, gradient_name, self.length_unit)
+ + + +def _get_digits(value: float) -> Tuple[int, int]: + """ + Finds the number of digits to print before and after the decimal point, + based on the order of magnitude of the value. + + 5 "significant" digits are guaranteed to be printed. + + :param value: The value for which the number of digits is calculated. + """ + + # Get order of magnitude of the value: + order = int(np.floor(np.log10(value))) + + # Get the number of digits before the decimal point: + if order < 0: + digits_before = 1 + else: + digits_before = order + 1 + + # Get the number of digits after the decimal point: + if order < 0: + digits_after = 4 - order + else: + digits_after = max(1, 4 - order) + + total_characters = digits_before + digits_after + 1 # +1 for the point + + return total_characters, digits_after + + +
+[docs] +@contextlib.contextmanager +def setup_logging( + log_obj: logging.Logger, + log_file: Optional[Union[str, Path]] = None, + level: int = logging.WARNING, +): + """Create a logging environment for a given ``logobj``. + + Extracted and adjusted from + github.com/MDAnalysis/mdacli/blob/main/src/mdacli/logger.py + + :param log_obj: A logging instance + :param log_file: Name of the log file + :param level: Set the root logger level to the specified level. If for example set + to :py:obj:`logging.DEBUG` detailed debug logs inludcing filename and function + name are displayed. For :py:obj:`logging.INFO` only the message logged from + `errors`, `warnings` and `infos` will be displayed. + """ + try: + format = "[{asctime}][{levelname}]" + if level == logging.DEBUG: + format += ":{filename}:{funcName}:{lineno}" + format += " - {message}" + + formatter = logging.Formatter(format, datefmt="%Y-%m-%d %H:%M:%S", style="{") + handlers: List[Union[logging.StreamHandler, logging.FileHandler]] = [] + + stream_handler = logging.StreamHandler(sys.stdout) + stream_handler.setFormatter(formatter) + handlers.append(stream_handler) + + if log_file: + log_file = check_suffix(filename=log_file, suffix=".log") + file_handler = logging.FileHandler(filename=str(log_file), encoding="utf-8") + file_handler.setFormatter(formatter) + handlers.append(file_handler) + + # hide logging up to ERROR from secondary processes in distributed environments: + if not is_main_process(): + level = logging.ERROR + + logging.basicConfig(format=format, handlers=handlers, level=level, style="{") + logging.captureWarnings(True) + + if log_file: + abs_path = str(Path(log_file).absolute().resolve()) + log_obj.info(f"This log is also available at {abs_path!r}.") + else: + log_obj.debug("Logging to file is disabled.") + + for handler in handlers: + log_obj.addHandler(handler) + + yield + + finally: + for handler in handlers: + handler.flush() + handler.close() + log_obj.removeHandler(handler)
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/loss.html b/latest/_modules/metatrain/utils/loss.html new file mode 100644 index 000000000..7af045425 --- /dev/null +++ b/latest/_modules/metatrain/utils/loss.html @@ -0,0 +1,544 @@ + + + + + + + + metatrain.utils.loss - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.loss

+from typing import Dict, Optional, Tuple
+
+import torch
+from metatensor.torch import TensorMap
+
+
+# This file defines losses for metatensor models.
+
+
+
+[docs] +class TensorMapLoss: + """A loss function that operates on two ``metatensor.torch.TensorMap``. + + The loss is computed as the sum of the loss on the block values and + the loss on the gradients, with weights specified at initialization. + + At the moment, this loss function assumes that all the gradients + declared at initialization are present in both TensorMaps. + + :param reduction: The reduction to apply to the loss. + See :py:class:`torch.nn.MSELoss`. + :param weight: The weight to apply to the loss on the block values. + :param gradient_weights: The weights to apply to the loss on the gradients. + + :returns: The loss as a zero-dimensional :py:class:`torch.Tensor` + (with one entry). + """ + + def __init__( + self, + reduction: str = "sum", + weight: float = 1.0, + gradient_weights: Optional[Dict[str, float]] = None, + ): + self.loss = torch.nn.MSELoss(reduction=reduction) + self.weight = weight + self.gradient_weights = {} if gradient_weights is None else gradient_weights + + def __call__( + self, tensor_map_1: TensorMap, tensor_map_2: TensorMap + ) -> Tuple[torch.Tensor, Dict[str, Tuple[float, int]]]: + # Check that the two have the same metadata, except for the samples, + # which can be different due to batching, but must have the same size: + if tensor_map_1.keys != tensor_map_2.keys: + raise ValueError( + "TensorMapLoss requires the two TensorMaps to have the same keys." + ) + if tensor_map_1.block().properties != tensor_map_2.block().properties: + raise ValueError( + "TensorMapLoss requires the two TensorMaps to have the same properties." + ) + if tensor_map_1.block().components != tensor_map_2.block().components: + raise ValueError( + "TensorMapLoss requires the two TensorMaps to have the same components." + ) + if len(tensor_map_1.block().samples) != len(tensor_map_2.block().samples): + raise ValueError( + "TensorMapLoss requires the two TensorMaps " + "to have the same number of samples." + ) + for gradient_name in self.gradient_weights.keys(): + if len(tensor_map_1.block().gradient(gradient_name).samples) != len( + tensor_map_2.block().gradient(gradient_name).samples + ): + raise ValueError( + "TensorMapLoss requires the two TensorMaps " + "to have the same number of gradient samples." + ) + if ( + tensor_map_1.block().gradient(gradient_name).properties + != tensor_map_2.block().gradient(gradient_name).properties + ): + raise ValueError( + "TensorMapLoss requires the two TensorMaps " + "to have the same gradient properties." + ) + if ( + tensor_map_1.block().gradient(gradient_name).components + != tensor_map_2.block().gradient(gradient_name).components + ): + raise ValueError( + "TensorMapLoss requires the two TensorMaps " + "to have the same gradient components." + ) + + # If the two TensorMaps have different symmetry keys: + if len(tensor_map_1) != 1: + raise NotImplementedError( + "TensorMapLoss does not yet support multiple symmetry keys." + ) + + # Compute the loss: + loss = torch.zeros( + (), + dtype=tensor_map_1.block().values.dtype, + device=tensor_map_1.block().values.device, + ) + + values_1 = tensor_map_1.block().values + values_2 = tensor_map_2.block().values + loss += self.weight * self.loss(values_1, values_2) + + for gradient_name, gradient_weight in self.gradient_weights.items(): + values_1 = tensor_map_1.block().gradient(gradient_name).values + values_2 = tensor_map_2.block().gradient(gradient_name).values + loss += gradient_weight * self.loss(values_1, values_2) + + return loss
+ + + +
+[docs] +class TensorMapDictLoss: + """A loss function that operates on two ``Dict[str, metatensor.torch.TensorMap]``. + + At initialization, the user specifies a list of keys to use for the loss, + along with a weight for each key. + + The loss is then computed as a weighted sum. Any keys that are not present + in the dictionaries are ignored. + + :param weights: A dictionary mapping keys to weights. This might contain + gradient keys, in the form ``<output_name>_<gradient_name>_gradients``. + :param reduction: The reduction to apply to the loss. + See :py:class:`torch.nn.MSELoss`. + + :returns: The loss as a zero-dimensional :py:class:`torch.Tensor` + (with one entry). + """ + + def __init__( + self, + weights: Dict[str, float], + reduction: str = "sum", + ): + outputs = [key for key in weights.keys() if "gradients" not in key] + self.losses = {} + for output in outputs: + value_weight = weights[output] + gradient_weights = {} + for key, weight in weights.items(): + if key.startswith(output) and key.endswith("_gradients"): + gradient_name = key.replace(f"{output}_", "").replace( + "_gradients", "" + ) + gradient_weights[gradient_name] = weight + self.losses[output] = TensorMapLoss( + reduction=reduction, + weight=value_weight, + gradient_weights=gradient_weights, + ) + + def __call__( + self, + tensor_map_dict_1: Dict[str, TensorMap], + tensor_map_dict_2: Dict[str, TensorMap], + ) -> torch.Tensor: + # Assert that the two have the keys: + assert set(tensor_map_dict_1.keys()) == set(tensor_map_dict_2.keys()) + + # Initialize the loss: + first_values = next(iter(tensor_map_dict_1.values())).block(0).values + loss = torch.zeros((), dtype=first_values.dtype, device=first_values.device) + + # Compute the loss: + for target in tensor_map_dict_1.keys(): + target_loss = self.losses[target]( + tensor_map_dict_1[target], tensor_map_dict_2[target] + ) + loss += target_loss + + return loss
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/metrics.html b/latest/_modules/metatrain/utils/metrics.html new file mode 100644 index 000000000..1a6692f20 --- /dev/null +++ b/latest/_modules/metatrain/utils/metrics.html @@ -0,0 +1,465 @@ + + + + + + + + metatrain.utils.metrics - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.metrics

+from typing import Dict, List, Tuple
+
+import torch.distributed
+from metatensor.torch import TensorMap
+
+
+
+[docs] +class RMSEAccumulator: + """Accumulates the RMSE between predictions and targets for an arbitrary + number of keys, each corresponding to one target.""" + + def __init__(self): + """Initialize the accumulator.""" + self.information: Dict[str, Tuple[float, int]] = {} + +
+[docs] + def update(self, predictions: Dict[str, TensorMap], targets: Dict[str, TensorMap]): + """Updates the accumulator with new predictions and targets. + + :param predictions: A dictionary of predictions, where the keys correspond + to the keys in the targets dictionary, and the values are the predictions. + + :param targets: A dictionary of targets, where the keys correspond to the keys + in the predictions dictionary, and the values are the targets. + """ + + for key, target in targets.items(): + if key not in self.information: + self.information[key] = (0.0, 0) + prediction = predictions[key] + + self.information[key] = ( + self.information[key][0] + + ((prediction.block().values - target.block().values) ** 2) + .sum() + .item(), + self.information[key][1] + prediction.block().values.numel(), + ) + + for gradient_name, target_gradient in target.block().gradients(): + if f"{key}_{gradient_name}_gradients" not in self.information: + self.information[f"{key}_{gradient_name}_gradients"] = (0.0, 0) + prediction_gradient = prediction.block().gradient(gradient_name) + self.information[f"{key}_{gradient_name}_gradients"] = ( + self.information[f"{key}_{gradient_name}_gradients"][0] + + ((prediction_gradient.values - target_gradient.values) ** 2) + .sum() + .item(), + self.information[f"{key}_{gradient_name}_gradients"][1] + + prediction_gradient.values.numel(), + )
+ + +
+[docs] + def finalize( + self, + not_per_atom: List[str], + is_distributed: bool = False, + device: torch.device = None, + ) -> Dict[str, float]: + """Finalizes the accumulator and return the RMSE for each key. + + All keys will be returned as "{key} RMSE (per atom)" in the output dictionary, + unless ``key`` contains one or more of the strings in ``not_per_atom``, + in which case "{key} RMSE" will be returned. + + :param not_per_atom: a list of strings. If any of these strings are present in + a key, the RMSE key will not be labeled as "(per atom)". + :param is_distributed: if true, the RMSE will be computed across all ranks + of the distributed system. + :param device: the local device to use for the computation. Only needed if + ``is_distributed`` is :obj:`python:True`. + """ + + if is_distributed: + for key, value in self.information.items(): + sse = torch.tensor(value[0]).to(device) + n_elems = torch.tensor(value[1]).to(device) + torch.distributed.all_reduce(sse) + torch.distributed.all_reduce(n_elems) + self.information[key] = (sse.item(), n_elems.item()) # type: ignore + + finalized_info = {} + for key, value in self.information.items(): + if any([s in key for s in not_per_atom]): + out_key = f"{key} RMSE" + else: + out_key = f"{key} RMSE (per atom)" + finalized_info[out_key] = (value[0] / value[1]) ** 0.5 + + return finalized_info
+
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/neighbor_lists.html b/latest/_modules/metatrain/utils/neighbor_lists.html new file mode 100644 index 000000000..8fdadd174 --- /dev/null +++ b/latest/_modules/metatrain/utils/neighbor_lists.html @@ -0,0 +1,517 @@ + + + + + + + + metatrain.utils.neighbor_lists - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.neighbor_lists

+import random
+from typing import List
+
+import ase.neighborlist
+import numpy as np
+import torch
+import vesin
+from metatensor.torch import Labels, TensorBlock
+from metatensor.torch.atomistic import (
+    NeighborListOptions,
+    System,
+    register_autograd_neighbors,
+)
+
+from .data.system_to_ase import system_to_ase
+
+
+
+[docs] +def get_system_with_neighbor_lists( + system: System, neighbor_lists: List[NeighborListOptions] +) -> System: + """Attaches neighbor lists to a `System` object. + + :param system: The system for which to calculate neighbor lists. + :param neighbor_lists: A list of `NeighborListOptions` objects, + each of which specifies the parameters for a neighbor list. + + :return: The `System` object with the neighbor lists added. + """ + # Convert the system to an ASE atoms object + atoms = system_to_ase(system) + + # Compute the neighbor lists + for options in neighbor_lists: + if options not in system.known_neighbor_lists(): + neighbor_list = _compute_single_neighbor_list(atoms, options).to( + device=system.device, dtype=system.dtype + ) + register_autograd_neighbors(system, neighbor_list) + system.add_neighbor_list(options, neighbor_list) + + return system
+ + + +def _compute_single_neighbor_list( + atoms: ase.Atoms, options: NeighborListOptions +) -> TensorBlock: + # Computes a single neighbor list for an ASE atoms object + # (as in metatensor.torch.atomistic) + + if np.all(atoms.pbc) or np.all(~atoms.pbc): + nl_i, nl_j, nl_S, nl_D = vesin.ase_neighbor_list( + "ijSD", + atoms, + cutoff=options.cutoff, + ) + else: + # this is not implemented in vesin, so we use ASE + nl_i, nl_j, nl_S, nl_D = ase.neighborlist.neighbor_list( + "ijSD", + atoms, + cutoff=options.cutoff, + ) + + # Check the vesin NL against the ASE NL (5% of the time) + if random.random() < 0.05: + nl_i_ase, nl_j_ase, nl_S_ase, nl_D_ase = ase.neighborlist.neighbor_list( + "ijSD", + atoms, + cutoff=options.cutoff, + ) + assert len(nl_i) == len(nl_i_ase) + assert len(nl_j) == len(nl_j_ase) + assert len(nl_S) == len(nl_S_ase) + assert len(nl_D) == len(nl_D_ase) + nl_ijS = np.concatenate( + (nl_i.reshape(-1, 1), nl_j.reshape(-1, 1), nl_S), axis=1 + ) + nl_ijS_ase = np.concatenate( + (nl_i_ase.reshape(-1, 1), nl_j_ase.reshape(-1, 1), nl_S_ase), axis=1 + ) + sort_indices = np.lexsort(nl_ijS.T) + sort_indices_ase = np.lexsort(nl_ijS_ase.T) + assert np.array_equal(nl_ijS[sort_indices], nl_ijS_ase[sort_indices_ase]) + assert np.allclose(nl_D[sort_indices], nl_D_ase[sort_indices_ase]) + + selected = [] + for pair_i, (i, j, S) in enumerate(zip(nl_i, nl_j, nl_S)): + # we want a half neighbor list, so drop all duplicated neighbors + if j < i: + continue + elif i == j: + if S[0] == 0 and S[1] == 0 and S[2] == 0: + # only create pairs with the same atom twice if the pair spans more + # than one unit cell + continue + elif S[0] + S[1] + S[2] < 0 or ( + (S[0] + S[1] + S[2] == 0) and (S[2] < 0 or (S[2] == 0 and S[1] < 0)) + ): + # When creating pairs between an atom and one of its periodic + # images, the code generate multiple redundant pairs (e.g. with + # shifts 0 1 1 and 0 -1 -1); and we want to only keep one of these. + # We keep the pair in the positive half plane of shifts. + continue + + selected.append(pair_i) + + selected = np.array(selected, dtype=np.int32) + n_pairs = len(selected) + + if options.full_list: + distances = np.empty((2 * n_pairs, 3), dtype=np.float64) + samples = np.empty((2 * n_pairs, 5), dtype=np.int32) + else: + distances = np.empty((n_pairs, 3), dtype=np.float64) + samples = np.empty((n_pairs, 5), dtype=np.int32) + + samples[:n_pairs, 0] = nl_i[selected] + samples[:n_pairs, 1] = nl_j[selected] + samples[:n_pairs, 2:] = nl_S[selected] + + distances[:n_pairs] = nl_D[selected] + + if options.full_list: + samples[n_pairs:, 0] = nl_j[selected] + samples[n_pairs:, 1] = nl_i[selected] + samples[n_pairs:, 2:] = -nl_S[selected] + + distances[n_pairs:] = -nl_D[selected] + + distances = torch.from_numpy(distances) + return TensorBlock( + values=distances.reshape(-1, 3, 1), + samples=Labels( + names=[ + "first_atom", + "second_atom", + "cell_shift_a", + "cell_shift_b", + "cell_shift_c", + ], + values=torch.from_numpy(samples), + ), + components=[Labels.range("xyz", 3)], + properties=Labels.range("distance", 1), + ) +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/omegaconf.html b/latest/_modules/metatrain/utils/omegaconf.html new file mode 100644 index 000000000..ef86177d5 --- /dev/null +++ b/latest/_modules/metatrain/utils/omegaconf.html @@ -0,0 +1,737 @@ + + + + + + + + metatrain.utils.omegaconf - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.omegaconf

+import importlib
+from pathlib import Path
+from typing import Any, Union
+
+import torch
+from omegaconf import Container, DictConfig, ListConfig, OmegaConf
+from omegaconf.basecontainer import BaseContainer
+
+from .. import RANDOM_SEED
+from .devices import pick_devices
+
+
+
+[docs] +def file_format(_parent_: Container) -> str: + """Custom OmegaConf resolver to find the file format. + + File format is obtained based on the suffix of the ``read_from`` field in the same + section.""" + return Path(_parent_["read_from"]).suffix
+ + + +def _get_architecture_model(conf: BaseContainer) -> Any: + architecture_name = conf["architecture"]["name"] + architecture = importlib.import_module(f"metatrain.{architecture_name}") + return architecture.__model__ + + +
+[docs] +def default_device(_root_: BaseContainer) -> str: + """Custom OmegaConf resolver to find the default device of an architecture. + + Device is found using the :py:func:metatrain.utils.devices.pick_devices` + function.""" + + Model = _get_architecture_model(_root_) + desired_device = pick_devices(Model.__supported_devices__) + + if len(desired_device) > 1: + return "multi-cuda" + else: + return desired_device[0].type
+ + + +
+[docs] +def default_precision(_root_: BaseContainer) -> int: + """Custom OmegaConf resolver to find the default precision of an architecture. + + File format is obtained based on the architecture name and its first entry in the + ``supported_dtypes`` list.""" + + Model = _get_architecture_model(_root_) + + # desired `dtype` is the first entry + default_dtype = Model.__supported_dtypes__[0] + + # `base_precision` in options has to be a integer and not a torch.dtype + if default_dtype in [torch.float64, torch.double]: + return 64 + elif default_dtype == torch.float32: + return 32 + elif default_dtype == torch.float16: + return 16 + else: + raise ValueError( + f"architectures `default_dtype` ({default_dtype}) refers to an unknown " + "torch dtype. This should not happen." + )
+ + + +
+[docs] +def default_random_seed() -> int: + """Return session seed in the range [0, 2**32).""" + return RANDOM_SEED
+ + + +# Register custom resolvers +OmegaConf.register_new_resolver("file_format", file_format) +OmegaConf.register_new_resolver("default_device", default_device) +OmegaConf.register_new_resolver("default_precision", default_precision) +OmegaConf.register_new_resolver("default_random_seed", default_random_seed) + + +def _resolve_single_str(config: str) -> DictConfig: + return OmegaConf.create({"read_from": config}) + + +# BASE CONFIGURATIONS +BASE_OPTIONS = OmegaConf.create( + { + "device": "${default_device:}", + "base_precision": "${default_precision:}", + "seed": "${default_random_seed:}", + } +) + + +CONF_SYSTEMS = OmegaConf.create( + { + "read_from": "${..read_from}", + "file_format": "${file_format:}", + "length_unit": None, + } +) + +CONF_TARGET_FIELDS = OmegaConf.create( + { + "quantity": "energy", + "read_from": "${...systems.read_from}", + "file_format": "${file_format:}", + "key": None, + "unit": None, + } +) + +CONF_GRADIENTS = OmegaConf.create({"forces": False, "stress": False, "virial": False}) +CONF_GRADIENT = OmegaConf.create( + { + "read_from": "${..read_from}", + "file_format": "${file_format:}", + "key": None, + } +) + +KNWON_GRADIENTS = list(CONF_GRADIENTS.keys()) + +# merge configs to get default configs for energies and other targets +CONF_TARGET = OmegaConf.merge(CONF_TARGET_FIELDS, CONF_GRADIENTS) +CONF_ENERGY = CONF_TARGET.copy() +CONF_ENERGY["forces"] = CONF_GRADIENT.copy() +CONF_ENERGY["stress"] = CONF_GRADIENT.copy() + + +
+[docs] +def expand_dataset_config(conf: Union[str, DictConfig, ListConfig]) -> ListConfig: + """Expands shorthand notations in a dataset configuration to its full format. + + This function takes a dataset configuration, either as a :py:class:str, + :py:class:`omegaconf.DictConfig` or a :py:class:`omegaconf.ListConfig`, and expands + it into a detailed configuration format. It processes systems, targets, and gradient + sections, setting default values and inferring missing information. Unknown keys are + ignored, allowing for flexibility. + + If the dataset configuration is either a :class:`str` or a + :class:`omegaconf.DictConfig` + + The function performs the following steps for each config + + - Merges and interpolates the input configuration with the base configurations. + - Expands shorthand notations like file paths or simple true/false settings to full + dictionary systems. This includes setting the units to the base units of + ``"angstrom"`` and ``"eV"``. + - Handles special cases, such as the mandatory nature of the "energy" section for MD + simulations and the mutual exclusivity of 'stress' and 'virial' sections. + Additionally the gradient sections for "forces" are enables by default. + + :param conf: The dataset configuration, either as a file path string or a DictConfig + object. + :raises ValueError: If both ``virial`` and ``stress`` sections are enabled in the + "energy" target, as this is not permissible for training. + :returns: List of datasets configurations. If ``conf`` was a :class:`str` or a + :class:`omegaconf.DictConfig` the list contains only a single element. + """ + # Expand str -> DictConfig + if isinstance(conf, str): + read_from = conf + conf = OmegaConf.create( + {"systems": read_from, "targets": {"energy": read_from}} + ) + + # Expand DictConfig -> ListConfig + if isinstance(conf, DictConfig): + conf = OmegaConf.create([conf]) + + # Perform expansion per config inside the ListConfig + for conf_element in conf: + if hasattr(conf_element, "systems"): + if type(conf_element["systems"]) is str: + conf_element["systems"] = _resolve_single_str(conf_element["systems"]) + + conf_element["systems"] = OmegaConf.merge( + CONF_SYSTEMS, conf_element["systems"] + ) + + if hasattr(conf_element, "targets"): + for target_key, target in conf_element["targets"].items(): + if type(target) is str: + target = _resolve_single_str(target) + + # for special case "energy" we enable sections for `forces` and `stress` + # gradients by default + if target_key == "energy": + target = OmegaConf.merge(CONF_ENERGY, target) + else: + target = OmegaConf.merge(CONF_TARGET, target) + + if target["key"] is None: + target["key"] = target_key + + # update DictConfig to allow for config node interpolation + conf_element["targets"][target_key] = target + + # merge and interpolate possibly present gradients with default gradient + # config + for gradient_key, gradient_conf in conf_element["targets"][ + target_key + ].items(): + if gradient_key in KNWON_GRADIENTS: + if gradient_conf is True: + gradient_conf = CONF_GRADIENT.copy() + elif type(gradient_conf) is str: + gradient_conf = _resolve_single_str(gradient_conf) + + if isinstance(gradient_conf, DictConfig): + gradient_conf = OmegaConf.merge( + CONF_GRADIENT, gradient_conf + ) + + if gradient_conf["key"] is None: + gradient_conf["key"] = gradient_key + + conf_element["targets"][target_key][ + gradient_key + ] = gradient_conf + + # If user sets the virial gradient and leaves the stress gradient + # untouched, we disable the by default enabled stress gradient section. + base_stress_gradient_conf = CONF_GRADIENT.copy() + base_stress_gradient_conf["key"] = "stress" + + if ( + target_key == "energy" + and conf_element["targets"][target_key]["virial"] + and conf_element["targets"][target_key]["stress"] + == base_stress_gradient_conf + ): + conf_element["targets"][target_key]["stress"] = False + + if ( + conf_element["targets"][target_key]["stress"] + and conf_element["targets"][target_key]["virial"] + ): + raise ValueError( + f"Cannot perform training with respect to virials and stress " + f"as in section {target_key}. Set either `virials: off` or " + "`stress: off`." + ) + + return conf
+ + + +
+[docs] +def check_units( + actual_options: Union[DictConfig, ListConfig], + desired_options: Union[DictConfig, ListConfig], +) -> None: + """Perform consistency checks between two dataset configs. + + :param actual_options: The dataset options that you want to test. + :param desired_options: The dataset options ``actual_options`` is tested against. + + :raises ValueError: If the length units are not consistent between + the system in the dataset options. + :raises ValueError: If a target is present only in desider_option and + not in actual_option. + :raises ValueError: If the unit of a target quantity is not consistent between + the dataset option. + """ + if type(actual_options) is DictConfig: + actual_options = OmegaConf.create([actual_options]) + if type(desired_options) is DictConfig: + desired_options = OmegaConf.create([desired_options]) + + if len(actual_options) != len(desired_options): + raise ValueError( + f"Length of actual_options ({len(actual_options)}) and desired_options " + f"({len(desired_options)}) is different!" + ) + + for actual_options_element, desired_options_element in zip( + actual_options, + desired_options, + ): + actual_length_unit = actual_options_element["systems"]["length_unit"] + desired_length_unit = desired_options_element["systems"]["length_unit"] + + if actual_length_unit != desired_length_unit: + raise ValueError( + "`length_unit`s are inconsistent between one of the dataset options. " + f"{actual_length_unit!r} != {desired_length_unit!r}." + ) + + for target in actual_options_element["targets"]: + actual_unit = actual_options_element["targets"][target]["unit"] + if target in desired_options_element["targets"]: + desired_unit = desired_options_element["targets"][target]["unit"] + if actual_unit != desired_unit: + raise ValueError( + f"Units of target {target!r} are inconsistent between one of " + f"the dataset options. {actual_unit!r} != {desired_unit!r}." + ) + else: + raise ValueError( + f"Target {target!r} is not present in one of the given dataset " + "options." + )
+ + + +
+[docs] +def check_options_list(dataset_config: ListConfig) -> None: + """Perform consistency checks within one dataset config. + + This is useful if the dataset config is made of several datasets. + + - The function checks if ``length_units`` in each system section are known and the + same. + - For unknown quantities a warning is given. + - If the names of the ``"targets"`` sections are the same between the elements of + the list of datasets also the units must be the same. + + :param dataset_config: A List of configuration to be checked. In the list contains + only one element no checks are performed. + :raises ValueError: If for a known quantity the units are not known. + """ + desired_config = dataset_config[0] + # save unit for each target seaction for later comparison + unit_dict = {k: v["unit"] for k, v in desired_config["targets"].items()} + + desired_length_unit = desired_config["systems"]["length_unit"] + + # loop over ALL configs because we have check units for all elements in + # `dataset_config` + for actual_config in dataset_config: + # Perform consistency checks between config elements + actual_length_unit = actual_config["systems"]["length_unit"] + if actual_length_unit != desired_length_unit: + raise ValueError( + "`length_unit`s are inconsistent between one of the dataset options." + f" {actual_length_unit!r} != {desired_length_unit!r}." + ) + + for target_key, target in actual_config["targets"].items(): + unit = target["unit"] + + # If a target section name is not part of the saved units we add it for + # later comparison. We do not have to start the loop again because this + # target section name is not present in one of the datasets checked before. + if target_key not in unit_dict.keys(): + unit_dict[target_key] = unit + + if unit_dict[target_key] != unit: + raise ValueError( + f"Units of target section {target_key!r} are inconsistent. Found " + f"{unit!r} and {unit_dict[target_key]!r}!" + )
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/output_gradient.html b/latest/_modules/metatrain/utils/output_gradient.html new file mode 100644 index 000000000..7d32f9caa --- /dev/null +++ b/latest/_modules/metatrain/utils/output_gradient.html @@ -0,0 +1,403 @@ + + + + + + + + metatrain.utils.output_gradient - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.output_gradient

+from typing import List, Optional
+
+import torch
+
+
+
+[docs] +def compute_gradient( + target: torch.Tensor, inputs: List[torch.Tensor], is_training: bool +) -> List[torch.Tensor]: + """ + Calculates the gradient of a target tensor with respect to a list of input tensors. + + ``target`` must be a single torch.Tensor object. If target contains multiple values, + the gradient will be calculated with respect to the sum of all values. + """ + + grad_outputs: Optional[List[Optional[torch.Tensor]]] = [torch.ones_like(target)] + gradient = torch.autograd.grad( + outputs=[target], + inputs=inputs, + grad_outputs=grad_outputs, + retain_graph=is_training, + create_graph=is_training, + ) + if gradient is None: + raise ValueError( + "Unexpected None value for computed gradient. " + "One or more operations inside the model might " + "not have a gradient implementation." + ) + else: + return gradient
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/per_atom.html b/latest/_modules/metatrain/utils/per_atom.html new file mode 100644 index 000000000..ed6db8bc6 --- /dev/null +++ b/latest/_modules/metatrain/utils/per_atom.html @@ -0,0 +1,465 @@ + + + + + + + + metatrain.utils.per_atom - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.per_atom

+from typing import Dict, List
+
+import torch
+from metatensor.torch import TensorBlock, TensorMap
+from metatensor.torch.atomistic import System
+
+
+
+[docs] +def average_by_num_atoms( + tensor_map_dict: Dict[str, TensorMap], + systems: List[System], + per_structure_keys: List[str], +): + """ + Averages a dictionary of ``TensorMap`` objects by the number of + atoms in each system. + + This function averages by the number of atoms in each system. Targets that + are present in ``per_structure_keys`` will not be averaged. + + :param tensor_map_dict: A dictionary of ``TensorMap`` objects. + :param systems: The systems used to compute the predictions. + :param per_structure_keys: A list of keys whose corresponding + ``TensorMap`` objects that should not be averaged. + + :return: The dictionary of averaged ``TensorMap`` objects. + """ + averaged_tensor_map_dict = {} + device = systems[0].device + num_atoms = torch.tensor([len(s) for s in systems], device=device) + for key in tensor_map_dict.keys(): + if key in per_structure_keys: + averaged_tensor_map_dict[key] = tensor_map_dict[key] + else: + averaged_tensor_map_dict[key] = divide_by_num_atoms( + tensor_map_dict[key], num_atoms + ) + return averaged_tensor_map_dict
+ + + +
+[docs] +def divide_by_num_atoms(tensor_map: TensorMap, num_atoms: torch.Tensor) -> TensorMap: + """Takes the average values per atom of a ``TensorMap``. + + Since some quantities might already be per atom (e.g., atomic energies + or position gradients), this function only divides a block (or gradient + block) by the number of atoms if the block's samples do not contain + the "atom" key. In practice, this guarantees the desired behavior for + the majority of the cases, including energies, forces, and virials, where + the energies and virials should be divided by the number of atoms, while + the forces should not. + + :param tensor_map: The input tensor map. + :param num_atoms: The number of atoms in each system. + + :return: A new tensor map with the values divided by the number of atoms. + """ + + blocks = [] + for block in tensor_map.blocks(): + if "atom" in block.samples.names: + new_block = block + else: + values = block.values / num_atoms.view( + -1, *[1] * (len(block.values.shape) - 1) + ) + new_block = TensorBlock( + values=values, + samples=block.samples, + components=block.components, + properties=block.properties, + ) + for gradient_name, gradient in block.gradients(): + if "atom" in gradient.samples.names: + new_gradient = gradient + else: + values = gradient.values / num_atoms.view( + -1, *[1] * (len(gradient.values.shape) - 1) + ) + new_gradient = TensorBlock( + values=values, + samples=gradient.samples, + components=gradient.components, + properties=gradient.properties, + ) + new_block.add_gradient(gradient_name, new_gradient) + blocks.append(new_block) + + return TensorMap( + keys=tensor_map.keys, + blocks=blocks, + )
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_modules/metatrain/utils/units.html b/latest/_modules/metatrain/utils/units.html new file mode 100644 index 000000000..e1e8e8a88 --- /dev/null +++ b/latest/_modules/metatrain/utils/units.html @@ -0,0 +1,422 @@ + + + + + + + + metatrain.utils.units - metatrain 2023.11.29 documentation + + + + + + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for metatrain.utils.units

+from typing import Tuple
+
+
+
+[docs] +def get_gradient_units(base_unit: str, gradient_name: str, length_unit: str) -> str: + """ + Get the gradient units based on the unit of the base quantity. + + For example, if the base unit is "<unit>" and the gradient name is + "positions", the gradient unit will be "<unit>/<length_unit>". + + :param base_unit: The unit of the base quantity. + :param gradient_name: The name of the gradient. + :param length_unit: The unit of lengths. + + :return: The unit of the gradient. + """ + if base_unit == "": + return "" # unknown unit for base quantity -> unknown unit for gradient + if length_unit == "angstrom": + length_unit = "Å" # prettier + if gradient_name == "positions": + return base_unit + "/" + length_unit + elif gradient_name == "strain": + return base_unit # strain is dimensionless + else: + raise ValueError(f"Unknown gradient name: {gradient_name}")
+ + + +
+[docs] +def ev_to_mev(value: float, unit: str) -> Tuple[float, str]: + """ + If the `unit` starts with eV, converts the `value` and its + corresponding `unit` to meV. Otherwise, returns the input. + + :param value: The value (potentially in eV or a derived quantity of eV). + :param unit: The unit of the value. + + :return: If the `value` is in meV (or a derived quantity), the value and + the corresponding unit where eV is converted to meV. Otherwise, the input. + """ + if unit.startswith("eV") or unit.startswith("ev"): + return value * 1000.0, ( + unit.replace("eV", "meV") + if unit.startswith("eV") + else unit.replace("ev", "mev") + ) + else: + return value, unit
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/latest/_sources/advanced-concepts/auxiliary-outputs.rst.txt b/latest/_sources/advanced-concepts/auxiliary-outputs.rst.txt new file mode 100644 index 000000000..ad8d24a02 --- /dev/null +++ b/latest/_sources/advanced-concepts/auxiliary-outputs.rst.txt @@ -0,0 +1,65 @@ +Auxiliary outputs +================= + +These outputs, which are idenfified by the ``mtt::aux::`` prefix, +represent additional information that the model may provide. They are not +conventional trainable outputs, and they often correspond to internal +information that the model is capable of providing, such as its internal +representation. + +The following auxiliary outputs that are currently supported +by one or more architectures in the library: + +- ``mtt::aux::last_layer_features``: The internal representation + of the model at the last layer, before the final linear transformation. + +The following table shows the architectures that support each of the +auxiliary outputs: + ++------------------------------------------+-----------+------------------+-----+ +| Auxiliary output | SOAP-BPNN | Alchemical Model | PET | ++------------------------------------------+-----------+------------------+-----+ +| ``mtt::aux::last_layer_features`` | Yes | No | No | ++------------------------------------------+-----------+------------------+-----+ + +The following tables show the metadata that is expected for each of the +auxiliary outputs: + +mtt::aux::last_layer_features +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. list-table:: Metadata for last-layer features + :widths: 2 3 7 + :header-rows: 1 + + * - Metadata + - Names + - Description + + * - keys + - ``"_"`` if invariant or non-symmetrized, ``["o3_lambda", "o3_sigma"]`` if + equivariant + - if invariant or non-symmetrized, a single dimension named ``"_"``, with a + single entry set to ``0``, or, if equivariant, two dimensions named + ``"o3_lambda"`` and ``"o3_sigma"`` with the corresponding O3 equivariant + indices. + + * - samples + - ``["system", "atom"]`` or ``["system"]`` + - if a ``per_atom`` output is requested, the sample names will be + ``["system", "atom"]``, otherwise they will be ``["system"]``. + + ``"system"`` ranges from 0 to the number of systems given as input to + the model. ``"atom"`` ranges between 0 and the number of + atoms/particles in the corresponding system. + + * - components + - No components if invariant or non-symmetrized, ``["o3_mu"]`` if equivariant + - Nothing if invariant or non-symmetrized, the O3 equivariant ``mu`` number if + equivariant. + + * - properties + - ``"properties"`` + - the last-layer features have a single property dimension named + ``"property"``, with entries ranging from 0 to the number of features + in the last layer. diff --git a/latest/_sources/advanced-concepts/index.rst.txt b/latest/_sources/advanced-concepts/index.rst.txt new file mode 100644 index 000000000..a138e6c31 --- /dev/null +++ b/latest/_sources/advanced-concepts/index.rst.txt @@ -0,0 +1,13 @@ +Advanced concepts +================= + +This section covers advanced concepts of the ``metatrain`` library, +such as output naming, auxiliary outputs, and wrapper models. + + +.. toctree:: + :maxdepth: 1 + + output-naming + auxiliary-outputs + multi-gpu diff --git a/latest/_sources/advanced-concepts/multi-gpu.rst.txt b/latest/_sources/advanced-concepts/multi-gpu.rst.txt new file mode 100644 index 000000000..2703deb49 --- /dev/null +++ b/latest/_sources/advanced-concepts/multi-gpu.rst.txt @@ -0,0 +1,27 @@ +Multi-GPU training +================== + +Some of the architectures in metatensor-models support multi-GPU training. +In multi-GPU training, every batch of samples is split into smaller +mini-batches and the computation is run for each of the smaller mini-batches +in parallel on different GPUs. The different gradients obtained on each +device are then summed. This approach allows the user to reduce the time +it takes to train models. + +Here is a list of architectures supporting multi-GPU training: + + +SOAP-BPNN +--------- + +SOAP-BPNN supports distributed multi-GPU training on SLURM environments. +The options file to run distributed training with the SOAP-BPNN model looks +like this: + +.. literalinclude:: ../../../examples/multi-gpu/soap-bpnn/options-distributed.yaml + :language: yaml + +and the slurm submission script would look like this: + +.. literalinclude:: ../../../examples/multi-gpu/soap-bpnn/submit-distributed.sh + :language: shell diff --git a/latest/_sources/advanced-concepts/output-naming.rst.txt b/latest/_sources/advanced-concepts/output-naming.rst.txt new file mode 100644 index 000000000..29bb131cd --- /dev/null +++ b/latest/_sources/advanced-concepts/output-naming.rst.txt @@ -0,0 +1,15 @@ +Output naming +============= + +The name and format of the outputs in ``metatrain`` are based on +those of the ``_ +package. An immediate example is given by the ``energy`` output. + +Any additional outputs present within the library are denoted by the +``mtt::`` prefix. For example, some models can output their last-layer +features, which are named as ``mtt::aux::last_layer_features``, where +``aux`` denotes an auxiliary output. + +Outputs that are specific to a particular model should be named as +``mtt::::``. diff --git a/latest/_sources/architectures/alchemical-model.rst.txt b/latest/_sources/architectures/alchemical-model.rst.txt new file mode 100644 index 000000000..8576db608 --- /dev/null +++ b/latest/_sources/architectures/alchemical-model.rst.txt @@ -0,0 +1,133 @@ +.. _architecture-alchemical-model: + +Alchemical Model +================ + +.. warning:: + + This is an **experimental model**. You should not use it for anything important. + +This is an implementation of Alchemical Model: a Behler-Parrinello neural network +:footcite:p:`behler_generalized_2007` with Smooth overlab of atomic positions (SOAP) +features :footcite:p:`bartok_representing_2013` and Alchemical Compression of the +composition space :footcite:p:`willatt_feature_2018, lopanitsyna_modeling_2023, +mazitov_surface_2024`. This model is extremely useful for simulating systems with +large amount of chemical elements. + + +Installation +------------ +To install the package, you can run the following command in the root +directory of the repository: + +.. code-block:: bash + + pip install .[alchemical-model] + +This will install the package with the Alchemical Model dependencies. + + +Default Hyperparameters +----------------------- +The default hyperparameters for the Alchemical Model model are: + +.. literalinclude:: ../../../src/metatrain/experimental/alchemical_model/default-hypers.yaml + :language: yaml + + +Tuning Hyperparameters +---------------------- +The default hyperparameters above will work well in most cases, but they +may not be optimal for your specific dataset. In general, the most important +hyperparameters to tune are (in decreasing order of importance): + +- ``cutoff``: This should be set to a value after which most of the + interactions between atoms is expected to be negligible. +- ``num_pseudo_species``: This number determines the number of pseudo species + to use in the Alchemical Compression of the composition space. This value should + be adjusted based on the prior knowledge of the size of original chemical space + size. +- ``learning_rate``: The learning rate for the neural network. This hyperparameter + controls how much the weights of the network are updated at each step of the + optimization. A larger learning rate will lead to faster training, but might cause + instability and/or divergence. +- ``batch_size``: The number of samples to use in each batch of training. This + hyperparameter controls the tradeoff between training speed and memory usage. In + general, larger batch sizes will lead to faster training, but might require more + memory. +- ``hidden_sizes``: + This hyperparameter controls the size and depth of the descriptors and the neural + network. In general, increasing this might lead to better accuracy, + especially on larger datasets, at the cost of increased training and evaluation time. +- ``loss_weights``: This controls the weighting of different contributions to the loss + (e.g., energy, forces, virial, etc.). The default values work well for most datasets, + but they might need to be adjusted. For example, to set a weight of 1.0 for the energy + and 0.1 for the forces, you can set the following in the ``options.yaml`` file: + ``loss_weights: {"energy": 1.0, "forces": 0.1}``. + + +Architecture Hyperparameters +---------------------------- +:param name: ``experimental.alchemical_model`` + +model +##### +soap +^^^^ +:param num_pseudo_species: Number of pseudo species to use in the Alchemical Compression + of the composition space. +:param cutoff_radius: Spherical cutoff (Å) to use for atomic environments. +:param basis_cutoff: The maximal eigenvalue of the Laplacian Eigenstates (LE) basis + functions used as radial basis :footcite:p:`bigi_smooth_2022`. This controls how + large the radial-angular basis is. +:param radial_basis_type: A type of the LE basis functions used as radial basis. The + supported radial basis functions are + + - ``LE``: Original Laplacian Eigenstates raidal basis. These radial basis functions + can be set in the ``.yaml`` file as: + + .. code-block:: yaml + + radial_basis_type: "le" + + - ``Physical``: Physically-motivated basis functions. These radial basis functions + can be set in + + .. code-block:: yaml + + radial_basis_type: "physical" + +:param basis_scale: Scaling parameter of the radial basis functions, representing the + characteristic width (in Å) of the basis functions. +:param trainable_basis: If :py:obj:`True`, the radial basis functions will be + accompanied by the trainable multi-layer perceptron (MLP). If :py:obj:`False`, the + radial basis functions will be fixed. +:param normalize: Whether to use normalizations such as LayerNorm in the model. +:param contract_center_species: If ``True``, the Alchemcial Compression will be applied + on center species as well. If ``False``, the Alchemical Compression will be applied + only on the neighbor species. + + +bpnn +^^^^ +:param hidden_sizes: number of neurons in each hidden layer +:param output_size: number of neurons in the output layer + +training +######## +The hyperparameters for training are + +:param batch_size: batch size +:param num_epochs: number of training epochs +:param learning_rate: learning rate +:param log_interval: number of epochs that elapse between reporting new training results +:param checkpoint_interval: Interval to save a checkpoint to disk. +:param per_atom_targets: Specifies whether the model should be trained on a per-atom + loss. In that case, the logger will also output per-atom metrics for that target. In + any case, the final summary will be per-structure. + +References +---------- +.. footbibliography:: + + diff --git a/latest/_sources/architectures/gap.rst.txt b/latest/_sources/architectures/gap.rst.txt new file mode 100644 index 000000000..d8990826e --- /dev/null +++ b/latest/_sources/architectures/gap.rst.txt @@ -0,0 +1,151 @@ +.. _architecture-sparse-gap: + +GAP +=== + +This is an implementation of the sparse `Gaussian Approximation Potential +`_ (GAP) using `Smooth Overlap of Atomic Positions `_ (SOAP) +implemented in `rascaline `_. + + +.. _SOAP: https://doi.org/10.1103/PhysRevB.87.184115 +.. _GAP: https://doi.org/10.1002/qua.24927 +.. _RASCALINE: https://github.com/Luthaf/rascaline + +The GAP model in metatrain can only train on CPU, but evaluation +is also supported on GPU. + + +Installation +------------ + +To install the package, you can run the following command in the root directory +of the repository: + +.. code-block:: bash + + pip install .[gap] + +This will install the package with the GAP dependencies. + + +Default Hyperparameters +----------------------- +The default hyperparameters for the GAP model are: + +.. literalinclude:: ../../../src/metatrain/experimental/gap/default-hypers.yaml + :language: yaml + + +Tuning Hyperparameters +---------------------- +The default hyperparameters above will work well in most cases, but they +may not be optimal for your specific dataset. In general, the most important +hyperparameters to tune are (in decreasing order of importance): + +- ``cutoff``: This should be set to a value after which most of the + interactions between atoms is expected to be negligible. +- ``num_sparse_points``: Number of sparse points to use during + the training, it select the number of actual samples + to use during the training. The selection is done with + the Further Point Sampling (FPS) algorithm. + The optimal number of sparse points depends on the system. + Increasing it might impreve the accuracy, but it also increase the + memory and time required for training. +- ``regularizer``: Value of the regularizer for the energy. It should + be tuned depending on the specific dataset. If it is too small might + lead to overfitting, if it is too big might lead to bad accuracy. +- ``regularizer_forces``: Value of the regularizer for the forces. It has + a similar effect as ``regularizer``. By default is set equal to ``regularizer``. + It might be changed to have better accuracy. +- ``max_radial``, ``max_angular``: + These hyperparameters control the size and depth of the SOAP descriptors, in + particular the total number of radial and angular channels. + In general, increasing these hyperparameters might lead to better accuracy, + especially on larger datasets, at the cost of increased training and evaluation time. +- ``radial_scaling`` hyperparameters: These hyperparameters control the radial scaling + of the SOAP descriptor. In general, the default values should work well, but they + might need to be adjusted for specific datasets. +- ``degree``: degree of the kernel. For now, only 2 is allowed. + + +Architecture Hyperparameters +---------------------------- + +:param name: ``experimental.gap`` + +model +##### +soap +^^^^ +:param cutoff: Spherical cutoff (Å) to use for atomic environments. Default 5.0 +:param max_radial: Number of radial basis function to use. Default 8 +:param max_angular: Number of angular basis function to use also denoted by the maximum + degree of spherical harmonics. Default 6 +:param atomic_gaussian_width: Width of the atom-centered gaussian creating the atomic + density. Default 0.3 +:param center_atom_weight: Weight of the central atom contribution to the features. If + 1.0 the center atom contribution is weighted the same as any other contribution. If + 0.0 the central atom does not contribute to the features at all. Default 1.0 +:param cutoff_function: cutoff function used to smooth the behavior around the cutoff + radius. The supported cutoff function are + + - ``Step``: Step function, 1 if ``r < cutoff`` and 0 if ``r >= cutoff``. This cutoff + function takes no additional parameters and can set as in ``.yaml`` file: + + .. code-block:: yaml + + cutoff_function: + Step: + + - ``ShiftedCosine`` (Default value): Shifted cosine switching function + ``f(r) = 1/2 * (1 + cos(π (r- cutoff + width) / width ))``. + This cutoff function takes the ``width``` as + additional parameter and can set as in ``options.yaml`` file as: + + .. code-block:: yaml + + cutoff_function: + ShiftedCosine: + width: 1.0 + +:param radial_scaling: Radial scaling can be used to reduce the importance of neighbor + atoms further away from the center, usually improving the performance of the model. + The supported radial scaling functions are + + - ``None``: No radial scaling. + + .. code-block:: yaml + + radial_scaling: + None: + + - ``Willatt2018`` (Default value): Use a long-range algebraic decay and + smooth behavior at :math:`r + \rightarrow 0`: as introduced by :footcite:t:`willatt_feature_2018` as ``f(r) = + rate / (rate + (r / scale) ^ exponent)`` This radial scaling function can be set + in the ``options.yaml`` file as. + + .. code-block:: yaml + + radial_scaling: + Willatt2018: + rate: 1.0 + scale: 2.0 + exponent: 7.0 + +.. note:: + + Currently, we only support a Gaussian type orbitals (GTO) as radial basis functions + and radial integrals. + +krr +^^^^ +:param degree: degree of the polynomial kernel. Default 2 +:param num_sparse_points: number of pseudo points to select + (by farthest point sampling). Default 500 + +training: +^^^^^^^^^ +:param regularizer: value of the energy regularizer. Default 0.001 +:param regularizer_forces: value of the forces regularizer. Default null diff --git a/latest/_sources/architectures/index.rst.txt b/latest/_sources/architectures/index.rst.txt new file mode 100644 index 000000000..26592310e --- /dev/null +++ b/latest/_sources/architectures/index.rst.txt @@ -0,0 +1,12 @@ +.. _available-architectures: + +Available Architectures +======================= + +This is a list of all architectures available in ``metatrain``. + +.. toctree:: + :maxdepth: 1 + :glob: + + ./* diff --git a/latest/_sources/architectures/pet.rst.txt b/latest/_sources/architectures/pet.rst.txt new file mode 100644 index 000000000..c60393609 --- /dev/null +++ b/latest/_sources/architectures/pet.rst.txt @@ -0,0 +1,241 @@ +.. _architecture-pet: + +PET +=== + +.. warning:: + + The metatrain interface to PET is **experimental**. You should not use it for + anything important. You can also fit PET from `here + `_. + + +Installation +------------ + +To install the package, you can run the following command in the root directory of the +repository: + +.. code-block:: bash + + pip install .[pet] + +This will install the package with the PET dependencies. + + +Default Hyperparameters +----------------------- +The default hyperparameters for the PET model are: + +.. literalinclude:: ../../../src/metatrain/experimental/pet/default-hypers.yaml + :language: yaml + +Tuning Hyperparameters +---------------------- +1) Set ``R_CUT`` so that there are about 20-30 neighbors on average for your dataset. +2) Fit the model with the default values for all the other hyperparameters. +3) Ensure that you fit the model long enough for the error to converge. (If not, you can + always continue fitting the model from the last checkpoint.) +4) [Optional, recommended for large datasets] Increase the scheduler step size, and + refit the model from scratch until convergence. Do this for several progressively + increased values for the scheduler step size until convergence. +5) [Optional, this step aims to create a lighter and faster model, not to increase + accuracy.] Set ``N_TRANS_LAYERS`` to 2 instead of 3, and repeat steps 3) and 4). If + step 4) was already done for the default ``N_TRANS_LAYERS`` value of 3, you can + probably reuse the converged scheduler step size. The resulting model would be about + 1.5 times faster than the default one, hopefully with very little deterioration of + the accuracy or without any at all. +6) [Optional, quite laborious, 99% you don't need this] Read sections 6 and 7 of the + `PET paper `_, which discuss the architecture, main + hyperparameters, and an ablation study illustrating their impact on the model's + accuracy. Design your own experiments. + +More details: +~~~~~~~~~~~~~ +There are two significant groups of hyperparameters controlling PET fits. The first +group consists of the hyperparameters related to the model architecture itself, such as +the number of layers, type of activation function, etc. The second group consists of +settings that control how the fitting is done, such as batch size, the total number of +epochs, learning rate, parameters of the learning rate scheduler, and so on. + +Within conventional wisdom originating from *traditional* models, such as linear and +kernel regression, the second group of hyperparameters that controls the optimizer's +behavior might seem unimportant. Indeed, when fitting linear or kernel models, the exact +value of the optimum is usually achieved by linear algebra methods, and thus, the +particular choice of optimizer has little importance. + +However, with deep neural networks, the situation is drastically different. The exact +minimum of the loss is typically never achieved; instead, the model asymptotically +converges to it during fitting. It is essential to ensure that the total number of +epochs is sufficient for the model to approach the optimum closely, thus achieving good +accuracy. + +**In the case of PET, there is only one hyperparameter that MUST be manually adjusted +for each new dataset: the cutoff radius.** The selected cutoff significantly impacts the +model's accuracy and fitting/inference times, making it very sensitive to this +hyperparameter. All other hyperparameters can be safely set to their default values. The +next reasonable step (after fitting with default settings), especially for large +datasets is to try to increase the duration of fitting and see if it improves the +accuracy of the obtained model. + +Selection of ``R_CUT`` +********************** +A good starting point is to select a cutoff radius that ensures about 20-30 neighbors on +average. This can be done by analyzing the neighbor lists for different cutoffs before +launching the training script. `This +`_ is an example of a neighbor list +constructor in Python. + +For finite configurations, such as small molecules in COLL/QM9/rmd17 datasets, it makes +sense to select ``R_CUT`` large enough to encompass the whole molecule. For instance, it +can be set to 100 Å, as there are no numerical instabilities for arbitrarily large +cutoffs. + +The hyperparameter for the cutoff radius is called ``R_CUT.`` + +Selection of fitting duration +***************************** +The second most important group of settings is the one that adjusts the fitting duration +of the model. Unlike specifying a dataset-specific cutoff radius, this step is optional +since reasonable results can be obtained with the default fitting duration. The time +required to fit the model is a complex function of the model's size, the dataset's size, +and the complexity of the studied interatomic interactions. The default value might be +insufficient for large datasets. If the model is still underfit after the predefined +number of epochs, the fitting procedure can be continued by relaunching the fitting +script. + +However, the total number of epochs is only part of the equation. Another key aspect is +the rate at which the learning rate decays. We use `StepLR +`_ as a +learning rate scheduler. This scheduler reduces the learning rate by a factor of +``gamma`` (``new_learning_rate = old_learning_rate * gamma``) every ``step_size`` +epochs. In the current implementation of PET, ``gamma`` is fixed at 0.5, meaning that +the learning rate is halved every ``step_size`` epochs. + +If ``step_size`` is set too small, the learning rate will decrease to very low values +too quickly, hindering the convergence of PET. Prolonged fitting under these conditions +will be ineffective due to the nearly zero learning rate. Therefore, achieving complete +convergence requires not only a sufficient number of epochs but also an appropriately +large ``step_size``. For typical moderately sized datasets, the default value should +suffice. However, for particularly large datasets, increasing ``step_size`` may be +necessary to ensure complete convergence. The hyperparameter controlling the +``step_size`` of the StepLR learning rate scheduler is called ``SCHEDULER_STEP_SIZE``. + +For hyperparameters like ``SCHEDULER_STEP_SIZE``, ``EPOCH_NUM``, ``BATCH_SIZE``, and +``EPOCHS_WARMUP``, either normal or atomic versions can be specified. +``SCHEDULER_STEP_SIZE`` was discussed above; ``EPOCH_NUM`` represents the total number +of epochs, and ``BATCH_SIZE`` is the number of structures sampled in each minibatch for +a single step of stochastic gradient descent. The atomic versions are termed +``SCHEDULER_STEP_SIZE_ATOMIC``, ``EPOCH_NUM_ATOMIC``, ``BATCH_SIZE_ATOMIC``, and +``EPOCHS_WARMUP_ATOMIC``. The motivation for the atomic versions is to improve the +transferability of default hyperparameters across heterogeneous datasets. For instance, +using the same batch size for datasets with structures of very different sizes makes +little sense. If one dataset contains molecules with 10 atoms on average and another +contains nanoparticles with 1000 atoms, it makes sense to use a 100 times larger batch +size in the first case. If ``BATCH_SIZE_ATOMIC`` is specified, the normal batch size is +computed as ``BATCH_SIZE = BATCH_SIZE_ATOMIC / +(average_number_of_atoms_in_the_training_dataset)``. Similar logic applies to +``SCHEDULER_STEP_SIZE,`` ``EPOCH_NUM,`` and ``EPOCHS_WARMUP.`` In these cases, normal +versions are obtained by division by the total number of atoms of structures in the +training dataset. All default values are given by atomic versions for better +transferability across various datasets. + +To increase the step size of the learning rate scheduler by, for example, 2 times, take +the default value for ``SCHEDULER_STEP_SIZE_ATOMIC`` from the default_hypers and specify +a value that's twice as large. + +It is worth noting that the stopping criterion of PET is either exceeding the maximum +number of epochs (specified by ``EPOCH_NUM`` or ``EPOCH_NUM_ATOMIC``) or exceeding the +specified maximum fitting time (controlled by the hyperparameter ``MAX_TIME``). By +default, the second criterion is used, with the default number of epochs set nearly to +infinity, while the default maximum time is set to be 65 hours. + +Lightweight Model +***************** +The default hyperparameters were selected with one goal in mind: to maximize the +probability of achieving the best accuracy on a typical moderate-sized dataset. As a +result, some default hyperparameters might be excessive, meaning they could be adjusted +to significantly increase the model's speed with minimal impact on accuracy. For +practical use, especially when conducting massive calculations where model speed is +crucial, it may be beneficial to set ``N_TRANS_LAYERS`` to `2` instead of the default +value of `3`. The ``N_TRANS_LAYERS`` hyperparameter controls the number of transformer +layers in each message-passing block (see more details in the `PET paper +`_). This adjustment would result in a model that is +about `1.5` times more lightweight and faster, with an expected minimal deterioration in +accuracy. + +Architecture Hyperparameters +---------------------------- +.. warning:: + + While PET supports CPU training, it is highly recommended to use a CUDA GPU for + significantly faster training. CPU training can be very slow. + +- ``RANDOM_SEED``: random seed +- ``CUDA_DETERMINISTIC``: if applying PyTorch reproducibility settings +- ``MULTI_GPU``: use multi-GPU training (on one node) using DataParallel from + PyTorch-Geometric +- ``R_CUT``: cutoff radius +- ``CUTOFF_DELTA``: width of the transition region for a cutoff function used + by PET to ensure smoothness with respect to the (dis)appearance of atoms at + the cutoff sphere +- ``GLOBAL_AUG``: whether to use global augmentation or a local one, rotating + atomic environments independently +- ``USE_ENERGIES``: whether to use energies for training +- ``USE_FORCES``: whether to use forces for training +- ``SLIDING_FACTOR``: sliding factor for exponential sliding averages of MSE in + energies and forces in our combined loss definition +- ``ENERGY_WEIGHT``: $w_{E}$, dimensionless energy weight in our combined loss + definition +- ``N_GNN_LAYERS``: number of message-passing blocks +- ``TRANSFORMER_D_MODEL``: was denoted as d_{pet} in the main text of + the paper +- ``TRANSFORMER_N_HEAD``: number of heads of each transformer +- ``TRANSFORMER_DIM_FEEDFORWARD``: feedforward dimensionality of each + transformer +- ``HEAD_N_NEURONS``: number of neurons in the intermediate layers of HEAD MLPs +- ``N_TRANS_LAYERS``: number of layers of each transformer +- ``ACTIVATION``: activation function used everywhere +- ``INITIAL_LR``: initial learning rate +- ``MAX_TIME``: maximal time to train the model in seconds + +---- + +For parameters such as ``EPOCH_NUM`` the user can specify either normal +``EPOCH_NUM`` or ``EPOCH_NUM_ATOMIC``. If the second is specified, normal +``EPOCH_NUM`` is computed as ``EPOCH_NUM_ATOMIC / (total number of atoms in the +training dataset)``. Similarly defined are: + +- ``SCHEDULER_STEP_SIZE_ATOMIC``: step size of StepLR learning rate schedule +- ``EPOCHS_WARMUP_ATOMIC``: linear warmup time + +For the batch size, the normal version of batch size is computed as +``BATCH_SIZE_ATOMIC / (average number of atoms in structures in the training +dataset)``. + +- ``ATOMIC_BATCH_SIZE``: batch size + +---- + +- ``USE_LENGTH``: explicitly use length in r embedding or not +- ``USE_ONLY_LENGTH``: use only length in r embedding (used to get auxiliary + intrinsically invariant models) +- ``USE_BOND_ENERGIES``: use bond contributions to energies or not +- ``AVERAGE_BOND_ENERGIES``: average bond contributions or sum +- ``BLEND_NEIGHBOR_SPECIES``: if True, explicitly encode embeddings of neighbor + species to the overall embeddings in each message-passing block; if False, + specify the very first input messages as embeddings of neighbor species + instead +- ``R_EMBEDDING_ACTIVATION``: apply or not activation after computing r + embedding by a linear layer +- ``COMPRESS_MODE``: if "mlp," get overall embedding either by MLP; if "linear," + use simple linear compression instead +- ``ADD_TOKEN_FIRST``: add or not token associated with central atom for the + very first message-passing block +- ``ADD_TOKEN_SECOND``: add or not token associated with central atom for all + the others (to be renamed in future) +- ``AVERAGE_POOLING``: if not using a central token, controls if summation or + average pooling is used +- ``USE_ADDITIONAL_SCALAR_ATTRIBUTES``: if using additional scalar attributes + such as collinear spins +- ``SCALAR_ATTRIBUTES_SIZE``: dimensionality of additional scalar attributes diff --git a/latest/_sources/architectures/soap-bpnn.rst.txt b/latest/_sources/architectures/soap-bpnn.rst.txt new file mode 100644 index 000000000..1c87eda3f --- /dev/null +++ b/latest/_sources/architectures/soap-bpnn.rst.txt @@ -0,0 +1,160 @@ +.. _architecture-soap-bpnn: + +SOAP-BPNN +========= + +.. warning:: + + This is an **experimental model**. You should not use it for anything important. + +This is a Behler-Parrinello neural network :footcite:p:`behler_generalized_2007` with +using features based on the Smooth overlab of atomic positions (SOAP) +:footcite:p:`bartok_representing_2013`. The SOAP features are calculated wit `rascaline +`_. + +Installation +------------ +To install the package, you can run the following command in the root +directory of the repository: + +.. code-block:: bash + + pip install .[soap-bpnn] + +This will install the package with the SOAP-BPNN dependencies. + + +Default Hyperparameters +----------------------- +The default hyperparameters for the SOAP-BPNN model are: + +.. literalinclude:: ../../../src/metatrain/experimental/soap_bpnn/default-hypers.yaml + :language: yaml + + +Tuning Hyperparameters +---------------------- +The default hyperparameters above will work well in most cases, but they +may not be optimal for your specific dataset. In general, the most important +hyperparameters to tune are (in decreasing order of importance): + +- ``cutoff``: This should be set to a value after which most of the interactions between + atoms is expected to be negligible. +- ``learning_rate``: The learning rate for the neural network. This hyperparameter + controls how much the weights of the network are updated at each step of the + optimization. A larger learning rate will lead to faster training, but might cause + instability and/or divergence. +- ``batch_size``: The number of samples to use in each batch of training. This + hyperparameter controls the tradeoff between training speed and memory usage. In + general, larger batch sizes will lead to faster training, but might require more + memory. +- ``num_hidden_layers``, ``num_neurons_per_layer``, ``max_radial``, ``max_angular``: + These hyperparameters control the size and depth of the descriptors and the neural + network. In general, increasing these hyperparameters might lead to better accuracy, + especially on larger datasets, at the cost of increased training and evaluation time. +- ``radial_scaling`` hyperparameters: These hyperparameters control the radial scaling + of the SOAP descriptor. In general, the default values should work well, but they + might need to be adjusted for specific datasets. +- ``loss_weights``: This controls the weighting of different contributions to the loss + (e.g., energy, forces, virial, etc.). The default values work well for most datasets, + but they might need to be adjusted. For example, to set a weight of 1.0 for the energy + and 0.1 for the forces, you can set the following in the ``options.yaml`` file: + ``loss_weights: {"energy": 1.0, "forces": 0.1}``. +- ``layernorm``: Whether to use layer normalization before the neural network. Setting + this hyperparameter to ``false`` will lead to slower convergence of training, but + might lead to better generalization outside of the training set distribution. + + +All Hyperparameters +------------------- +:param name: ``experimental.soap_bpnn`` + +model +##### +soap +^^^^ +:param cutoff: Spherical cutoff (Å) to use for atomic environments +:param max_radial: Number of radial basis function to use +:param max_angular: Number of angular basis function to use also denoted by the maximum + degree of spherical harmonics +:param atomic_gaussian_width: Width of the atom-centered gaussian creating the atomic + density +:param center_atom_weight: Weight of the central atom contribution to the features. If + 1.0 the center atom contribution is weighted the same as any other contribution. If + 0.0 the central atom does not contribute to the features at all. +:param cutoff_function: cutoff function used to smooth the behavior around the cutoff + radius. The supported cutoff function are + + - ``Step``: Step function, 1 if ``r < cutoff`` and 0 if ``r >= cutoff``. This cutoff + function takes no additional parameters and can set as in ``.yaml`` file: + + .. code-block:: yaml + + cutoff_function: + Step: + + - ``ShiftedCosine``: Shifted cosine switching function ``f(r) = 1/2 * (1 + cos(π (r + - cutoff + width) / width ))``. This cutoff function takes the ``width``` as + additional parameter and can set as in ``options.yaml`` file as: + + .. code-block:: yaml + + cutoff_function: + ShiftedCosine: + width: 1.0 + +:param radial_scaling: Radial scaling can be used to reduce the importance of neighbor + atoms further away from the center, usually improving the performance of the model. + The supported radial scaling functions are + + - ``None``: No radial scaling. + + .. code-block:: yaml + + radial_scaling: + None: + + - ``Willatt2018`` Use a long-range algebraic decay and smooth behavior at :math:`r + \rightarrow 0`: as introduced by :footcite:t:`willatt_feature_2018` as ``f(r) = + rate / (rate + (r / scale) ^ exponent)`` This radial scaling function can be set + in the ``options.yaml`` file as. + + .. code-block:: yaml + + radial_scaling: + Willatt2018: + rate: 1.0 + scale: 2.0 + exponent: 7.0 + +.. note:: + + Currently, we only support a Gaussian type orbitals (GTO) as radial basis functions + and radial integrals. + +bpnn +^^^^ +:param layernorm: whether to use layer normalization +:param num_hidden_layers: number of hidden layers +:param num_neurons_per_layer: number of neurons per hidden layer + +training +######## +The parameters for training are + +:param batch_size: batch size +:param num_epochs: number of training epochs +:param learning_rate: learning rate +:param log_interval: number of epochs that elapse between reporting new training results +:param checkpoint_interval: Interval to save a checkpoint to disk. +:param per_atom_targets: Specifies whether the model should be trained on a per-atom + loss. In that case, the logger will also output per-atom metrics for that target. In + any case, the final summary will be per-structure. +:param loss_weights: Specifies the weights to be used in the loss for each target. The + weights should be a dictionary of floats, one for each target. All missing targets + are assigned a weight of 1.0. + + +References +---------- +.. footbibliography:: diff --git a/latest/_sources/dev-docs/architecture-life-cycle.rst.txt b/latest/_sources/dev-docs/architecture-life-cycle.rst.txt new file mode 100644 index 000000000..d73ffacd9 --- /dev/null +++ b/latest/_sources/dev-docs/architecture-life-cycle.rst.txt @@ -0,0 +1,58 @@ +.. _architecture-life-cycle: + +Life Cycle of an Architecture +============================= + +.. TODO: Maybe add a flowchart later + +Architectures in `metatrain` undergo different stages based on their +development/functionality level and maintenance status. We distinguish three distinct +stages: **experimental**, **stable**, and **deprecated**. Typically, an architecture +starts as experimental, advances to stable, and eventually becomes deprecated before +removal if maintenance is no longer feasible. + +.. note:: + The development and maintenance of an architecture must be fully undertaken by the + architecture's authors or maintainers. The core developers of `metatrain` + provide infrastructure and implementation support but are not responsible for the + architecture's internal functionality or any issues that may arise therein. + +Experimental Architectures +-------------------------- + +New architectures added to the library will initially be classified as experimental. +These architectures are stored in the ``experimental`` subdirectory within the +repository. To qualify as an experimental architecture, certain criteria must be met: + +1. Capability to fit at least a single quantity and predict it, verified through CI + tests. +2. Compatibility with JIT compilation using `TorchScript + `_. +3. Provision of reasonable default hyperparameters. +4. Minimal code quality, ensured by passing linting tests invoked with ``tox -e lint``. +5. A contact person designated as the maintainer. +6. All external dependencies must be pip-installable. While not required to be on PyPI, + a public git repository or another public URL with a repository is acceptable. + +For detailed instructions on adding a new architecture, refer to +:ref:`adding-new-architecture`. + +Stable Architectures +-------------------- + +Transitioning from an experimental to a stable model requires additional criteria to be +satisfied: + +1. Provision of regression prediction tests with a small (not exported) checkpoint file. +2. Comprehensive architecture documentation +3. If an architecture has external dependencies, all must be publicly available on PyPI. +4. Adherence to the standard output infrastructure of `metatrain`, including + logging and model save locations. + +Deprecated Architectures +------------------------ + +An architecture will be deemed deprecated if its maintainer becomes irresponsive +any of its CI jobs fail. Such an architecture will be **removed after 6 months** unless +a new maintainer is found who can address the issues. If rectified within this 6-month +period, the model may revert to its previous stable or experimental status. diff --git a/latest/_sources/dev-docs/cli/eval.rst.txt b/latest/_sources/dev-docs/cli/eval.rst.txt new file mode 100644 index 000000000..ec652e04e --- /dev/null +++ b/latest/_sources/dev-docs/cli/eval.rst.txt @@ -0,0 +1,7 @@ +Eval +#### + +.. automodule:: metatrain.cli.eval + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/cli/export.rst.txt b/latest/_sources/dev-docs/cli/export.rst.txt new file mode 100644 index 000000000..7406d219a --- /dev/null +++ b/latest/_sources/dev-docs/cli/export.rst.txt @@ -0,0 +1,7 @@ +Export +###### + +.. automodule:: metatrain.cli.export + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/cli/formatter.rst.txt b/latest/_sources/dev-docs/cli/formatter.rst.txt new file mode 100644 index 000000000..ce3a3bc01 --- /dev/null +++ b/latest/_sources/dev-docs/cli/formatter.rst.txt @@ -0,0 +1,7 @@ +Formatter +######### + +.. automodule:: metatrain.cli.formatter + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/cli/index.rst.txt b/latest/_sources/dev-docs/cli/index.rst.txt new file mode 100644 index 000000000..b822afdc5 --- /dev/null +++ b/latest/_sources/dev-docs/cli/index.rst.txt @@ -0,0 +1,20 @@ +CLI API +======= + +This is the API for the command line interface ``cli`` functions for the ``train``, +the ``eval`` and the ``export`` functions of ``metatrain``. + +.. toctree:: + :maxdepth: 1 + + train + eval + export + +We provide a custom formatter class for the formatting the help message of the +`argparse` package. + +.. toctree:: + :maxdepth: 1 + + formatter diff --git a/latest/_sources/dev-docs/cli/train.rst.txt b/latest/_sources/dev-docs/cli/train.rst.txt new file mode 100644 index 000000000..f3e77cfcb --- /dev/null +++ b/latest/_sources/dev-docs/cli/train.rst.txt @@ -0,0 +1,7 @@ +Train +##### + +.. automodule:: metatrain.cli.train + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/getting-started.rst.txt b/latest/_sources/dev-docs/getting-started.rst.txt new file mode 100644 index 000000000..9e6610243 --- /dev/null +++ b/latest/_sources/dev-docs/getting-started.rst.txt @@ -0,0 +1,3 @@ +.. _label_dev-getting-started: + +.. include:: ../../../CONTRIBUTING.rst diff --git a/latest/_sources/dev-docs/index.rst.txt b/latest/_sources/dev-docs/index.rst.txt new file mode 100644 index 000000000..04e47bad4 --- /dev/null +++ b/latest/_sources/dev-docs/index.rst.txt @@ -0,0 +1,16 @@ +Developer documentation +======================= + +This is a collection of documentation for developers of the `metatrain` package. +It includes documentation on how to add a new model, as well as the API of the utils +module. + + +.. toctree:: + :maxdepth: 1 + + getting-started + architecture-life-cycle + new-architecture + cli/index + utils/index diff --git a/latest/_sources/dev-docs/new-architecture.rst.txt b/latest/_sources/dev-docs/new-architecture.rst.txt new file mode 100644 index 000000000..49479462e --- /dev/null +++ b/latest/_sources/dev-docs/new-architecture.rst.txt @@ -0,0 +1,162 @@ +.. _adding-new-architecture: + +Adding a new architecture +========================= + +To work with` metatrain` any architecture has to follow the same public API to +be called correctly within the :py:func:`metatrain.cli.train` function to +process the user's options. In brief, the core of the ``train`` function looks similar +to these lines + +.. code-block:: python + + from architecture import __model__ as Model + from architecture import __trainer__ as Trainer + + hypers = {} + dataset_info = DatasetInfo() + + if continue_from is not None: + trainer = Trainer.load_checkpoint(continue_from, hypers["training"]) + model = Model.load_checkpoint(continue_from) + model = model.restart(dataset_info) + else: + model = Model(hypers["model"], dataset_info) + trainer = Trainer(hypers["training"]) + + trainer.train( + model=model, + devices=[], + train_datasets=[], + val_datasets=[], + checkpoint_dir="path", + ) + + model.save_checkpoint("model.ckpt") + + mts_atomistic_model = model.export() + mts_atomistic_model.export("model.pt", collect_extensions="extensions/") + + +In order to follow this, a new architectures has two define two classes + +- a ``Model`` class, defining the core of the architecture. This class must implement + the interface documented below in :py:class:`ModelInterface` +- a ``Trainer`` class, used to train an architecture and produce a model that can be + evaluated and exported. This class must implement the interface documented below in + :py:class:`TrainerInterface`. + +.. note:: + + ``metatrain`` does not know the types and numbers of targets/datasets that + an architecture can handle. As a result, it cannot generate useful error messages + when a user attempts to train an architecture with unsupported target and dataset + combinations. Therefore, it is the responsibility of the architecture developer to + verify if the model and the trainer support the provided train_datasets and + val_datasets passed to the Trainer, as well as the dataset_info passed to the + model. + +The ``ModelInterface`` is the main model class and must implement the +``load_checkpoint()``, ``restart()`` and ``export()`` methods. + +.. code-block:: python + + class ModelInterface: + + __supported_devices__ = ["cuda", "cpu"] + __supported_dtypes__ = [torch.float64, torch.float32] + + def __init__(self, model_hypers: Dict, dataset_info: DatasetInfo): + self.hypers = model_hypers + self.dataset_info = dataset_info + + @classmethod + def load_checkpoint(cls, path: Union[str, Path]) -> "ModelInterface": + pass + + def restart(cls, dataset_info: DatasetInfo) -> "ModelInterface": + """Restart training. + + This function is called whenever training restarts, with the same or a + different dataset. + + It enables transfer learning (changing the targets), and fine tuning (same + targets, different dataset) + """ + pass + + def export(self) -> MetatensorAtomisticModel: + pass + +Note that the ``ModelInterface`` does not necessary inherit from +:py:class:`torch.nn.Module` since training can be performed in any way. +``__supported_devices__`` and ``__supported_dtypes__`` can be defined to set the +capabilities of the model. These two lists should be sorted in order of preference since +`metatrain` will use these to determine, based on the user request and +machines's availability, the optimal `dtype` and `device` for training. + +The ``export()`` method is required to transform a trained model into a standalone file +to be used in combination with molecular dynamic engines to run simulations. We provide +a helper function :py:func:`metatrain.utils.export.export` to export a torch +model to an :py:class:`MetatensorAtomisticModel +`. + +The ``TrainerInterface`` class should have the following signature with required +methods for ``train()``, ``save_checkpoint()`` and ``load_checkpoint()``. + +.. code-block:: python + + class TrainerInterface: + def __init__(self, train_hypers): + self.hypers = train_hypers + + def train( + self, + model: ModelInterface, + devices: List[torch.device], + train_datasets: List[Union[Dataset, torch.utils.data.Subset]], + val_datasets: List[Union[Dataset, torch.utils.data.Subset]], + checkpoint_dir: str, + ) -> None: ... + + def save_checkpoint(self, path: Union[str, Path]) -> None: ... + + @classmethod + def load_checkpoint( + cls, path: Union[str, Path], train_hypers: Dict + ) -> "TrainerInterface": + pass + +The format of checkpoints is not defined by `metatrain` and can be any format that +can be loaded by the trainer (to restart training) and by the model (to export the +checkpoint). + +The names of the ``ModelInterface`` and the ``TrainerInterface`` are free to choose but +should be linked to constants in the ``__init__.py`` of each architecture. On top of +these two constants the ``__init__.py`` must contain constants for the original +`__authors__` and current `__maintainers__` of the architecture. + +.. code-block:: python + + from .model import CustomSOTAModel + from .trainer import Trainer + + __model__ = CustomSOTAModel + __trainer__ = Trainer + + __authors__ = [ + ("Jane Roe ", "@janeroe"), + ("John Doe ", "@johndoe"), + ] + + __maintainers__ = [("Joe Bloggs ", "@joebloggs")] + + +:param __model__: Mapping of the custom ``ModelInterface`` to a general one to be loaded + by ``metatrain``. +:param __trainer__: Same as ``__MODEL_CLASS__`` but the Trainer class. +:param __authors__: Tuple denoting the original authors with email address and Github + handle of an architecture. These do not necessary be in charge of maintaining the + the architecture. +:param __maintainers__: Tuple denoting the current maintainers of the architecture. Uses + the same style as the ``__authors__`` constant. diff --git a/latest/_sources/dev-docs/utils/architectures.rst.txt b/latest/_sources/dev-docs/utils/architectures.rst.txt new file mode 100644 index 000000000..69d8f22ce --- /dev/null +++ b/latest/_sources/dev-docs/utils/architectures.rst.txt @@ -0,0 +1,9 @@ +Architectures +############# + +Utility functions to detect architecture and verify their names in metatrain. + +.. automodule:: metatrain.utils.architectures + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/utils/composition.rst.txt b/latest/_sources/dev-docs/utils/composition.rst.txt new file mode 100644 index 000000000..0a6cb2a34 --- /dev/null +++ b/latest/_sources/dev-docs/utils/composition.rst.txt @@ -0,0 +1,7 @@ +Composition +########### + +.. automodule:: metatrain.utils.composition + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/utils/data/combine_dataloaders.rst.txt b/latest/_sources/dev-docs/utils/data/combine_dataloaders.rst.txt new file mode 100644 index 000000000..ecd8eb019 --- /dev/null +++ b/latest/_sources/dev-docs/utils/data/combine_dataloaders.rst.txt @@ -0,0 +1,9 @@ +Combining dataloaders +##################### + +.. automodule:: metatrain.utils.data.combine_dataloaders + :members: + :undoc-members: + :show-inheritance: + :special-members: + :exclude-members: __init__, reset, __iter__, __next__ diff --git a/latest/_sources/dev-docs/utils/data/dataset.rst.txt b/latest/_sources/dev-docs/utils/data/dataset.rst.txt new file mode 100644 index 000000000..c85731df6 --- /dev/null +++ b/latest/_sources/dev-docs/utils/data/dataset.rst.txt @@ -0,0 +1,7 @@ +Dataset +####### + +.. automodule:: metatrain.utils.data.dataset + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/utils/data/index.rst.txt b/latest/_sources/dev-docs/utils/data/index.rst.txt new file mode 100644 index 000000000..0965f4fa6 --- /dev/null +++ b/latest/_sources/dev-docs/utils/data/index.rst.txt @@ -0,0 +1,13 @@ +Data +==== + +API for handling data in ``metatrain``. + +.. toctree:: + :maxdepth: 1 + + combine_dataloaders + dataset + readers/index + writers + systems_to_ase diff --git a/latest/_sources/dev-docs/utils/data/readers/index.rst.txt b/latest/_sources/dev-docs/utils/data/readers/index.rst.txt new file mode 100644 index 000000000..27e73ad1a --- /dev/null +++ b/latest/_sources/dev-docs/utils/data/readers/index.rst.txt @@ -0,0 +1,32 @@ +system and Target data Readers +================================= + +The main entry point for reading system and target information are the two reader +functions + +.. autofunction:: metatrain.utils.data.read_systems +.. autofunction:: metatrain.utils.data.read_targets + +Target type specific readers +---------------------------- + +:func:`metatrain.utils.data.read_targets` uses sub-functions to parse supported +target properties like the `energy` or `forces`. Currently we support reading the +following target properties via + +.. autofunction:: metatrain.utils.data.read_energy +.. autofunction:: metatrain.utils.data.read_forces +.. autofunction:: metatrain.utils.data.read_virial +.. autofunction:: metatrain.utils.data.read_stress + +File type specific readers +-------------------------- + +Based on the provided `file_format` they chose which sub-reader they use. For details on +these refer to their documentation + +.. toctree:: + :maxdepth: 1 + + systems + targets diff --git a/latest/_sources/dev-docs/utils/data/readers/systems.rst.txt b/latest/_sources/dev-docs/utils/data/readers/systems.rst.txt new file mode 100644 index 000000000..d4d8300e5 --- /dev/null +++ b/latest/_sources/dev-docs/utils/data/readers/systems.rst.txt @@ -0,0 +1,13 @@ +system Readers +################# + +Parsers for obtaining information from systems. All readers return a :py:class:`list` +of :py:class:`metatensor.torch.atomistic.System`. The mapping which reader is used for +which file type is stored in + +.. autodata:: metatrain.utils.data.readers.systems.SYSTEM_READERS + +Implemented Readers +------------------- + +.. autofunction:: metatrain.utils.data.readers.systems.read_systems_ase diff --git a/latest/_sources/dev-docs/utils/data/readers/targets.rst.txt b/latest/_sources/dev-docs/utils/data/readers/targets.rst.txt new file mode 100644 index 000000000..436bc6745 --- /dev/null +++ b/latest/_sources/dev-docs/utils/data/readers/targets.rst.txt @@ -0,0 +1,62 @@ +Target data Readers +################### + +Parsers for obtaining target informations from target files. All readers return a +:py:class:`metatensor.torch.TensorBlock`. Currently we support the following target +properties + +- :ref:`energy` +- :ref:`forces` +- :ref:`stress` +- :ref:`virial` + +The mapping which reader is used for which file type is stored in a dictionary. + +.. _energy: + +Energy +====== + +.. autodata:: metatrain.utils.data.readers.targets.ENERGY_READERS + +Implemented Readers +------------------- + +.. autofunction:: metatrain.utils.data.readers.targets.read_energy_ase + + +.. _forces: + +Forces +====== + +.. autodata:: metatrain.utils.data.readers.targets.FORCES_READERS + +Implemented Readers +------------------- + +.. autofunction:: metatrain.utils.data.readers.targets.read_forces_ase + +.. _stress: + +Stress +====== + +.. autodata:: metatrain.utils.data.readers.targets.STRESS_READERS + +Implemented Readers +------------------- + +.. autofunction:: metatrain.utils.data.readers.targets.read_stress_ase + +.. _virial: + +Virial +====== + +.. autodata:: metatrain.utils.data.readers.targets.VIRIAL_READERS + +Implemented Readers +------------------- + +.. autofunction:: metatrain.utils.data.readers.targets.read_virial_ase diff --git a/latest/_sources/dev-docs/utils/data/systems_to_ase.rst.txt b/latest/_sources/dev-docs/utils/data/systems_to_ase.rst.txt new file mode 100644 index 000000000..07b9360d6 --- /dev/null +++ b/latest/_sources/dev-docs/utils/data/systems_to_ase.rst.txt @@ -0,0 +1,11 @@ +Converting Systems to ASE +######################### + +Some machine learning models might train on ``ase.Atoms`` objects. +This module provides a function to convert a ``metatensor.torch.atomistic.System`` +object to an ``ase.Atoms`` object. + +.. automodule:: metatrain.utils.data.system_to_ase + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/utils/data/writers.rst.txt b/latest/_sources/dev-docs/utils/data/writers.rst.txt new file mode 100644 index 000000000..2b78c0ee2 --- /dev/null +++ b/latest/_sources/dev-docs/utils/data/writers.rst.txt @@ -0,0 +1,17 @@ +Target data Writers +=================== + +The main entry point for writing target information is + +.. autofunction:: metatrain.utils.data.writers.write_predictions + + +Based on the provided filename the writer choses which child writer to use. The mapping +which reader is used for which file type is stored in + +.. autodata:: metatrain.utils.data.writers.PREDICTIONS_WRITERS + +Implemented Writers +------------------- + +.. autofunction:: metatrain.utils.data.writers.write_xyz diff --git a/latest/_sources/dev-docs/utils/devices.rst.txt b/latest/_sources/dev-docs/utils/devices.rst.txt new file mode 100644 index 000000000..b4530ce87 --- /dev/null +++ b/latest/_sources/dev-docs/utils/devices.rst.txt @@ -0,0 +1,7 @@ +Device +###### + +.. automodule:: metatrain.utils.devices + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/utils/dtype.rst.txt b/latest/_sources/dev-docs/utils/dtype.rst.txt new file mode 100644 index 000000000..6ef5a7a60 --- /dev/null +++ b/latest/_sources/dev-docs/utils/dtype.rst.txt @@ -0,0 +1,7 @@ +Dtype +##### + +.. automodule:: metatrain.utils.dtype + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/utils/errors.rst.txt b/latest/_sources/dev-docs/utils/errors.rst.txt new file mode 100644 index 000000000..60d878b58 --- /dev/null +++ b/latest/_sources/dev-docs/utils/errors.rst.txt @@ -0,0 +1,7 @@ +Errors +###### + +.. automodule:: metatrain.utils.errors + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/utils/evaluate_model.rst.txt b/latest/_sources/dev-docs/utils/evaluate_model.rst.txt new file mode 100644 index 000000000..bb143aefd --- /dev/null +++ b/latest/_sources/dev-docs/utils/evaluate_model.rst.txt @@ -0,0 +1,7 @@ +Evaluating a model +################## + +.. automodule:: metatrain.utils.evaluate_model + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/utils/export.rst.txt b/latest/_sources/dev-docs/utils/export.rst.txt new file mode 100644 index 000000000..24dc20158 --- /dev/null +++ b/latest/_sources/dev-docs/utils/export.rst.txt @@ -0,0 +1,7 @@ +Export +###### + +.. automodule:: metatrain.utils.export + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/utils/external_naming.rst.txt b/latest/_sources/dev-docs/utils/external_naming.rst.txt new file mode 100644 index 000000000..24f8c307e --- /dev/null +++ b/latest/_sources/dev-docs/utils/external_naming.rst.txt @@ -0,0 +1,10 @@ +External Naming +############### + + +Functions to handle the conversion between external and internal naming conventions. + +.. automodule:: metatrain.utils.external_naming + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/utils/index.rst.txt b/latest/_sources/dev-docs/utils/index.rst.txt new file mode 100644 index 000000000..02ef681a6 --- /dev/null +++ b/latest/_sources/dev-docs/utils/index.rst.txt @@ -0,0 +1,26 @@ +Utility API +=========== + +This is the API for the ``utils`` module of ``metatrain``. + +.. toctree:: + :maxdepth: 1 + + data/index + architectures + composition + devices + dtype + errors + evaluate_model + external_naming + export + io + logging + loss + metrics + neighbor_lists + omegaconf + output_gradient + per_atom + units diff --git a/latest/_sources/dev-docs/utils/io.rst.txt b/latest/_sources/dev-docs/utils/io.rst.txt new file mode 100644 index 000000000..0528b762f --- /dev/null +++ b/latest/_sources/dev-docs/utils/io.rst.txt @@ -0,0 +1,11 @@ +IO +## + + +Functions to be used for handling the serialization of models + +.. automodule:: metatrain.utils.io + :members: + :undoc-members: + :show-inheritance: + :member-order: bysource diff --git a/latest/_sources/dev-docs/utils/logging.rst.txt b/latest/_sources/dev-docs/utils/logging.rst.txt new file mode 100644 index 000000000..99d997223 --- /dev/null +++ b/latest/_sources/dev-docs/utils/logging.rst.txt @@ -0,0 +1,7 @@ +Logging +####### + +.. automodule:: metatrain.utils.logging + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/utils/loss.rst.txt b/latest/_sources/dev-docs/utils/loss.rst.txt new file mode 100644 index 000000000..99f62b78c --- /dev/null +++ b/latest/_sources/dev-docs/utils/loss.rst.txt @@ -0,0 +1,7 @@ +Loss +#### + +.. automodule:: metatrain.utils.loss + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/utils/metrics.rst.txt b/latest/_sources/dev-docs/utils/metrics.rst.txt new file mode 100644 index 000000000..363e19b4b --- /dev/null +++ b/latest/_sources/dev-docs/utils/metrics.rst.txt @@ -0,0 +1,7 @@ +Metrics +####### + +.. automodule:: metatrain.utils.metrics + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/utils/neighbor_lists.rst.txt b/latest/_sources/dev-docs/utils/neighbor_lists.rst.txt new file mode 100644 index 000000000..b4833761c --- /dev/null +++ b/latest/_sources/dev-docs/utils/neighbor_lists.rst.txt @@ -0,0 +1,9 @@ +Neighbor lists +============== + +Utilities to attach neighbor lists to a ``metatensor.torch.atomistic.System`` object. + +.. automodule:: metatrain.utils.neighbor_lists + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/utils/omegaconf.rst.txt b/latest/_sources/dev-docs/utils/omegaconf.rst.txt new file mode 100644 index 000000000..2e12b878f --- /dev/null +++ b/latest/_sources/dev-docs/utils/omegaconf.rst.txt @@ -0,0 +1,10 @@ +Custom omegaconf functions +========================== + +Resolvers to handle special fields in our configs as well as the expansion/completion of +the dataset section. + +.. automodule:: metatrain.utils.omegaconf + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/utils/output_gradient.rst.txt b/latest/_sources/dev-docs/utils/output_gradient.rst.txt new file mode 100644 index 000000000..c3f81e764 --- /dev/null +++ b/latest/_sources/dev-docs/utils/output_gradient.rst.txt @@ -0,0 +1,7 @@ +Output gradient +############### + +.. automodule:: metatrain.utils.output_gradient + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/utils/per_atom.rst.txt b/latest/_sources/dev-docs/utils/per_atom.rst.txt new file mode 100644 index 000000000..0a7547c28 --- /dev/null +++ b/latest/_sources/dev-docs/utils/per_atom.rst.txt @@ -0,0 +1,7 @@ +Averaging predictions per atom +############################## + +.. automodule:: metatrain.utils.per_atom + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/dev-docs/utils/units.rst.txt b/latest/_sources/dev-docs/utils/units.rst.txt new file mode 100644 index 000000000..69488d0f6 --- /dev/null +++ b/latest/_sources/dev-docs/utils/units.rst.txt @@ -0,0 +1,7 @@ +Unit handling +############# + +.. automodule:: metatrain.utils.units + :members: + :undoc-members: + :show-inheritance: diff --git a/latest/_sources/examples/ase/run_ase.rst.txt b/latest/_sources/examples/ase/run_ase.rst.txt new file mode 100644 index 000000000..18c6823c7 --- /dev/null +++ b/latest/_sources/examples/ase/run_ase.rst.txt @@ -0,0 +1,50473 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "examples/ase/run_ase.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_examples_ase_run_ase.py: + + +Running molecular dynamics with ASE +=================================== + +This tutorial demonstrates how to use an already trained and exported model to run an +ASE simulation of a single ethanol molecule in vacuum. We use a model that was trained +using the :ref:`architecture-soap-bpnn` architecture on 100 ethanol systems +containing energies and forces. You can obtain the :download:`dataset file +` used in this example from our website. The dataset is a +subset of the `rMD17 dataset +`_. + +The model was trained using the following training options. + +.. literalinclude:: options.yaml + :language: yaml + +You can use the pretrained and exported :download:`model ` +or train the model yourself with + +.. literalinclude:: train.sh + :language: bash + +A detailed step-by-step introduction on how to train a model is provided in +the :ref:`label_basic_usage` tutorial. + +.. GENERATED FROM PYTHON SOURCE LINES 29-31 + +First, we start by importing the necessary libraries, including the integration of ASE +calculators for metatensor atomistic models. + +.. GENERATED FROM PYTHON SOURCE LINES 32-44 + +.. code-block:: Python + + + + import ase.md + import ase.md.velocitydistribution + import ase.units + import ase.visualize.plot + import matplotlib.pyplot as plt + import numpy as np + from ase.geometry.analysis import Analysis + from metatensor.torch.atomistic.ase_calculator import MetatensorCalculator + + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 45-55 + +.. note:: + We have to import ``rascaline.torch`` even though it is not used explicitly in this + tutorial. The SOAP-BPNN model contains compiled extensions and therefore the import + is required. + +Setting up the simulation +------------------------- + +Next, we initialize the simulation by extracting the initial positions from the +dataset file which we initially trained the model on. + +.. GENERATED FROM PYTHON SOURCE LINES 56-60 + +.. code-block:: Python + + + train_frames = ase.io.read("ethanol_reduced_100.xyz", ":") + atoms = train_frames[0].copy() + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 61-62 + +Below we show the initial configuration of a single ethanol molecule in vacuum. + +.. GENERATED FROM PYTHON SOURCE LINES 63-72 + +.. code-block:: Python + + + ase.visualize.plot.plot_atoms(atoms) + + plt.xlabel("Å") + plt.ylabel("Å") + + plt.show() + + + + + +.. image-sg:: /examples/ase/images/sphx_glr_run_ase_001.png + :alt: run ase + :srcset: /examples/ase/images/sphx_glr_run_ase_001.png + :class: sphx-glr-single-img + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 73-75 + +Our initial coordinates do not include velocities. We initialize the velocities +according to a Maxwell-Boltzmann Distribution at 300 K. + +.. GENERATED FROM PYTHON SOURCE LINES 76-79 + +.. code-block:: Python + + + ase.md.velocitydistribution.MaxwellBoltzmannDistribution(atoms, temperature_K=300) + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 80-82 + +We now register our exported model as the energy calculator to obtain energies and +forces. + +.. GENERATED FROM PYTHON SOURCE LINES 83-86 + +.. code-block:: Python + + + atoms.calc = MetatensorCalculator("model.pt", extensions_directory="extensions/") + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + the model suggested to use CUDA devices before CPU, but we are unable to find it + + + + +.. GENERATED FROM PYTHON SOURCE LINES 87-89 + +Finally, we define the integrator which we use to obtain new positions and velocities +based on our energy calculator. We use a common timestep of 0.5 fs. + +.. GENERATED FROM PYTHON SOURCE LINES 90-94 + +.. code-block:: Python + + + integrator = ase.md.VelocityVerlet(atoms, timestep=0.5 * ase.units.fs) + + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 95-104 + +Run the simulation +------------------ + +We now have everything ready to run the MD simulation at constant energy (NVE). To +keep the execution time of this tutorial small we run the simulations only for 100 +steps. If you want to run a longer simulation you can increase the ``n_steps`` +variable. + +During the simulation loop we collect data about the simulation for later analysis. + +.. GENERATED FROM PYTHON SOURCE LINES 105-123 + +.. code-block:: Python + + + + n_steps = 100 + + potential_energy = np.zeros(n_steps) + kinetic_energy = np.zeros(n_steps) + total_energy = np.zeros(n_steps) + trajectory = [] + + for step in range(n_steps): + # run a single simulation step + integrator.run(1) + + trajectory.append(atoms.copy()) + potential_energy[step] = atoms.get_potential_energy() + kinetic_energy[step] = atoms.get_kinetic_energy() + total_energy[step] = atoms.get_total_energy() + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 124-135 + +Analyse the results +------------------- + +Energy conservation +################### + +For a first analysis, we plot the evolution of the mean of the kinetic, potential, and +total energy which is an important measure for the stability of a simulation. + +As shown below we see that both the kinetic, potential, and total energy +fluctuate but the total energy is conserved over the length of the simulation. + +.. GENERATED FROM PYTHON SOURCE LINES 136-148 + +.. code-block:: Python + + + + plt.plot(potential_energy - potential_energy.mean(), label="potential energy") + plt.plot(kinetic_energy - kinetic_energy.mean(), label="kinetic energy") + plt.plot(total_energy - total_energy.mean(), label="total energy") + + plt.xlabel("step") + plt.ylabel("energy / kcal/mol") + plt.legend() + + plt.show() + + + + +.. image-sg:: /examples/ase/images/sphx_glr_run_ase_002.png + :alt: run ase + :srcset: /examples/ase/images/sphx_glr_run_ase_002.png + :class: sphx-glr-single-img + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 149-154 + +Inspect the systems +################### + +Even though the total energy is conserved, we also have to verify that the ethanol +molecule is stable and the bonds did not break. + +.. GENERATED FROM PYTHON SOURCE LINES 155-159 + +.. code-block:: Python + + + animation = ase.visualize.plot.animate(trajectory, interval=100, save_count=None) + plt.show() + + + + +.. container:: sphx-glr-animation + + .. raw:: html + + + + + + + +
+ +
+ +
+ + + + + + + + + +
+
+ + + + + + +
+
+
+ + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 160-168 + +Carbon-hydrogen radial distribution function +############################################ + +As a final analysis we also calculate and plot the carbon-hydrogen radial distribution +function (RDF) from the trajectory and compare this to the RDF from the training set. + +To use the RDF code from ase we first have to define a unit cell for our systems. +We choose a cubic one with a side length of 10 Å. + +.. GENERATED FROM PYTHON SOURCE LINES 169-178 + +.. code-block:: Python + + + for atoms in train_frames: + atoms.cell = 10 * np.ones(3) + atoms.pbc = True + + for atoms in trajectory: + atoms.cell = 10 * np.ones(3) + atoms.pbc = True + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 179-182 + +We now can initilize the :py:class:`ase.geometry.analysis.Analysis` objects and +compute the the RDF using the :py:meth:`ase.geometry.analysis.Analysis.get_rdf` +method. + +.. GENERATED FROM PYTHON SOURCE LINES 183-190 + +.. code-block:: Python + + + ana_traj = Analysis(trajectory) + ana_train = Analysis(train_frames) + + rdf_traj = ana_traj.get_rdf(rmax=5, nbins=50, elements=["C", "H"], return_dists=True) + rdf_train = ana_train.get_rdf(rmax=5, nbins=50, elements=["C", "H"], return_dists=True) + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 191-193 + +We extract the bin positions from the returned values and and averege the RDF over the +whole trajectory and dataset, respectively. + +.. GENERATED FROM PYTHON SOURCE LINES 194-199 + +.. code-block:: Python + + + bins = rdf_traj[0][1] + rdf_traj_mean = np.mean([rdf_traj[i][0] for i in range(n_steps)], axis=0) + rdf_train_mean = np.mean([rdf_train[i][0] for i in range(n_steps)], axis=0) + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 200-202 + +Plotting the RDF verifies that the hydrogen bonds are stable, confirming that we +performed an energy-conserving and stable simulation. + +.. GENERATED FROM PYTHON SOURCE LINES 203-212 + +.. code-block:: Python + + + plt.plot(bins, rdf_traj_mean, label="trajectory") + plt.plot(bins, rdf_train_mean, label="training set") + + plt.legend() + plt.xlabel("r / Å") + plt.ylabel("radial distribution function") + + plt.show() + + + +.. image-sg:: /examples/ase/images/sphx_glr_run_ase_004.png + :alt: run ase + :srcset: /examples/ase/images/sphx_glr_run_ase_004.png + :class: sphx-glr-single-img + + + + + + +.. rst-class:: sphx-glr-timing + + **Total running time of the script:** (0 minutes 24.339 seconds) + + +.. _sphx_glr_download_examples_ase_run_ase.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: run_ase.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: run_ase.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/latest/_sources/examples/ase/sg_execution_times.rst.txt b/latest/_sources/examples/ase/sg_execution_times.rst.txt new file mode 100644 index 000000000..322951053 --- /dev/null +++ b/latest/_sources/examples/ase/sg_execution_times.rst.txt @@ -0,0 +1,37 @@ + +:orphan: + +.. _sphx_glr_examples_ase_sg_execution_times: + + +Computation times +================= +**00:24.339** total execution time for 1 file **from examples/ase**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_examples_ase_run_ase.py` (``run_ase.py``) + - 00:24.339 + - 0.0 diff --git a/latest/_sources/getting-started/advanced_base_config.rst.txt b/latest/_sources/getting-started/advanced_base_config.rst.txt new file mode 100644 index 000000000..e8381b71f --- /dev/null +++ b/latest/_sources/getting-started/advanced_base_config.rst.txt @@ -0,0 +1,20 @@ +.. _advanced_base_conf: + +Advanced Base Configuration +=========================== + +Here, we show how some advanced base properties in the ``options.yaml`` can +be adjusted. They should be written without indentation in the ``options.yaml`` file. + +:param device: The device in which the training should be run. Takes two possible + values: ``cpu`` and ``gpu``. Default: ``cpu`` +:param base_precision: Override the base precision of all floats during training. By + default an optimal precision is obtained from the architecture. Changing this will + have an effect on the memory consumption during training and maybe also on the + accuracy of the model. Possible values: ``64``, ``32`` or ``16``. +:param seed: Seed used to start the training. Set all the seeds of ``numpy.random``, + ``random``, ``torch`` and ``torch.cuda`` (if available) to the same value ``seed``. + If ``seed`` is not the initial seed will be set to a random number. This initial + seed will be reported in the output folder + +In the next tutorials we show how to override the default parameters of an architecture. diff --git a/latest/_sources/getting-started/checkpoints.rst.txt b/latest/_sources/getting-started/checkpoints.rst.txt new file mode 100644 index 000000000..7e4a30e93 --- /dev/null +++ b/latest/_sources/getting-started/checkpoints.rst.txt @@ -0,0 +1,44 @@ +Checkpoints +########### + +During their training process, models will produce checkpoints. These have the ``.ckpt`` +extension, as opposed to the ``.pt`` extension of exported models. A final checkpoint +will always be saved together with its corresponding exported model at the end of +training. For example, if the final model is saved as ``model.pt``, a ``model.ckpt`` +will also be saved. In addition, checkpoints are saved at regular intervals during +training. These can be found in the ``outputs`` directory. + +While exported models are used for inference, the main use of checkpoints is to resume +training from a certain point. This is useful if you want to continue training a model +after it has been interrupted, or if you want to fine-tune a model on a new dataset. + +The sub-command to continue training from a checkpoint is + +.. code-block:: bash + + mtt train options.yaml --continue model.ckpt + +or + +.. code-block:: bash + + mtt train options.yaml -c model.ckpt + +Checkpoints can also be turned into exported models using the ``export`` sub-command. + +.. code-block:: bash + + mtt export model.ckpt -o model.pt + +or + +.. code-block:: bash + + mtt export model.ckpt --output model.pt + +Keep in mind that a checkpoint (``.ckpt``) is only a temporary file, which can have +several dependencies and may become unusable if the corresponding architecture is +updated. In constrast, exported models (``.pt``) act as standalone files. +For long-term usage, you should export your model! Exporting a model is also necessary +if you want to use it in other frameworks, especially in molecular simulations +(see the :ref:`tutorials`). diff --git a/latest/_sources/getting-started/custom_dataset_conf.rst.txt b/latest/_sources/getting-started/custom_dataset_conf.rst.txt new file mode 100644 index 000000000..1102c7362 --- /dev/null +++ b/latest/_sources/getting-started/custom_dataset_conf.rst.txt @@ -0,0 +1,184 @@ +.. _dataset_conf: + +Customize a Dataset Configuration +================================= +Overview +-------- +The main task in setting up a training procedure with `metatrain` is to provide +files for training, validation, and testing datasets. Our system allows flexibility in +parsing data for training. Mandatory sections in the `options.yaml` file include: + +- ``training_set`` +- ``test_set`` +- ``validation_set`` + +Each section can follow a similar system, with shorthand methods available to +simplify dataset definitions. + +Minimal Configuration Example +----------------------------- +Below is the simplest form of these sections: + +.. code-block:: yaml + + training_set: "dataset.xyz" + test_set: 0.1 + validation_set: 0.1 + +This configuration parses all information from ``dataset.xyz``, with 20% of the training +set randomly selected for testing and validation (10% each). + +Expanded Configuration Format +----------------------------- +The train script automatically expands the ``training_set`` section into the following +format, which is also valid for initial input: + +.. code-block:: yaml + + training_set: + systems: + read_from: dataset.xyz + file_format: .xyz + length_unit: null + targets: + energy: + quantity: energy + read_from: dataset.xyz + file_format: .xyz + key: energy + unit: null + forces: + read_from: dataset.xyz + file_format: .xyz + key: forces + stress: + read_from: dataset.xyz + file_format: .xyz + key: stress + virial: false + test_set: 0.1 + validation_set: 0.1 + +Understanding the YAML Block +---------------------------- +The ``training_set`` is divided into sections ``systems`` and ``targets``: + +Systems Section +^^^^^^^^^^^^^^^ +Describes the system data like positions and cell information. + +:param read_from: The file containing system data. +:param file_format: The file format, guessed from the suffix if ``null`` or not + provided. +:param length_unit: The unit of lengths, optional but highly recommended for running + simulations. + +A single string in this section automatically expands, using the string as the +``read_from`` parameter. + +.. note:: + + `metatrain` does not convert units during training or evaluation. Units are + only required if model should be used to run MD simulations. + +Targets Section +^^^^^^^^^^^^^^^ +Allows defining multiple target sections, each with a unique name. + +- Commonly, a section named ``energy`` should be defined, which is essential for running + molecular dynamics simulations. For the ``energy`` section gradients like `forces` and + `stress` are enabled by default. +- Other target sections can also be defined, as long as they are prefixed by ``mtt::``. + For example, ``mtt::free_energy``. In general, all targets that are not standard + outputs of ``metatensor.torch.atomistic`` (see + https://docs.metatensor.org/latest/atomistic/outputs.html) should be prefixed by + ``mtt::``. + +Target section parameters include: + +:param quantity: The target's quantity (e.g., ``energy``, ``dipole``). Currently only + ``energy`` is supported. +:param read_from: The file for target data, defaults to the ``systems.read_from`` + file if not provided. +:param file_format: The file format, guessed from the suffix if not provided. +:param key: The key for reading from the file, defaulting to the target section's name + if not provided. +:param unit: The unit of the target, optional but highly recommended for running + simulations. +:param forces: Gradient sections. See :ref:`gradient-section` for parameters. +:param stress: Gradient sections. See :ref:`gradient-section` for parameters. +:param virial: Gradient sections. See :ref:`gradient-section` for parameters. + +A single string in a target section automatically expands, using the string as the +``read_from`` parameter. + +.. _gradient-section: + +Gradient Section +^^^^^^^^^^^^^^^^ +Each gradient section (like ``forces`` or ``stress``) has similar parameters: + +:param read_from: The file for gradient data. +:param file_format: The file format, guessed from the suffix if not provided. +:param key: The key for reading from the file. + +Sections set to ``true`` or ``on`` automatically expand with default parameters. A +warning is raised if requisite data for a gradient is missing, but training proceeds +without them. + +.. note:: + + Unknown keys are ignored and not deleted in all sections during dataset parsing. + +Multiple Datasets +----------------- +For some applications, it is required to provide more than one dataset for model +training. `metatrain` supports stacking several datasets together using the +``YAML`` list syntax, which consists of lines beginning at the same indentation level +starting with a ``"- "`` (a dash and a space) + + +.. code-block:: yaml + + training_set: + - systems: + read_from: dataset_0.xyz + length_unit: angstrom + targets: + energy: + quantity: energy + key: my_energy_label0 + unit: eV + - systems: + read_from: dataset_1.xyz + length_unit: angstrom + targets: + energy: + quantity: energy + key: my_energy_label1 + unit: eV + free-energy: + quantity: energy + key: my_free_energy + unit: hartree + test_set: 0.1 + validation_set: 0.1 + +The required test and validation splits are performed consistently for each element +element in ``training_set`` + +The ``length_unit`` has to be the same for each element of the list. If target section +names are the same for different elements of the list, their unit also has to be the +same. In the the example above the target section ``energy`` exists in both list +elements and therefore has the the same unit ``eV``. The target section ``free-energy`` +only exists in the second element and its unit does not have to be the same as in the +first element of the list. + +.. warning:: + + Even though parsing several datasets is supported by the library, it may not + work with every architecture. Check your :ref:`desired architecture + ` if they **support multiple datasets**. + +In the next tutorials we explain and show how to set some advanced global training +parameters. diff --git a/latest/_sources/getting-started/index.rst.txt b/latest/_sources/getting-started/index.rst.txt new file mode 100644 index 000000000..6e386f774 --- /dev/null +++ b/latest/_sources/getting-started/index.rst.txt @@ -0,0 +1,15 @@ +Getting started +=============== + +This sections describes how to install the package, and its most basic commands. + +.. toctree:: + :maxdepth: 1 + + installation + usage + custom_dataset_conf + advanced_base_config + override + checkpoints + units diff --git a/latest/_sources/getting-started/installation.rst.txt b/latest/_sources/getting-started/installation.rst.txt new file mode 100644 index 000000000..95332be0c --- /dev/null +++ b/latest/_sources/getting-started/installation.rst.txt @@ -0,0 +1,5 @@ +.. _label_installation: + +.. include:: ../../../README.rst + :start-after: marker-installation + :end-before: marker-issues diff --git a/latest/_sources/getting-started/override.rst.txt b/latest/_sources/getting-started/override.rst.txt new file mode 100644 index 000000000..45a9f36d0 --- /dev/null +++ b/latest/_sources/getting-started/override.rst.txt @@ -0,0 +1,64 @@ +Override Architecture's Default Parameters +========================================== + +In our initial tutorial, we used default parameters to train a model employing the +SOAP-BPNN architecture, as shown in the following config: + +.. literalinclude:: ../../static/qm9/options.yaml + :language: yaml + +While default parameters often serve as a good starting point, depending on your +training target and dataset, it might be necessary to adjust the architecture's +parameters. + +First, familiarize yourself with the specific parameters of the architecture you intend +to use. We provide a list of all architectures and their parameters in the +:ref:`available-architectures` section. For example, the parameters of the SOAP-BPNN +models are detailed at :ref:`architecture-soap-bpnn`. + +Modifying Parameters (yaml) +--------------------------- + +As an example, let's increase the number of epochs (``num_epochs``) and the ``cutoff`` +radius of the SOAP descriptor. To do this, create a new section in the ``options.yaml`` +named ``architecture``. Within this section, you can override the architecture's +hyperparameters. The adjustments for ``num_epochs`` and ``cutoff`` look like this: + +.. code-block:: yaml + + architecture: + name: "soap_bpnn" + model: + soap: + cutoff: 7.0 + training: + num_epochs: 200 + + training_set: + systems: "qm9_reduced_100.xyz" + targets: + energy: + key: "U0" + + test_set: 0.1 + validation_set: 0.1 + +Modifying Parameters (Command Line Overrides) +--------------------------------------------- + +For quick adjustments or additions to an options file, command-line overrides are also +possibility. The changes above can be achieved by typing: + +.. code-block:: bash + + mtt train options.yaml \ + -r architecture.model.soap.cutoff=7.0 architecture.training.num_epochs=200 + +Here, the ``-r`` or equivalent ``--override`` flag is used to parse the override flags. +The syntax follows a dotlist-style string format where each level of the options is +seperated by a ``.``. For example to use single precision as the base precision for your +training use ``-r base_precision=32`` + +.. note:: + Command line overrides allow adding new values to your training parameters and + override the architectures as well as the parameters of your provided options file. diff --git a/latest/_sources/getting-started/units.rst.txt b/latest/_sources/getting-started/units.rst.txt new file mode 100644 index 000000000..a232991ab --- /dev/null +++ b/latest/_sources/getting-started/units.rst.txt @@ -0,0 +1,12 @@ +Units +===== + +``metatrain`` will always work with the units as provided by the user, and all logs will +be in the same units. In other terms, ``metatrain`` does not perform any unit +conversion. The only exception is the logging of energies in ``meV`` if the energies are +declared to be in ``eV``, for consistency with common practice and other codes. + +Although not mandatory, the user is encouraged to specify the units of their datasets +in the input files, so that the logs can be more informative and, more importantly, in +order to make the resulting exported models usable in simulation engines (which instead +require the units to be specified) without unpleasant surprises. diff --git a/latest/_sources/getting-started/usage.rst.txt b/latest/_sources/getting-started/usage.rst.txt new file mode 100644 index 000000000..483e20fea --- /dev/null +++ b/latest/_sources/getting-started/usage.rst.txt @@ -0,0 +1,88 @@ +.. _label_basic_usage: + +Basic Usage +=========== + +``metatrain`` is designed for a direct usage from the command line (cli). The program is +registered via the abbreviation ``mtt`` to your command line. The general help of +``metatrain`` can be accessed using + +.. code-block:: bash + + mtt --help + +We now demonstrate how to `train` and `evaluate` a model from the command line. For this +example we use the :ref:`architecture-soap-bpnn` architecture and a subset of the `QM9 +dataset `_. You can obtain the reduced dataset +from our :download:`website <../../static/qm9/qm9_reduced_100.xyz>`. + +Training +######## + +To train models, `metatrain` uses a dynamic override strategy for your training +options. We allow a dynamical composition and override of the default architecture with +either your custom ``options.yaml`` and even command line override grammar. For +reference and reproducibility purposes `metatrain` always writes the fully +expanded, including the overwritten option to ``options_restart.yaml``. The restart +options file is written into a subfolder named with the current `date` and `time` inside +the ``output`` directory of your current training run. + +The sub-command to start a model training is + +.. code-block:: bash + + mtt train + +To train a model you have to define your options. This includes the specific +architecture you want to use and the data including the training systems and target +values + +The default model and training hyperparameter for each model are listed in their +corresponding documentation page. We will use these minimal options to run an example +training using the default hyperparameters of an SOAP BPNN model + +.. literalinclude:: ../../static/qm9/options.yaml + :language: yaml + +For each training run a new output directory in the format +``output/YYYY-MM-DD/HH-MM-SS`` based on the current `date` and `time` is created. We use +this output directory to store checkpoints, the ``train.log`` log file as well the +restart ``options_restart.yaml`` file. To start the training create an ``options.yaml`` +file in the current directory and type + +.. literalinclude:: ../../../examples/basic_usage/usage.sh + :language: bash + :lines: 3-8 + + +Evaluation +########## + +The sub-command to evaluate an already trained model is + +.. code-block:: bash + + mtt eval + +Besides the trained `model`, you will also have to provide a file containing the +system and possible target values for evaluation. The system of this ``eval.yaml`` +is exactly the same as for a dataset in the ``options.yaml`` file. + +.. literalinclude:: ../../static/qm9/eval.yaml + :language: yaml + +Note that the ``targets`` section is optional. If the ``targets`` section is present, +the function will calculate and report RMSE values of the predictions with respect to +the real values as loaded from the ``targets`` section. You can run an evaluation by +typing + +.. literalinclude:: ../../../examples/basic_usage/usage.sh + :language: bash + :lines: 9-24 + + +Molecular simulations +##################### + +The trained model can also be used to run molecular simulations. +You can find how in the :ref:`tutorials` section. diff --git a/latest/_sources/index.rst.txt b/latest/_sources/index.rst.txt new file mode 100644 index 000000000..1695b0418 --- /dev/null +++ b/latest/_sources/index.rst.txt @@ -0,0 +1,16 @@ +Welcome to metatrain! +===================== + +.. include:: ../../README.rst + :start-after: marker-introduction + :end-before: marker-documentation + +.. toctree:: + :maxdepth: 1 + :hidden: + + getting-started/index + tutorials/index + architectures/index + advanced-concepts/index + dev-docs/index diff --git a/latest/_sources/tutorials/index.rst.txt b/latest/_sources/tutorials/index.rst.txt new file mode 100644 index 000000000..2f1778133 --- /dev/null +++ b/latest/_sources/tutorials/index.rst.txt @@ -0,0 +1,12 @@ +.. _tutorials: + +Tutorials +========= + +This sections includes some more advanced tutorials on the usage of the +``metatrain`` package. + +.. toctree:: + :maxdepth: 1 + + ../examples/ase/run_ase diff --git a/latest/_static/basic.css b/latest/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/latest/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/latest/_static/binder_badge_logo.svg b/latest/_static/binder_badge_logo.svg new file mode 100644 index 000000000..327f6b639 --- /dev/null +++ b/latest/_static/binder_badge_logo.svg @@ -0,0 +1 @@ + launchlaunchbinderbinder \ No newline at end of file diff --git a/latest/_static/broken_example.png b/latest/_static/broken_example.png new file mode 100644 index 000000000..4fea24e7d Binary files /dev/null and b/latest/_static/broken_example.png differ diff --git a/latest/_static/debug.css b/latest/_static/debug.css new file mode 100644 index 000000000..74d4aec33 --- /dev/null +++ b/latest/_static/debug.css @@ -0,0 +1,69 @@ +/* + This CSS file should be overridden by the theme authors. It's + meant for debugging and developing the skeleton that this theme provides. +*/ +body { + font-family: -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, + "Apple Color Emoji", "Segoe UI Emoji"; + background: lavender; +} +.sb-announcement { + background: rgb(131, 131, 131); +} +.sb-announcement__inner { + background: black; + color: white; +} +.sb-header { + background: lightskyblue; +} +.sb-header__inner { + background: royalblue; + color: white; +} +.sb-header-secondary { + background: lightcyan; +} +.sb-header-secondary__inner { + background: cornflowerblue; + color: white; +} +.sb-sidebar-primary { + background: lightgreen; +} +.sb-main { + background: blanchedalmond; +} +.sb-main__inner { + background: antiquewhite; +} +.sb-header-article { + background: lightsteelblue; +} +.sb-article-container { + background: snow; +} +.sb-article-main { + background: white; +} +.sb-footer-article { + background: lightpink; +} +.sb-sidebar-secondary { + background: lightgoldenrodyellow; +} +.sb-footer-content { + background: plum; +} +.sb-footer-content__inner { + background: palevioletred; +} +.sb-footer { + background: pink; +} +.sb-footer__inner { + background: salmon; +} +.sb-article { + background: white; +} diff --git a/latest/_static/doctools.js b/latest/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/latest/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/latest/_static/documentation_options.js b/latest/_static/documentation_options.js new file mode 100644 index 000000000..5251cbfac --- /dev/null +++ b/latest/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '2023.11.29', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/latest/_static/file.png b/latest/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/latest/_static/file.png differ diff --git a/latest/_static/jupyterlite_badge_logo.svg b/latest/_static/jupyterlite_badge_logo.svg new file mode 100644 index 000000000..5de36d7fd --- /dev/null +++ b/latest/_static/jupyterlite_badge_logo.svg @@ -0,0 +1,3 @@ + + +launchlaunchlitelite \ No newline at end of file diff --git a/latest/_static/language_data.js b/latest/_static/language_data.js new file mode 100644 index 000000000..367b8ed81 --- /dev/null +++ b/latest/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/latest/_static/minus.png b/latest/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/latest/_static/minus.png differ diff --git a/latest/_static/no_image.png b/latest/_static/no_image.png new file mode 100644 index 000000000..8c2d48d5d Binary files /dev/null and b/latest/_static/no_image.png differ diff --git a/latest/_static/plus.png b/latest/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/latest/_static/plus.png differ diff --git a/latest/_static/pygments.css b/latest/_static/pygments.css new file mode 100644 index 000000000..02b4b1281 --- /dev/null +++ b/latest/_static/pygments.css @@ -0,0 +1,258 @@ +.highlight pre { line-height: 125%; } +.highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +.highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +.highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #8f5902; font-style: italic } /* Comment */ +.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ +.highlight .g { color: #000000 } /* Generic */ +.highlight .k { color: #204a87; font-weight: bold } /* Keyword */ +.highlight .l { color: #000000 } /* Literal */ +.highlight .n { color: #000000 } /* Name */ +.highlight .o { color: #ce5c00; font-weight: bold } /* Operator */ +.highlight .x { color: #000000 } /* Other */ +.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ +.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8f5902; font-style: italic } /* Comment.Preproc */ +.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #a40000 } /* Generic.Deleted */ +.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #000000; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #ef2929 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #000000; font-style: italic } /* Generic.Output */ +.highlight .gp { color: #8f5902 } /* Generic.Prompt */ +.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ +.highlight .kc { color: #204a87; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #204a87; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #204a87; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #204a87; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #204a87; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #204a87; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #000000 } /* Literal.Date */ +.highlight .m { color: #0000cf; font-weight: bold } /* Literal.Number */ +.highlight .s { color: #4e9a06 } /* Literal.String */ +.highlight .na { color: #c4a000 } /* Name.Attribute */ +.highlight .nb { color: #204a87 } /* Name.Builtin */ +.highlight .nc { color: #000000 } /* Name.Class */ +.highlight .no { color: #000000 } /* Name.Constant */ +.highlight .nd { color: #5c35cc; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #ce5c00 } /* Name.Entity */ +.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000000 } /* Name.Function */ +.highlight .nl { color: #f57900 } /* Name.Label */ +.highlight .nn { color: #000000 } /* Name.Namespace */ +.highlight .nx { color: #000000 } /* Name.Other */ +.highlight .py { color: #000000 } /* Name.Property */ +.highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000000 } /* Name.Variable */ +.highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #f8f8f8 } /* Text.Whitespace */ +.highlight .mb { color: #0000cf; font-weight: bold } /* Literal.Number.Bin */ +.highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */ +.highlight .mh { color: #0000cf; font-weight: bold } /* Literal.Number.Hex */ +.highlight .mi { color: #0000cf; font-weight: bold } /* Literal.Number.Integer */ +.highlight .mo { color: #0000cf; font-weight: bold } /* Literal.Number.Oct */ +.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ +.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ +.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ +.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ +.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ +.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ +.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ +.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #000000 } /* Name.Function.Magic */ +.highlight .vc { color: #000000 } /* Name.Variable.Class */ +.highlight .vg { color: #000000 } /* Name.Variable.Global */ +.highlight .vi { color: #000000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000000 } /* Name.Variable.Magic */ +.highlight .il { color: #0000cf; font-weight: bold } /* Literal.Number.Integer.Long */ +@media not print { +body[data-theme="dark"] .highlight pre { line-height: 125%; } +body[data-theme="dark"] .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight span.linenos { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight .hll { background-color: #404040 } +body[data-theme="dark"] .highlight { background: #202020; color: #d0d0d0 } +body[data-theme="dark"] .highlight .c { color: #ababab; font-style: italic } /* Comment */ +body[data-theme="dark"] .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +body[data-theme="dark"] .highlight .esc { color: #d0d0d0 } /* Escape */ +body[data-theme="dark"] .highlight .g { color: #d0d0d0 } /* Generic */ +body[data-theme="dark"] .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */ +body[data-theme="dark"] .highlight .l { color: #d0d0d0 } /* Literal */ +body[data-theme="dark"] .highlight .n { color: #d0d0d0 } /* Name */ +body[data-theme="dark"] .highlight .o { color: #d0d0d0 } /* Operator */ +body[data-theme="dark"] .highlight .x { color: #d0d0d0 } /* Other */ +body[data-theme="dark"] .highlight .p { color: #d0d0d0 } /* Punctuation */ +body[data-theme="dark"] .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ +body[data-theme="dark"] .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ +body[data-theme="dark"] .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */ +body[data-theme="dark"] .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ +body[data-theme="dark"] .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ +body[data-theme="dark"] .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ +body[data-theme="dark"] .highlight .gd { color: #ff3a3a } /* Generic.Deleted */ +body[data-theme="dark"] .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ +body[data-theme="dark"] .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +body[data-theme="dark"] .highlight .gr { color: #ff3a3a } /* Generic.Error */ +body[data-theme="dark"] .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */ +body[data-theme="dark"] .highlight .gi { color: #589819 } /* Generic.Inserted */ +body[data-theme="dark"] .highlight .go { color: #cccccc } /* Generic.Output */ +body[data-theme="dark"] .highlight .gp { color: #aaaaaa } /* Generic.Prompt */ +body[data-theme="dark"] .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ +body[data-theme="dark"] .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ +body[data-theme="dark"] .highlight .gt { color: #ff3a3a } /* Generic.Traceback */ +body[data-theme="dark"] .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */ +body[data-theme="dark"] .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */ +body[data-theme="dark"] .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */ +body[data-theme="dark"] .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */ +body[data-theme="dark"] .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */ +body[data-theme="dark"] .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */ +body[data-theme="dark"] .highlight .ld { color: #d0d0d0 } /* Literal.Date */ +body[data-theme="dark"] .highlight .m { color: #51b2fd } /* Literal.Number */ +body[data-theme="dark"] .highlight .s { color: #ed9d13 } /* Literal.String */ +body[data-theme="dark"] .highlight .na { color: #bbbbbb } /* Name.Attribute */ +body[data-theme="dark"] .highlight .nb { color: #2fbccd } /* Name.Builtin */ +body[data-theme="dark"] .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */ +body[data-theme="dark"] .highlight .no { color: #40ffff } /* Name.Constant */ +body[data-theme="dark"] .highlight .nd { color: #ffa500 } /* Name.Decorator */ +body[data-theme="dark"] .highlight .ni { color: #d0d0d0 } /* Name.Entity */ +body[data-theme="dark"] .highlight .ne { color: #bbbbbb } /* Name.Exception */ +body[data-theme="dark"] .highlight .nf { color: #71adff } /* Name.Function */ +body[data-theme="dark"] .highlight .nl { color: #d0d0d0 } /* Name.Label */ +body[data-theme="dark"] .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */ +body[data-theme="dark"] .highlight .nx { color: #d0d0d0 } /* Name.Other */ +body[data-theme="dark"] .highlight .py { color: #d0d0d0 } /* Name.Property */ +body[data-theme="dark"] .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */ +body[data-theme="dark"] .highlight .nv { color: #40ffff } /* Name.Variable */ +body[data-theme="dark"] .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */ +body[data-theme="dark"] .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */ +body[data-theme="dark"] .highlight .w { color: #666666 } /* Text.Whitespace */ +body[data-theme="dark"] .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */ +body[data-theme="dark"] .highlight .mf { color: #51b2fd } /* Literal.Number.Float */ +body[data-theme="dark"] .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */ +body[data-theme="dark"] .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */ +body[data-theme="dark"] .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */ +body[data-theme="dark"] .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */ +body[data-theme="dark"] .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ +body[data-theme="dark"] .highlight .sc { color: #ed9d13 } /* Literal.String.Char */ +body[data-theme="dark"] .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */ +body[data-theme="dark"] .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */ +body[data-theme="dark"] .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */ +body[data-theme="dark"] .highlight .se { color: #ed9d13 } /* Literal.String.Escape */ +body[data-theme="dark"] .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */ +body[data-theme="dark"] .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */ +body[data-theme="dark"] .highlight .sx { color: #ffa500 } /* Literal.String.Other */ +body[data-theme="dark"] .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ +body[data-theme="dark"] .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ +body[data-theme="dark"] .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ +body[data-theme="dark"] .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */ +body[data-theme="dark"] .highlight .fm { color: #71adff } /* Name.Function.Magic */ +body[data-theme="dark"] .highlight .vc { color: #40ffff } /* Name.Variable.Class */ +body[data-theme="dark"] .highlight .vg { color: #40ffff } /* Name.Variable.Global */ +body[data-theme="dark"] .highlight .vi { color: #40ffff } /* Name.Variable.Instance */ +body[data-theme="dark"] .highlight .vm { color: #40ffff } /* Name.Variable.Magic */ +body[data-theme="dark"] .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */ +@media (prefers-color-scheme: dark) { +body:not([data-theme="light"]) .highlight pre { line-height: 125%; } +body:not([data-theme="light"]) .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight span.linenos { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight .hll { background-color: #404040 } +body:not([data-theme="light"]) .highlight { background: #202020; color: #d0d0d0 } +body:not([data-theme="light"]) .highlight .c { color: #ababab; font-style: italic } /* Comment */ +body:not([data-theme="light"]) .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +body:not([data-theme="light"]) .highlight .esc { color: #d0d0d0 } /* Escape */ +body:not([data-theme="light"]) .highlight .g { color: #d0d0d0 } /* Generic */ +body:not([data-theme="light"]) .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */ +body:not([data-theme="light"]) .highlight .l { color: #d0d0d0 } /* Literal */ +body:not([data-theme="light"]) .highlight .n { color: #d0d0d0 } /* Name */ +body:not([data-theme="light"]) .highlight .o { color: #d0d0d0 } /* Operator */ +body:not([data-theme="light"]) .highlight .x { color: #d0d0d0 } /* Other */ +body:not([data-theme="light"]) .highlight .p { color: #d0d0d0 } /* Punctuation */ +body:not([data-theme="light"]) .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ +body:not([data-theme="light"]) .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ +body:not([data-theme="light"]) .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */ +body:not([data-theme="light"]) .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ +body:not([data-theme="light"]) .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ +body:not([data-theme="light"]) .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ +body:not([data-theme="light"]) .highlight .gd { color: #ff3a3a } /* Generic.Deleted */ +body:not([data-theme="light"]) .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ +body:not([data-theme="light"]) .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +body:not([data-theme="light"]) .highlight .gr { color: #ff3a3a } /* Generic.Error */ +body:not([data-theme="light"]) .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */ +body:not([data-theme="light"]) .highlight .gi { color: #589819 } /* Generic.Inserted */ +body:not([data-theme="light"]) .highlight .go { color: #cccccc } /* Generic.Output */ +body:not([data-theme="light"]) .highlight .gp { color: #aaaaaa } /* Generic.Prompt */ +body:not([data-theme="light"]) .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ +body:not([data-theme="light"]) .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ +body:not([data-theme="light"]) .highlight .gt { color: #ff3a3a } /* Generic.Traceback */ +body:not([data-theme="light"]) .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */ +body:not([data-theme="light"]) .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */ +body:not([data-theme="light"]) .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */ +body:not([data-theme="light"]) .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */ +body:not([data-theme="light"]) .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */ +body:not([data-theme="light"]) .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */ +body:not([data-theme="light"]) .highlight .ld { color: #d0d0d0 } /* Literal.Date */ +body:not([data-theme="light"]) .highlight .m { color: #51b2fd } /* Literal.Number */ +body:not([data-theme="light"]) .highlight .s { color: #ed9d13 } /* Literal.String */ +body:not([data-theme="light"]) .highlight .na { color: #bbbbbb } /* Name.Attribute */ +body:not([data-theme="light"]) .highlight .nb { color: #2fbccd } /* Name.Builtin */ +body:not([data-theme="light"]) .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */ +body:not([data-theme="light"]) .highlight .no { color: #40ffff } /* Name.Constant */ +body:not([data-theme="light"]) .highlight .nd { color: #ffa500 } /* Name.Decorator */ +body:not([data-theme="light"]) .highlight .ni { color: #d0d0d0 } /* Name.Entity */ +body:not([data-theme="light"]) .highlight .ne { color: #bbbbbb } /* Name.Exception */ +body:not([data-theme="light"]) .highlight .nf { color: #71adff } /* Name.Function */ +body:not([data-theme="light"]) .highlight .nl { color: #d0d0d0 } /* Name.Label */ +body:not([data-theme="light"]) .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */ +body:not([data-theme="light"]) .highlight .nx { color: #d0d0d0 } /* Name.Other */ +body:not([data-theme="light"]) .highlight .py { color: #d0d0d0 } /* Name.Property */ +body:not([data-theme="light"]) .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */ +body:not([data-theme="light"]) .highlight .nv { color: #40ffff } /* Name.Variable */ +body:not([data-theme="light"]) .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */ +body:not([data-theme="light"]) .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */ +body:not([data-theme="light"]) .highlight .w { color: #666666 } /* Text.Whitespace */ +body:not([data-theme="light"]) .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */ +body:not([data-theme="light"]) .highlight .mf { color: #51b2fd } /* Literal.Number.Float */ +body:not([data-theme="light"]) .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */ +body:not([data-theme="light"]) .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */ +body:not([data-theme="light"]) .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */ +body:not([data-theme="light"]) .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */ +body:not([data-theme="light"]) .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ +body:not([data-theme="light"]) .highlight .sc { color: #ed9d13 } /* Literal.String.Char */ +body:not([data-theme="light"]) .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */ +body:not([data-theme="light"]) .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */ +body:not([data-theme="light"]) .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */ +body:not([data-theme="light"]) .highlight .se { color: #ed9d13 } /* Literal.String.Escape */ +body:not([data-theme="light"]) .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */ +body:not([data-theme="light"]) .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */ +body:not([data-theme="light"]) .highlight .sx { color: #ffa500 } /* Literal.String.Other */ +body:not([data-theme="light"]) .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ +body:not([data-theme="light"]) .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ +body:not([data-theme="light"]) .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ +body:not([data-theme="light"]) .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */ +body:not([data-theme="light"]) .highlight .fm { color: #71adff } /* Name.Function.Magic */ +body:not([data-theme="light"]) .highlight .vc { color: #40ffff } /* Name.Variable.Class */ +body:not([data-theme="light"]) .highlight .vg { color: #40ffff } /* Name.Variable.Global */ +body:not([data-theme="light"]) .highlight .vi { color: #40ffff } /* Name.Variable.Instance */ +body:not([data-theme="light"]) .highlight .vm { color: #40ffff } /* Name.Variable.Magic */ +body:not([data-theme="light"]) .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */ +} +} \ No newline at end of file diff --git a/latest/_static/qm9/eval.yaml b/latest/_static/qm9/eval.yaml new file mode 100644 index 000000000..8cb707614 --- /dev/null +++ b/latest/_static/qm9/eval.yaml @@ -0,0 +1,5 @@ +systems: "qm9_reduced_100.xyz" +targets: + energy: + key: "U0" + unit: "eV" diff --git a/latest/_static/qm9/options.yaml b/latest/_static/qm9/options.yaml new file mode 100644 index 000000000..d6516bfba --- /dev/null +++ b/latest/_static/qm9/options.yaml @@ -0,0 +1,17 @@ +# architecture used to train the model +architecture: + name: experimental.soap_bpnn + training: + num_epochs: 5 # a very short training run + +# Mandatory section defining the parameters for system and target data of the +# training set +training_set: + systems: "qm9_reduced_100.xyz" # file where the positions are stored + targets: + energy: + key: "U0" # name of the target value + unit: "eV" # unit of the target value + +test_set: 0.1 # 10 % of the training_set are randomly split and taken for test set +validation_set: 0.1 # 10 % of the training_set are randomly split and for validation diff --git a/latest/_static/qm9/qm9_reduced_100.xyz b/latest/_static/qm9/qm9_reduced_100.xyz new file mode 100644 index 000000000..14b2a0416 --- /dev/null +++ b/latest/_static/qm9/qm9_reduced_100.xyz @@ -0,0 +1,1201 @@ +5 +Properties=species:S:1:pos:R:3 A=157.7118 B=157.70997 C=157.70699 mu=0 alpha=13.21 epsHOMO=-0.3877 epsLUMO=0.1171 epsgap=0.5048 =35.3641 zpve=0.044749 U0=-40.47893 U=-40.476062 H=-40.475117 G=-40.498597 Cv=6.469 pbc="F F F" +C -0.01269814 1.08580416 0.00800100 +H 0.00215042 -0.00603132 0.00197612 +H 1.01173084 1.46375116 0.00027657 +H -0.54081507 1.44752661 -0.87664372 +H -0.52381363 1.43793264 0.90639729 +4 +Properties=species:S:1:pos:R:3 A=293.60975 B=293.54111 C=191.39397 mu=1.6256 alpha=9.46 epsHOMO=-0.257 epsLUMO=0.0829 epsgap=0.3399 =26.1563 zpve=0.034358 U0=-56.525887 U=-56.523026 H=-56.522082 G=-56.544961 Cv=6.316 pbc="F F F" +N -0.04042605 1.02410775 0.06256380 +H 0.01725746 0.01254521 -0.02737716 +H 0.91578937 1.35874519 -0.02875776 +H -0.52027774 1.34353213 -0.77554261 +3 +Properties=species:S:1:pos:R:3 A=799.58812 B=437.90386 C=282.94545 mu=1.8511 alpha=6.31 epsHOMO=-0.2928 epsLUMO=0.0687 epsgap=0.3615 =19.0002 zpve=0.021375 U0=-76.404702 U=-76.401867 H=-76.400922 G=-76.422349 Cv=6.002 pbc="F F F" +O -0.03436050 0.97753957 0.00760159 +H 0.06476649 0.02057220 0.00153463 +H 0.87179037 1.30079240 0.00069313 +4 +Properties=species:S:1:pos:R:3 A=0 B=35.6100361 C=35.6100361 mu=0 alpha=16.28 epsHOMO=-0.2845 epsLUMO=0.0506 epsgap=0.3351 =59.5248 zpve=0.026841 U0=-77.308427 U=-77.305527 H=-77.304583 G=-77.327429 Cv=8.574 pbc="F F F" +C 0.59953949 0.00000000 1.00000000 +C -0.59953949 0.00000000 1.00000000 +H -1.66163859 0.00000000 1.00000000 +H 1.66163859 0.00000000 1.00000000 +3 +Properties=species:S:1:pos:R:3 A=0 B=44.593883 C=44.593883 mu=2.8937 alpha=12.99 epsHOMO=-0.3604 epsLUMO=0.0191 epsgap=0.3796 =48.7476 zpve=0.016601 U0=-93.411888 U=-93.40937 H=-93.408425 G=-93.431246 Cv=6.278 pbc="F F F" +C -0.01332393 1.13246572 0.00827589 +N 0.00231072 -0.01915859 0.00192873 +H -0.02780270 2.19894930 0.01415379 +4 +Properties=species:S:1:pos:R:3 A=285.48839 B=38.9823 C=34.29892 mu=2.1089 alpha=14.18 epsHOMO=-0.267 epsLUMO=-0.0406 epsgap=0.2263 =59.9891 zpve=0.026603 U0=-114.483613 U=-114.480746 H=-114.479802 G=-114.505268 Cv=6.413 pbc="F F F" +C -0.01397770 1.18021143 0.00775250 +O 0.00231399 -0.01966366 0.00216107 +H 0.91496029 1.78951117 0.00395656 +H -0.95910972 1.76401798 0.01718284 +8 +Properties=species:S:1:pos:R:3 A=80.46225 B=19.90649 C=19.90633 mu=0 alpha=23.95 epsHOMO=-0.3385 epsLUMO=0.1041 epsgap=0.4426 =109.5031 zpve=0.074542 U0=-79.764152 U=-79.760666 H=-79.759722 G=-79.787269 Cv=10.098 pbc="F F F" +C -0.01870400 1.52558201 0.01043281 +C 0.00210374 -0.00388191 0.00199882 +H 0.99487275 1.93974324 0.00294120 +H -0.54207611 1.92361063 -0.86511735 +H -0.52524112 1.91417308 0.90002399 +H 0.52548654 -0.40190784 0.87754395 +H -1.01147651 -0.41803380 0.00950849 +H 0.50862619 -0.39247040 -0.88760117 +6 +Properties=species:S:1:pos:R:3 A=127.83497 B=24.85872 C=23.97872 mu=1.5258 alpha=16.97 epsHOMO=-0.2653 epsLUMO=0.0784 epsgap=0.3437 =83.794 zpve=0.051208 U0=-115.679136 U=-115.675816 H=-115.674872 G=-115.701876 Cv=8.751 pbc="F F F" +C -0.00828817 1.39046978 -0.00560069 +O -0.00797038 -0.02504537 0.02030606 +H 1.00658338 1.81556366 0.00348335 +H -0.54657475 1.79916975 -0.87390126 +H -0.52288871 1.72555240 0.89907326 +H 0.44142019 -0.33354425 -0.77152059 +7 +Properties=species:S:1:pos:R:3 A=160.28041 B=8.59323 C=8.59321 mu=0.7156 alpha=28.78 epsHOMO=-0.2609 epsLUMO=0.0613 epsgap=0.3222 =177.1963 zpve=0.05541 U0=-116.609549 U=-116.60555 H=-116.604606 G=-116.633775 Cv=12.482 pbc="F F F" +C -0.01782102 1.46435788 0.01009397 +C 0.00208816 0.00950777 0.00201200 +C 0.01834085 -1.19180518 -0.00450508 +H 0.99782210 1.87425349 0.00260606 +H -0.54220434 1.85801178 -0.86721192 +H -0.52533306 1.84834356 0.90148138 +H 0.03231658 -2.25314823 -0.01025999 +6 +Properties=species:S:1:pos:R:3 A=159.03567 B=9.22327 C=9.22324 mu=3.8266 alpha=24.45 epsHOMO=-0.3264 epsLUMO=0.0376 epsgap=0.364 =160.7223 zpve=0.045286 U0=-132.71815 U=-132.714563 H=-132.713619 G=-132.742149 Cv=10.287 pbc="F F F" +C -0.01788629 1.46712787 0.01011311 +C 0.00173819 0.01035260 0.00207588 +N 0.01765235 -1.14452926 -0.00420445 +H 1.00202941 1.86089927 0.00245401 +H -0.54398848 1.84479901 -0.87075460 +H -0.52707783 1.83518166 0.90486329 +7 +Properties=species:S:1:pos:R:3 A=57.22434 B=10.11122 C=9.07368 mu=2.5682 alpha=25.11 epsHOMO=-0.254 epsLUMO=-0.0198 epsgap=0.2342 =166.9728 zpve=0.055355 U0=-153.787612 U=-153.783728 H=-153.782784 G=-153.812518 Cv=11.219 pbc="F F F" +C -0.00294482 1.50991366 0.00867278 +C 0.02608284 0.00327563 -0.03745912 +O 0.94228801 -0.65507035 -0.45682576 +H 0.92278802 1.92634242 -0.39146557 +H -0.86201540 1.87852481 -0.56479538 +H -0.15050638 1.84393383 1.04289100 +H -0.89443009 -0.48643408 0.35774865 +6 +Properties=species:S:1:pos:R:3 A=73.8472 B=11.34793 C=9.83639 mu=3.7286 alpha=21.57 epsHOMO=-0.2543 epsLUMO=0.0302 epsgap=0.2845 =145.3078 zpve=0.045279 U0=-169.860788 U=-169.856903 H=-169.855958 G=-169.885594 Cv=10.89 pbc="F F F" +N -0.02589986 1.34614561 0.00889391 +C 0.04646728 -0.01174341 0.00120425 +O 1.07183520 -0.65258782 -0.01113313 +H 0.82535497 1.88504948 0.00373769 +H -0.90837680 1.82679638 0.01891992 +H -0.96144100 -0.47500376 0.00807391 +11 +Properties=species:S:1:pos:R:3 A=29.45018 B=8.37701 C=7.42076 mu=0.0597 alpha=34.75 epsHOMO=-0.323 epsLUMO=0.0949 epsgap=0.4179 =227.1361 zpve=0.103182 U0=-119.052475 U=-119.047927 H=-119.046983 G=-119.078157 Cv=14.84 pbc="F F F" +C -0.03113825 1.54081582 0.03192126 +C 0.01215347 0.01092235 -0.01603259 +C 0.72169129 -0.52583353 -1.26230570 +H 0.97955987 1.96459116 0.03098367 +H -0.55840223 1.94831192 -0.83816075 +H -0.54252252 1.90153531 0.93005671 +H 0.51522791 -0.36840234 0.88231134 +H -1.01070641 -0.38456999 0.02051783 +H 1.75851210 -0.17376585 -1.30871516 +H 0.74087192 -1.62024959 -1.27516511 +H 0.22023351 -0.19051179 -2.17729020 +9 +Properties=species:S:1:pos:R:3 A=35.09545 B=9.3686 C=8.1497 mu=1.4131 alpha=27.87 epsHOMO=-0.2619 epsLUMO=0.0798 epsgap=0.3417 =193.1659 zpve=0.079754 U0=-154.972731 U=-154.968412 H=-154.967467 G=-154.998148 Cv=13.546 pbc="F F F" +C -0.00860504 1.50203829 -0.00681217 +C 0.01099310 -0.01764877 -0.01377035 +O 0.68088841 -0.44041803 -1.19313210 +H 1.01153334 1.89662030 -0.01920155 +H -0.53159862 1.88076109 -0.88974659 +H -0.51674572 1.87611771 0.88710739 +H 0.52377121 -0.38912295 0.88824082 +H -1.02027544 -0.40507261 0.01690670 +H 0.69529573 -1.40179568 -1.20148495 +9 +Properties=species:S:1:pos:R:3 A=39.37691 B=10.04033 C=8.90353 mu=1.1502 alpha=28.13 epsHOMO=-0.2525 epsLUMO=0.091 epsgap=0.3435 =187.1015 zpve=0.079534 U0=-154.960361 U=-154.956045 H=-154.9551 G=-154.985747 Cv=12.934 pbc="F F F" +C -0.01482147 1.39241234 0.00567104 +O -0.00471537 -0.01360660 0.01459658 +C 0.63794893 -0.55329676 -1.11358232 +H 1.00528358 1.81015807 0.00465631 +H -0.54689560 1.79343530 -0.87251051 +H -0.53002895 1.72291969 0.91101696 +H 0.13993792 -0.25599333 -2.05098375 +H 1.69265275 -0.23868382 -1.17477743 +H 0.59959435 -1.64180161 -1.02407616 +9 +Properties=species:S:1:pos:R:3 A=20.15852 B=20.15302 C=12.5891 mu=0.0005 alpha=30.82 epsHOMO=-0.2888 epsLUMO=0.1042 epsgap=0.393 =155.8145 zpve=0.081231 U0=-117.824798 U=-117.821426 H=-117.820482 G=-117.849087 Cv=11.041 pbc="F F F" +C -0.01193280 1.51433198 0.01031700 +C 1.30299118 0.77886562 -0.00617842 +C 0.00867174 0.00767042 0.00201032 +H -0.30541464 2.01702117 0.92533239 +H -0.32275498 2.02680156 -0.89347839 +H 1.88493396 0.79145020 -0.92119393 +H 1.90226631 0.78165391 0.89766373 +H -0.27088043 -0.51289125 0.91137474 +H -0.28821983 -0.50310409 -0.90740824 +7 +Properties=species:S:1:pos:R:3 A=25.77385 B=22.12109 C=14.18066 mu=1.7675 alpha=24.04 epsHOMO=-0.2682 epsLUMO=0.1042 epsgap=0.3724 =129.891 zpve=0.057289 U0=-153.742562 U=-153.73941 H=-153.738466 G=-153.766642 Cv=9.176 pbc="F F F" +C 0.01537720 1.41764380 0.00956287 +C 1.26478161 0.64923984 -0.00655044 +O -0.00024018 -0.00771006 0.00204055 +H -0.31763326 1.88586598 0.93475751 +H -0.33527583 1.89576673 -0.90397578 +H 1.83246682 0.56256848 -0.93193290 +H 1.85008258 0.55267938 0.90680147 +10 +Properties=species:S:1:pos:R:3 A=10.12193 B=8.49011 C=4.89615 mu=2.7362 alpha=35.53 epsHOMO=-0.2431 epsLUMO=-0.0087 epsgap=0.2344 =292.4367 zpve=0.083382 U0=-193.08834 U=-193.082969 H=-193.082024 G=-193.116476 Cv=16.893 pbc="F F F" +C -0.00310189 1.48050328 -0.17259867 +C -0.04527202 -0.02887059 0.00139493 +C 1.29705800 -0.72194415 0.16889042 +O -1.08643172 -0.64273343 0.00630393 +H 0.59403529 1.74668579 -1.05225043 +H -1.01540407 1.87034023 -0.28382265 +H 0.48099600 1.95070605 0.69099376 +H 1.82512144 -0.32470731 1.04328658 +H 1.14892507 -1.79597689 0.28554393 +H 1.93682635 -0.52949692 -0.69995403 +9 +Properties=species:S:1:pos:R:3 A=10.78886 B=9.27509 C=5.14977 mu=3.6367 alpha=31.83 epsHOMO=-0.2436 epsLUMO=0.0347 epsgap=0.2783 =267.6148 zpve=0.07319 U0=-209.159302 U=-209.15402 H=-209.153076 G=-209.187468 Cv=16.561 pbc="F F F" +C 0.00679889 1.49969736 -0.02567030 +C -0.02740385 -0.01752051 -0.14894811 +N 1.17826667 -0.63324298 0.05691721 +O -1.03721965 -0.63980649 -0.40727572 +H 0.91390280 1.92923755 -0.46100067 +H -0.87080896 1.91124186 -0.52345176 +H -0.02826124 1.78517271 1.03149125 +H 1.98405139 -0.13175861 0.38674906 +H 1.19049421 -1.63919563 0.10006209 +8 +Properties=species:S:1:pos:R:3 A=11.1475 B=10.36388 C=5.42091 mu=3.4869 alpha=28.07 epsHOMO=-0.2495 epsLUMO=0.0556 epsgap=0.3051 =244.2308 zpve=0.063824 U0=-225.221461 U=-225.217075 H=-225.216131 G=-225.247724 Cv=15.292 pbc="F F F" +N 0.03605270 1.36077873 -0.12416403 +C -0.02591138 -0.02076560 0.00200645 +N 1.21968479 -0.62334220 0.11963222 +O -1.06822866 -0.64174597 0.00865573 +H 0.80749439 1.83455148 0.32144915 +H -0.85825775 1.80373500 0.02243770 +H 1.99927148 -0.17303054 -0.33602496 +H 1.18204327 -1.62147901 -0.02109234 +14 +Properties=species:S:1:pos:R:3 A=7.75166 B=7.74847 C=4.48668 mu=0.0897 alpha=45.46 epsHOMO=-0.3167 epsLUMO=0.0843 epsgap=0.401 =355.0621 zpve=0.131146 U0=-158.342346 U=-158.336603 H=-158.335658 G=-158.370016 Cv=20.273 pbc="F F F" +C -0.03215888 1.54021598 0.01074456 +C 0.03381741 0.00745852 0.00180716 +C 0.71375572 -0.50856404 -1.27296949 +C 0.73848999 -0.52220886 1.25750907 +H 0.97522736 1.97414341 0.00528362 +H -0.56196769 1.92232326 -0.86835418 +H -0.54817239 1.91268414 0.90208039 +H -0.99752525 -0.37310578 0.00977297 +H 1.75070021 -0.15586784 -1.33269631 +H 0.73446691 -1.60328288 -1.29939696 +H 0.19367011 -0.16085589 -2.17195508 +H 0.23611990 -0.18382017 2.17005260 +H 0.75964083 -1.61713153 1.27226101 +H 1.77635866 -0.16985318 1.30053019 +12 +Properties=species:S:1:pos:R:3 A=8.67553 B=8.00568 C=4.75542 mu=1.4259 alpha=38.58 epsHOMO=-0.2612 epsLUMO=0.074 epsgap=0.3351 =318.3721 zpve=0.107673 U0=-194.267232 U=-194.261748 H=-194.260804 G=-194.294663 Cv=19.052 pbc="F F F" +C -0.03315871 1.54782566 -0.00438815 +C -0.01108534 0.01859095 0.01676117 +C 0.70938384 -0.53596711 1.23978444 +O -1.33219841 -0.51712554 0.05236057 +H 0.98215692 1.95715900 -0.03182225 +H -0.56388100 1.92087623 -0.88845865 +H -0.54082548 1.93340945 0.88575489 +H 0.51042122 -0.33767241 -0.88819176 +H 0.22240492 -0.18785860 2.15650245 +H 0.68242024 -1.62887638 1.23305141 +H 1.75434301 -0.21246950 1.25524188 +H -1.81818681 -0.15577435 -0.69553962 +6 +Properties=species:S:1:pos:R:3 A=0 B=4.4259726 C=4.4259726 mu=0 alpha=38.52 epsHOMO=-0.2599 epsLUMO=-0.0214 epsgap=0.2386 =278.6264 zpve=0.037354 U0=-153.459846 U=-153.455442 H=-153.454498 G=-153.482621 Cv=15.312 pbc="F F F" +C 0.68098021 0.00000000 0.00000000 +C -0.68098021 0.00000000 0.00000000 +C -1.88766603 0.00000000 0.00000000 +C 1.88766603 0.00000000 0.00000000 +H -2.94960000 0.00000000 0.00000000 +H 2.94960000 0.00000000 0.00000000 +5 +Properties=species:S:1:pos:R:3 A=0 B=4.5793222 C=4.5793222 mu=3.792 alpha=32.66 epsHOMO=-0.3102 epsLUMO=-0.0543 epsgap=0.2559 =260.1896 zpve=0.027259 U0=-169.557758 U=-169.553764 H=-169.55282 G=-169.581024 Cv=12.93 pbc="F F F" +C 0.01510390 0.00000000 1.00000000 +C 1.38233149 0.00000000 1.00000000 +C -1.18862525 0.00000000 1.00000000 +H -2.25177201 0.00000000 1.00000000 +N 2.54296187 0.00000000 1.00000000 +4 +Properties=species:S:1:pos:R:3 A=0 B=4.73269 C=4.73269 mu=0.0023 alpha=27.7 epsHOMO=-0.3696 epsLUMO=-0.0926 epsgap=0.277 =242.9308 zpve=0.015951 U0=-185.648533 U=-185.644825 H=-185.64388 G=-185.667652 Cv=10.398 pbc="F F F" +N 0.01745734 -1.16134217 -0.00415342 +C 0.00253212 -0.00344278 0.00179939 +C -0.01611419 1.37220987 0.00934873 +N -0.03264302 2.53008276 0.01609090 +6 +Properties=species:S:1:pos:R:3 A=68.5171 B=4.8345 C=4.51586 mu=2.7824 alpha=31.14 epsHOMO=-0.2777 epsLUMO=-0.0735 epsgap=0.2042 =268.3921 zpve=0.037208 U0=-190.624631 U=-190.620363 H=-190.619419 G=-190.650543 Cv=13.049 pbc="F F F" +O -0.06776120 -0.04233838 0.00282489 +C -0.00562945 1.16382879 0.00743862 +C 1.22985272 1.91339997 0.00028781 +C 2.23625322 2.57430970 -0.00529277 +H -0.91670701 1.79467546 0.01781352 +H 3.13429662 3.14370267 -0.01037656 +5 +Properties=species:S:1:pos:R:3 A=67.88408 B=5.00823 C=4.66413 mu=2.3112 alpha=26.25 epsHOMO=-0.3166 epsLUMO=-0.11 epsgap=0.2066 =251.0007 zpve=0.02654 U0=-206.721858 U=-206.717875 H=-206.716931 G=-206.747625 Cv=11.329 pbc="F F F" +O -0.04055978 -0.03799144 0.00266513 +C -0.01768870 1.16193251 0.00746008 +C 1.23315534 1.93381336 0.00043371 +N 2.19857378 2.57055097 -0.00483320 +H -0.92627534 1.78959196 0.01764859 +6 +Properties=species:S:1:pos:R:3 A=56.25048 B=4.77441 C=4.40088 mu=0.002 alpha=26.12 epsHOMO=-0.2668 epsLUMO=-0.1113 epsgap=0.1555 =266.8164 zpve=0.036943 U0=-227.798785 U=-227.79457 H=-227.793626 G=-227.825074 Cv=12.147 pbc="F F F" +O 0.00337122 -0.03146586 0.00157206 +C -0.01713174 1.17081409 0.00676444 +C 1.26555783 1.99719410 -0.00007703 +O 1.24507069 3.19946589 0.00681275 +H -0.94690483 1.77678142 0.01852668 +H 2.19534410 1.39121374 -0.01006739 +10 +Properties=species:S:1:pos:R:3 A=80.28766 B=3.3688 C=3.3688 mu=0 alpha=42.32 epsHOMO=-0.2412 epsLUMO=0.0684 epsgap=0.3096 =400.2236 zpve=0.083896 U0=-155.908941 U=-155.90318 H=-155.902236 G=-155.937641 Cv=17.447 pbc="F F F" +C -0.01787959 1.46676893 0.01011180 +C 0.00186644 0.01072913 0.00211109 +C 0.01819704 -1.19272861 -0.00450723 +C 0.03795170 -2.64876793 -0.01251193 +H 0.86460312 1.87589979 0.51479719 +H -0.03217624 1.87210581 -1.00791002 +H -0.90233115 1.85185524 0.53003953 +H -0.83477011 -3.06339007 0.50451436 +H 0.03276422 -3.04315564 -1.03491223 +H 0.93213486 -3.03931642 0.48626606 +10 +Properties=species:S:1:pos:R:3 A=27.39459 B=4.53005 C=4.08342 mu=0.7067 alpha=40.09 epsHOMO=-0.2592 epsLUMO=0.0566 epsgap=0.3157 =333.9589 zpve=0.084338 U0=-155.897345 U=-155.892291 H=-155.891347 G=-155.924226 Cv=17.13 pbc="F F F" +C -0.03095840 1.54775025 0.03167945 +C 0.01485375 0.00962471 -0.02082154 +C 0.69099073 -0.49954575 -1.20857624 +C 1.25222275 -0.89514467 -2.19527879 +H 0.97899300 1.96621609 0.03373834 +H -0.56082354 1.95002902 -0.83580745 +H -0.54576708 1.88225519 0.93709062 +H 0.51920135 -0.37425398 0.87496224 +H -1.00644802 -0.39030838 0.01340632 +H 1.74594541 -1.25604187 -3.06299415 +9 +Properties=species:S:1:pos:R:3 A=28.0016 B=4.67752 C=4.21765 mu=3.9233 alpha=35.38 epsHOMO=-0.3213 epsLUMO=0.034 epsgap=0.3553 =314.5335 zpve=0.07419 U0=-172.006141 U=-172.001467 H=-172.000523 G=-172.032826 Cv=14.988 pbc="F F F" +C -0.02522005 1.54773054 0.02133370 +C 0.01183939 0.00999278 -0.01556702 +C 0.68915114 -0.50836846 -1.20331488 +N 1.22565733 -0.90360846 -2.14737482 +H 0.98571620 1.96212990 0.02370153 +H -0.55522192 1.94599662 -0.84711771 +H -0.53962556 1.88294354 0.92536604 +H 0.52481910 -0.38226048 0.86933355 +H -1.00453542 -0.39832109 0.00530071 +8 +Properties=species:S:1:pos:R:3 A=32.19893 B=4.76299 C=4.30696 mu=4.4361 alpha=31.81 epsHOMO=-0.2683 epsLUMO=0.0173 epsgap=0.2855 =295.6635 zpve=0.063305 U0=-188.042067 U=-188.037478 H=-188.036534 G=-188.06863 Cv=14.488 pbc="F F F" +N -0.03608099 1.48762533 0.03678072 +C -0.01039471 0.02517605 -0.01506608 +C -1.37180956 -0.52108920 0.02739272 +N -2.44026695 -0.95956444 0.03370519 +H 0.91729752 1.83547547 0.05202682 +H -0.47162178 1.85677205 -0.80275569 +H 0.48946161 -0.40880401 -0.89715168 +H 0.52827150 -0.34533338 0.86469547 +8 +Properties=species:S:1:pos:R:3 A=35.11615 B=4.66117 C=4.22354 mu=1.7211 alpha=33.1 epsHOMO=-0.2595 epsLUMO=0.0277 epsgap=0.2872 =300.0993 zpve=0.060632 U0=-191.810916 U=-191.806025 H=-191.805081 G=-191.837634 Cv=15.855 pbc="F F F" +O -0.02013197 1.45738137 0.01010195 +C 0.00168478 0.03579980 0.00224736 +C -1.36366691 -0.47481101 0.01255056 +C -2.47902835 -0.91970202 0.02082451 +H 0.89446911 1.75736553 0.00327363 +H 0.51979028 -0.35175413 -0.88980302 +H 0.53670458 -0.36127661 0.88000894 +H -3.46773502 -1.30737009 0.02818120 +7 +Properties=species:S:1:pos:R:3 A=35.93172 B=4.83443 C=4.37827 mu=4.6788 alpha=28.56 epsHOMO=-0.3018 epsLUMO=0.0022 epsgap=0.3039 =280.6659 zpve=0.050262 U0=-207.916786 U=-207.912215 H=-207.911271 G=-207.943384 Cv=13.845 pbc="F F F" +O -0.03738221 1.44547841 0.01010769 +C 0.01292906 0.03441661 0.00209165 +C -1.35747452 -0.48874523 0.01239738 +N -2.42135277 -0.93685184 0.02016053 +H 0.86898057 1.76972949 0.00417577 +H 0.51692713 -0.36329790 -0.89215814 +H 0.53387616 -0.37278749 0.88223921 +10 +Properties=species:S:1:pos:R:3 A=26.14564 B=4.2893 C=4.12773 mu=2.6741 alpha=35.83 epsHOMO=-0.25 epsLUMO=-0.0205 epsgap=0.2295 =333.3276 zpve=0.084175 U0=-193.075202 U=-193.070116 H=-193.069171 G=-193.102798 Cv=15.954 pbc="F F F" +C 0.16879340 1.52513042 -0.15747056 +C -0.18737625 0.06194763 0.14679374 +C 0.50917645 -0.43996215 1.39125850 +O 1.18191079 -1.43565585 1.45816384 +H 1.23126511 1.63137254 -0.39632693 +H -0.40744668 1.89431681 -1.00969246 +H -0.04931034 2.17266260 0.69857432 +H -1.26905160 -0.01668067 0.32854433 +H 0.06279062 -0.60250479 -0.68474036 +H 0.35384841 0.20663370 2.28871052 +9 +Properties=species:S:1:pos:R:3 A=19.98749 B=6.11589 C=4.82584 mu=3.7071 alpha=32.78 epsHOMO=-0.2516 epsLUMO=0.0335 epsgap=0.2851 =279.7863 zpve=0.074166 U0=-209.144909 U=-209.139976 H=-209.139032 G=-209.172305 Cv=15.058 pbc="F F F" +C 0.01474916 1.47888256 -0.03509326 +N 0.18708077 0.03831317 -0.02906851 +C 0.45703661 -0.66858895 1.10069001 +O 0.58457996 -0.19876202 2.21119705 +H 0.76025289 1.96736104 -0.67198126 +H -0.98462423 1.75984483 -0.38485103 +H 0.14269849 1.82387718 0.99149397 +H 0.10386349 -0.46937726 -0.89461379 +H 0.55047568 -1.75253452 0.88868242 +8 +Properties=species:S:1:pos:R:3 A=48.62351 B=4.67298 C=4.38187 mu=3.92 alpha=29.47 epsHOMO=-0.2814 epsLUMO=0.0074 epsgap=0.2888 =293.917 zpve=0.061327 U0=-229.013797 U=-229.009003 H=-229.008059 G=-229.041086 Cv=13.885 pbc="F F F" +C 0.10653781 1.43512049 0.03336100 +O 0.42686564 0.04716929 0.09309945 +C 0.50714862 -0.63652665 -1.06318297 +O 0.76927014 -1.79955017 -1.11010475 +H 0.92349251 2.00385139 0.48465728 +H -0.03757815 1.76927183 -1.00057425 +H -0.81269569 1.60801916 0.59873287 +H 0.30458460 -0.00231902 -1.94965553 +8 +Properties=species:S:1:pos:R:3 A=36.49282 B=4.31175 C=4.04493 mu=1.7341 alpha=28.53 epsHOMO=-0.2537 epsLUMO=-0.0341 epsgap=0.2196 =303.8129 zpve=0.060508 U0=-228.992613 U=-228.987769 H=-228.986825 G=-229.019918 Cv=14.78 pbc="F F F" +O 0.19375856 1.37170995 0.31398297 +C 0.04992637 0.01405481 -0.04526239 +C -1.40888025 -0.39635680 -0.20601574 +O -1.77729462 -1.37233860 -0.80361689 +H -0.01723186 1.91269132 -0.45337758 +H 0.60440478 -0.26519766 -0.95205725 +H 0.46740406 -0.57521679 0.78176270 +H -2.11835055 0.30075962 0.29870515 +14 +Properties=species:S:1:pos:R:3 A=23.44662 B=3.60588 C=3.38683 mu=0 alpha=45.71 epsHOMO=-0.317 epsLUMO=0.0937 epsgap=0.4107 =426.2996 zpve=0.131708 U0=-158.340943 U=-158.33517 H=-158.334226 G=-158.36894 Cv=19.668 pbc="F F F" +C -0.03007624 1.55804912 0.02980774 +C 0.00707277 0.02834877 -0.00712529 +C 0.71320792 -0.52989340 -1.24765581 +C 0.75036895 -2.05959366 -1.28458957 +H 0.98195330 1.97845113 0.02800797 +H -0.55582433 1.96212343 -0.84270157 +H -0.54083762 1.92692755 0.92493697 +H 0.50928672 -0.34909049 0.89361319 +H -1.01733481 -0.36542299 0.03207393 +H 0.21098948 -0.15245770 -2.14839302 +H 1.73761331 -0.13611625 -1.28685672 +H 1.27616854 -2.46366410 -0.41210980 +H -0.26165699 -2.48000447 -1.28273552 +H 1.26108491 -2.42846444 -2.17974803 +12 +Properties=species:S:1:pos:R:3 A=26.59789 B=3.79186 C=3.53779 mu=1.3402 alpha=38.61 epsHOMO=-0.2619 epsLUMO=0.081 epsgap=0.3429 =382.8628 zpve=0.108241 U0=-194.261089 U=-194.255495 H=-194.254551 G=-194.28893 Cv=18.431 pbc="F F F" +C -0.00379012 1.52196790 0.01027996 +C -0.03589372 -0.00778254 0.00225671 +C -1.45219016 -0.56653711 0.01284386 +O -1.36799785 -1.98394604 0.00453606 +H 1.02477576 1.89411231 0.00239793 +H -0.51286674 1.93764614 -0.86653888 +H -0.49584080 1.92801344 0.90121721 +H 0.48140784 -0.39530552 -0.88316064 +H 0.49828589 -0.40486256 0.87330348 +H -1.98734220 -0.20399494 0.90666062 +H -2.00431485 -0.19459473 -0.86666460 +H -2.26171819 -2.33824298 0.01034748 +12 +Properties=species:S:1:pos:R:3 A=28.29567 B=4.14901 C=3.88349 mu=1.0363 alpha=39.34 epsHOMO=-0.2503 epsLUMO=0.0925 epsgap=0.3428 =368.9331 zpve=0.107895 U0=-194.254127 U=-194.248585 H=-194.247641 G=-194.281899 Cv=17.888 pbc="F F F" +C -0.00519551 1.50868224 0.03308760 +C 0.01316580 -0.01037819 0.01988643 +O 0.69758944 -0.46344140 1.16868979 +C 0.76688491 -1.86508183 1.24602669 +H 1.01445476 1.90423799 0.02996018 +H -0.52990866 1.89184059 -0.84726911 +H -0.51263765 1.87805843 0.92875424 +H -1.01599507 -0.40998729 0.00714282 +H 0.51093143 -0.38369435 -0.89219395 +H -0.23415841 -2.32451489 1.28977780 +H 1.30129276 -2.29853663 0.38486095 +H 1.30990287 -2.11811998 2.16013206 +10 +Properties=species:S:1:pos:R:3 A=14.79671 B=5.6956 C=4.58846 mu=0.0075 alpha=31.42 epsHOMO=-0.2594 epsLUMO=0.0584 epsgap=0.3179 =297.8398 zpve=0.085172 U0=-230.183076 U=-230.177723 H=-230.176779 G=-230.211195 Cv=16.837 pbc="F F F" +O -0.01418735 1.42642242 -0.05423651 +C -0.00391839 0.00717714 0.03496062 +C -1.42317019 -0.55560600 -0.01256639 +O -2.11229413 -0.10563875 -1.17228313 +H -0.18987882 1.64154705 -0.97555148 +H 0.59659504 -0.43315430 -0.77409095 +H 0.47311116 -0.24903733 0.98747216 +H -1.39494859 -1.64975279 -0.06283188 +H -1.96497417 -0.27216915 0.90131972 +H -2.35925991 0.80944396 -1.00614597 +12 +Properties=species:S:1:pos:R:3 A=15.61472 B=6.31363 C=5.54514 mu=0.1136 alpha=41.96 epsHOMO=-0.2727 epsLUMO=0.1012 epsgap=0.3738 =298.6061 zpve=0.109284 U0=-157.116735 U=-157.11209 H=-157.111146 G=-157.143262 Cv=16.49 pbc="F F F" +C -0.03602245 1.52092949 0.01569161 +C 0.01938487 0.01004403 0.04814953 +C 1.30891671 -0.71251995 -0.24920416 +C 0.75347423 -0.70267714 1.15564676 +H 0.90105691 1.95389291 0.38283338 +H -0.19640365 1.89437369 -1.00208569 +H -0.84685273 1.90588930 0.64451322 +H -0.88416809 -0.48001889 -0.30566335 +H 1.26900901 -1.63903068 -0.81150371 +H 2.19010738 -0.11131209 -0.44927513 +H 1.26248862 -0.09487455 1.89690028 +H 0.33540836 -1.62248918 1.54980695 +10 +Properties=species:S:1:pos:R:3 A=18.21931 B=6.63877 C=5.92459 mu=1.812 alpha=35.01 epsHOMO=-0.2633 epsLUMO=0.1052 epsgap=0.3685 =267.2979 zpve=0.085275 U0=-193.039603 U=-193.035186 H=-193.034242 G=-193.065979 Cv=14.764 pbc="F F F" +C -0.01646343 1.51830705 0.00771445 +C -0.02743227 0.01657694 -0.10889741 +C 0.77296553 -0.70131886 -1.10863115 +O 1.17212293 -0.66702969 0.26278829 +H 0.91865980 1.92914217 -0.38285880 +H -0.85158014 1.95456506 -0.55109460 +H -0.11487702 1.82596470 1.05397777 +H -0.93582598 -0.47350600 0.24682793 +H 0.44443922 -1.67201495 -1.47810622 +H 1.40538284 -0.13600339 -1.79271491 +11 +Properties=species:S:1:pos:R:3 A=16.58914 B=7.18798 C=6.11415 mu=1.1353 alpha=39.02 epsHOMO=-0.2304 epsLUMO=0.0968 epsgap=0.3271 =270.5508 zpve=0.097671 U0=-173.147782 U=-173.143343 H=-173.142399 G=-173.174073 Cv=15.298 pbc="F F F" +C -0.05275541 1.47419574 0.00999108 +N 0.01940516 0.02189947 0.06334866 +C 1.32511048 -0.56446850 -0.21420725 +C 0.78051759 -0.54057993 1.17242760 +H 0.86784202 1.97176076 0.36297285 +H -0.23845155 1.79095005 -1.02142866 +H -0.88683448 1.81938959 0.62950398 +H 1.31992909 -1.48186782 -0.79602038 +H 2.15202820 0.11020204 -0.43285248 +H 1.24563570 0.14996098 1.87499245 +H 0.37013358 -1.44020447 1.62233365 +10 +Properties=species:S:1:pos:R:3 A=16.79477 B=6.71015 C=5.86781 mu=1.3894 alpha=34.64 epsHOMO=-0.239 epsLUMO=0.0775 epsgap=0.3166 =263.966 zpve=0.085106 U0=-193.034988 U=-193.030356 H=-193.029411 G=-193.061689 Cv=15.679 pbc="F F F" +O 0.21577583 1.35386859 -0.10695107 +C 0.01628099 -0.02832718 -0.02915694 +C -0.39081465 -0.71497009 1.24315669 +C -1.35118138 -0.64280380 0.06273589 +H -0.43642338 1.79062849 0.45006761 +H 0.74981167 -0.52404050 -0.65624767 +H 0.05959375 -1.66840483 1.49729237 +H -0.61369353 -0.08848006 2.10170640 +H -2.19821932 0.03058430 0.15411451 +H -1.56395912 -1.54640426 -0.49826515 +12 +Properties=species:S:1:pos:R:3 A=10.66107 B=10.66107 C=6.30452 mu=0 alpha=41.83 epsHOMO=-0.2982 epsLUMO=0.0956 epsgap=0.3938 =268.4432 zpve=0.110511 U0=-157.115484 U=-157.111322 H=-157.110378 G=-157.141657 Cv=14.696 pbc="F F F" +C -0.02542957 1.54032578 -0.04215944 +C 1.52564399 1.50419989 0.04121276 +C 1.42146727 0.06146790 0.60844885 +C -0.02638833 -0.01070956 0.04935088 +H -0.46591372 1.99639894 0.84962894 +H -0.47900239 2.00028207 -0.92365389 +H 1.98248278 1.51375334 -0.95303183 +H 2.02191365 2.25986579 0.65522129 +H 2.14291679 -0.67956358 0.25531480 +H 1.43105853 0.05751479 1.70261879 +H -0.79053440 -0.48530296 0.66996573 +H -0.05233245 -0.47238446 -0.94236394 +10 +Properties=species:S:1:pos:R:3 A=12.06545 B=11.77731 C=6.71997 mu=1.7978 alpha=34.56 epsHOMO=-0.2424 epsLUMO=0.0859 epsgap=0.3283 =236.9759 zpve=0.086675 U0=-193.034094 U=-193.029968 H=-193.029024 G=-193.060777 Cv=12.915 pbc="F F F" +C -0.03489789 1.55259455 -0.08507691 +C 1.49349183 1.45459700 0.10114677 +O 1.42725884 0.02348990 0.27254886 +C -0.00634758 0.02236494 0.10944630 +H -0.56579210 2.11301721 0.68591527 +H -0.36628352 1.89393380 -1.06692327 +H 2.10031724 1.73525720 -0.76898349 +H 1.90023090 1.95506611 0.98896748 +H -0.51987849 -0.35595179 1.00235948 +H -0.31970062 -0.57567421 -0.75559275 +12 +Properties=species:S:1:pos:R:3 A=8.63483 B=4.11977 C=2.88825 mu=0.6875 alpha=45.37 epsHOMO=-0.2392 epsLUMO=0.0192 epsgap=0.2584 =452.5112 zpve=0.100501 U0=-248.375248 U=-248.368823 H=-248.367879 G=-248.405354 Cv=21.616 pbc="F F F" +C -0.10255370 1.49907127 -0.00133642 +C -0.00519774 -0.00343114 -0.02723470 +C -0.00688536 -0.76890740 1.26434744 +N 0.08186799 -0.69202791 -1.10087306 +O 0.07439067 0.13215394 -2.24195258 +H 0.78342093 1.94690862 -0.46354050 +H -0.96150430 1.83614082 -0.59021965 +H -0.19854173 1.87462989 1.01931607 +H -0.92620012 -0.57297946 1.82982479 +H 0.07256154 -1.84064782 1.07516863 +H 0.82937178 -0.45553340 1.90133089 +H 0.13975924 -0.51254299 -2.95389260 +10 +Properties=species:S:1:pos:R:3 A=9.17136 B=9.04195 C=4.5531 mu=1.8689 alpha=43.14 epsHOMO=-0.2029 epsLUMO=0.0499 epsgap=0.2528 =303.9808 zpve=0.082433 U0=-210.101789 U=-210.097816 H=-210.096872 G=-210.12818 Cv=14.821 pbc="F F F" +N -0.00829694 1.35362838 0.00995971 +C 1.28033254 1.82457421 -0.00022459 +C 2.12216639 0.73698898 -0.01445600 +C 1.30849904 -0.43109580 -0.01284154 +C -0.00342782 -0.01836884 0.00235736 +H -0.83243234 1.92772668 0.02122995 +H 1.48471820 2.88312630 0.00354313 +H 3.20066918 0.77343077 -0.02488416 +H 1.64810599 -1.45539683 -0.02180394 +H -0.92551647 -0.57697054 0.00839402 +9 +Properties=species:S:1:pos:R:3 A=9.77329 B=9.41192 C=4.7946 mu=3.6193 alpha=39.13 epsHOMO=-0.2253 epsLUMO=0.0332 epsgap=0.2585 =283.6817 zpve=0.071145 U0=-226.160842 U=-226.157088 H=-226.156144 G=-226.187104 Cv=13.371 pbc="F F F" +N -0.00996090 1.35636172 0.01000855 +C 1.29535422 1.79575578 -0.00047017 +C 2.05550519 0.65637438 -0.01422927 +N 1.25385745 -0.46275132 -0.01260894 +C 0.02301170 -0.00706382 0.00200146 +H -0.83195718 1.93618436 0.02132575 +H 1.54553961 2.84344998 0.00289054 +H 3.13177434 0.57569766 -0.02524155 +H -0.87667864 -0.60414531 0.00750794 +9 +Properties=species:S:1:pos:R:3 A=9.50228 B=9.29497 C=4.69874 mu=0.5571 alpha=39.2 epsHOMO=-0.2246 epsLUMO=0.0199 epsgap=0.2445 =289.005 zpve=0.069883 U0=-229.969129 U=-229.965414 H=-229.96447 G=-229.995393 Cv=13.358 pbc="F F F" +O -0.03255819 1.35065130 0.00967376 +C 1.25319237 1.79167710 -0.00030351 +C 2.11664681 0.74375623 -0.01441494 +C 1.30397796 -0.43852387 -0.01283316 +C 0.01629568 -0.00777185 0.00191294 +H 1.37951089 2.86161135 0.00427433 +H 3.19376406 0.79865501 -0.02458604 +H 1.63858893 -1.46383271 -0.02156949 +H -0.93736295 -0.50899925 0.00843891 +8 +Properties=species:S:1:pos:R:3 A=10.10926 B=9.69372 C=4.94857 mu=1.5081 alpha=35.17 epsHOMO=-0.2509 epsLUMO=0.001 epsgap=0.2519 =269.2444 zpve=0.058593 U0=-246.02915 U=-246.025614 H=-246.024669 G=-246.055309 Cv=12.04 pbc="F F F" +O -0.03808298 1.35643965 0.00975193 +C 1.26496982 1.76855319 -0.00061744 +C 2.04955750 0.66630033 -0.01406047 +N 1.24227075 -0.46732066 -0.01237541 +C 0.04019820 0.00561577 0.00183569 +H 1.43513907 2.83095265 0.00340823 +H 3.12532898 0.59783015 -0.02480757 +H -0.89387707 -0.53342154 0.00796935 +17 +Properties=species:S:1:pos:R:3 A=4.4178 B=4.41753 C=4.41717 mu=0.0003 alpha=56.01 epsHOMO=-0.3145 epsLUMO=0.0737 epsgap=0.3882 =486.2719 zpve=0.158836 U0=-197.632222 U=-197.625241 H=-197.624297 G=-197.661411 Cv=26.084 pbc="F F F" +C -0.01859029 1.53486266 0.01039904 +C 0.00210320 -0.00413672 0.00196980 +C 0.74643954 -0.51390760 1.24887638 +C -1.44190166 -0.53673615 0.01311457 +C 0.72234971 -0.50049606 -1.26445632 +H 0.99776928 1.94420529 0.00435474 +H -0.54181883 1.92841415 -0.86819911 +H -0.52758402 1.91888376 0.90148530 +H 0.25549576 -0.17602728 2.16833067 +H 0.77815389 -1.60892372 1.27088904 +H 1.77964786 -0.14975834 1.26944035 +H -1.99871895 -0.18888794 -0.86408066 +H -1.45956909 -1.63227235 0.00649916 +H -1.98088827 -0.19979639 0.90561580 +H 1.75482473 -0.13554018 -1.30118083 +H 0.75396989 -1.59524036 -1.29822280 +H 0.21358221 -0.15343900 -2.17067181 +15 +Properties=species:S:1:pos:R:3 A=4.69474 B=4.66938 C=4.47909 mu=1.384 alpha=49.04 epsHOMO=-0.2601 epsLUMO=0.0664 epsgap=0.3265 =449.0573 zpve=0.134977 U0=-233.560626 U=-233.553779 H=-233.552834 G=-233.589759 Cv=25.128 pbc="F F F" +C -0.00855999 1.54270147 0.00152717 +C 0.00506780 0.00702635 0.01856160 +C 0.76137731 -0.51839196 1.24766443 +C -1.42012774 -0.54933183 -0.02116008 +O 0.62590477 -0.48363745 -1.17657057 +H 1.01361406 1.94020776 0.00281128 +H -0.51459669 1.90702466 -0.89705781 +H -0.52214815 1.94882514 0.87918344 +H 0.28130613 -0.20165548 2.17943598 +H 0.79965506 -1.61131746 1.23022549 +H 1.79096916 -0.14072935 1.26083003 +H -1.93854829 -0.19910724 -0.91828281 +H -1.39937632 -1.64259062 -0.04563833 +H -1.98850725 -0.23059656 0.85726520 +H 1.53111188 -0.15488046 -1.19210222 +9 +Properties=species:S:1:pos:R:3 A=10.21876 B=4.04324 C=2.94978 mu=2.8579 alpha=42.02 epsHOMO=-0.2654 epsLUMO=-0.0575 epsgap=0.2079 =416.7799 zpve=0.065175 U0=-229.927277 U=-229.921622 H=-229.920677 G=-229.955843 Cv=18.723 pbc="F F F" +C -0.00693851 1.49559567 -0.01063358 +C -0.02986170 -0.01594623 0.06248673 +O -0.08815239 -0.63215062 1.10334812 +C 0.02336981 -0.70256747 -1.22062379 +C 0.06738132 -1.26058341 -2.28623129 +H 0.90429806 1.83281887 -0.51655384 +H -0.85338524 1.85556926 -0.60552819 +H -0.05237764 1.91099807 0.99695949 +H 0.10466868 -1.77036047 -3.21832617 +8 +Properties=species:S:1:pos:R:3 A=10.16063 B=4.15847 C=3.0056 mu=3.3351 alpha=37.08 epsHOMO=-0.3007 epsLUMO=-0.0889 epsgap=0.2118 =397.7757 zpve=0.05451 U0=-246.027383 U=-246.022024 H=-246.02108 G=-246.055769 Cv=16.963 pbc="F F F" +C -0.01171097 1.49973776 -0.01213268 +C -0.02919740 -0.00338745 0.07151218 +O -0.09164028 -0.64592927 1.08732241 +C 0.03831104 -0.69690258 -1.23748557 +N 0.09136286 -1.22982650 -2.26228068 +H 0.90093132 1.83370670 -0.51814928 +H -0.85663933 1.84864400 -0.61618135 +H -0.06416540 1.92131542 0.99203818 +8 +Properties=species:S:1:pos:R:3 A=10.68423 B=4.3198 C=3.07993 mu=5.1815 alpha=38.31 epsHOMO=-0.2739 epsLUMO=-0.0438 epsgap=0.2301 =384.5574 zpve=0.056619 U0=-242.19573 U=-242.190591 H=-242.189646 G=-242.223513 Cv=17.465 pbc="F F F" +N -0.05232108 1.34991769 0.15535538 +C 0.08549378 -0.01476951 0.02668890 +N 1.14555215 -0.71993906 -0.03966037 +C -1.19426556 -0.71152088 0.01802151 +N -2.22747610 -1.22790543 0.00132148 +H 0.75474469 1.91998737 -0.04411334 +H -0.94458527 1.76600473 -0.05932293 +H 1.98312429 -0.13415500 -0.02878551 +9 +Properties=species:S:1:pos:R:3 A=9.08854 B=4.42607 C=3.03169 mu=0.9461 alpha=36.51 epsHOMO=-0.2538 epsLUMO=-0.0964 epsgap=0.1574 =399.222 zpve=0.064992 U0=-267.10335 U=-267.097658 H=-267.096714 G=-267.132534 Cv=17.806 pbc="F F F" +C -0.43126066 1.30586664 -0.12758585 +C 0.25285715 -0.01026988 0.13138867 +O 0.69872099 -0.36890333 1.19604690 +C 0.38978943 -0.96773680 -1.06226208 +O -0.01611268 -0.71564293 -2.16583718 +H 0.10006565 1.85324490 -0.91332597 +H -1.44270433 1.13069361 -0.50923371 +H -0.46757554 1.89548158 0.78836479 +H 0.90329886 -1.91558845 -0.79531972 +9 +Properties=species:S:1:pos:R:3 A=10.08927 B=4.54115 C=3.13487 mu=2.7707 alpha=38.09 epsHOMO=-0.2561 epsLUMO=-0.064 epsgap=0.192 =384.4827 zpve=0.067668 U0=-263.278851 U=-263.273589 H=-263.272645 G=-263.306835 Cv=17.972 pbc="F F F" +N -0.16032929 1.08528962 -0.45398652 +C 0.18649127 -0.08762327 0.14758021 +N 1.28979627 -0.46427423 0.67927030 +C -0.94204384 -1.08440264 0.20423621 +O -2.01802205 -0.89007687 -0.30583149 +H 0.54574437 1.73837930 -0.74689246 +H -1.04684920 1.09570857 -0.93607796 +H 2.01738195 0.24991828 0.59881811 +H -0.67740148 -2.01003995 0.74746441 +13 +Properties=species:S:1:pos:R:3 A=7.92874 B=3.8272 C=2.82581 mu=0.6578 alpha=51.2 epsHOMO=-0.2589 epsLUMO=0.0571 epsgap=0.316 =481.9854 zpve=0.112471 U0=-195.186772 U=-195.180446 H=-195.179502 G=-195.215658 Cv=22.569 pbc="F F F" +C -0.01763434 1.54859468 -0.00253584 +C -0.01719180 0.00735789 0.03269604 +C 0.75818463 -0.52820155 1.25278862 +C -1.38213303 -0.51768438 0.00775516 +C -2.50796392 -0.94005629 0.00478552 +H 1.00944396 1.92639613 -0.02632830 +H -0.54514614 1.92217052 -0.88393459 +H -0.51243000 1.95339892 0.88560642 +H 0.49366179 -0.34904155 -0.87265890 +H 0.28968458 -0.19345372 2.18334679 +H 0.77833392 -1.62102506 1.25783727 +H 1.78952492 -0.16181727 1.23574954 +H -3.49998244 -1.31810165 -0.00723572 +12 +Properties=species:S:1:pos:R:3 A=7.90009 B=3.95466 C=2.88643 mu=3.9512 alpha=46.23 epsHOMO=-0.318 epsLUMO=0.0365 epsgap=0.3545 =460.694 zpve=0.102281 U0=-211.295796 U=-211.289821 H=-211.288877 G=-211.324525 Cv=20.467 pbc="F F F" +C -0.00242350 1.55035837 0.01056187 +C -0.01856600 0.01004352 -0.02261770 +C -1.45045318 -0.55766178 0.01293347 +C 0.70125749 -0.48583168 -1.20172764 +N 1.26190946 -0.87126766 -2.13619740 +H 1.01959496 1.93673215 0.00349668 +H -0.52972844 1.96141639 -0.85498386 +H -0.50134251 1.90346839 0.91755862 +H 0.52481877 -0.36222456 0.85525462 +H -2.02427903 -0.21428716 -0.85251869 +H -1.44438296 -1.65026927 0.00754107 +H -1.95805494 -0.21725882 0.91996760 +11 +Properties=species:S:1:pos:R:3 A=8.30095 B=3.97615 C=2.93764 mu=2.7429 alpha=42.87 epsHOMO=-0.2704 epsLUMO=0.0278 epsgap=0.2983 =440.0738 zpve=0.091554 U0=-227.338075 U=-227.332253 H=-227.331309 G=-227.366638 Cv=19.946 pbc="F F F" +C -0.01064295 1.54128691 0.00722087 +C -0.00203811 0.00756015 0.03863463 +N 0.76268677 -0.47101822 1.19250856 +C -1.38541954 -0.52099256 -0.00194097 +N -2.45680847 -0.95636072 0.00694969 +H 1.02043523 1.90106589 0.00392365 +H -0.52873161 1.91193452 -0.88031480 +H -0.51849536 1.94150431 0.89013197 +H 0.50418828 -0.35805500 -0.86276072 +H 0.30070681 -0.18364934 2.05155305 +H 0.78148992 -1.48670299 1.20428183 +11 +Properties=species:S:1:pos:R:3 A=8.55919 B=3.89952 C=2.91869 mu=1.3582 alpha=44.03 epsHOMO=-0.2665 epsLUMO=0.0336 epsgap=0.3001 =444.6452 zpve=0.088908 U0=-231.108368 U=-231.102292 H=-231.101348 G=-231.137061 Cv=21.306 pbc="F F F" +C -0.00754278 1.55566144 0.08650633 +C 0.01207541 0.02096553 0.04935916 +O -1.29150251 -0.52785128 0.22126386 +C 0.65093362 -0.47718651 -1.17430507 +C 1.13902673 -0.86577343 -2.20205518 +H 1.00824243 1.95969458 0.04929733 +H -0.56272245 1.95192010 -0.76978085 +H -0.49328161 1.88929438 1.00704123 +H 0.57811967 -0.34464907 0.91458864 +H -1.78516532 -0.35903262 -0.58909400 +H 1.58078877 -1.22365060 -3.09919447 +10 +Properties=species:S:1:pos:R:3 A=8.55908 B=4.01671 C=2.97882 mu=3.269 alpha=39.28 epsHOMO=-0.3051 epsLUMO=0.0115 epsgap=0.3166 =424.3395 zpve=0.078602 U0=-247.214861 U=-247.209162 H=-247.208218 G=-247.243338 Cv=19.252 pbc="F F F" +C -0.00992462 1.54951908 0.00732200 +C 0.00740485 0.01722020 0.05031270 +O 0.72085722 -0.49630479 1.15864583 +C -1.36995095 -0.52355929 0.00894432 +N -2.45081572 -0.93233138 0.00716912 +H 1.01892314 1.91630447 0.02724149 +H -0.50261490 1.90969362 -0.89997951 +H -0.54800426 1.95377611 0.87053664 +H 0.53602846 -0.36494195 -0.82970945 +H 0.27702643 -0.20644534 1.96421773 +13 +Properties=species:S:1:pos:R:3 A=7.66289 B=3.70925 C=2.79937 mu=2.6921 alpha=46.58 epsHOMO=-0.2469 epsLUMO=-0.0188 epsgap=0.2281 =482.0475 zpve=0.112328 U0=-232.364952 U=-232.358577 H=-232.357633 G=-232.394589 Cv=21.434 pbc="F F F" +C -0.02629647 1.53877116 -0.00783747 +C 0.01468904 0.00095310 0.00166037 +C 0.74737862 -0.53388859 1.24420471 +C -1.40211264 -0.53859257 -0.01557820 +O -1.87620455 -1.23582351 -0.87399559 +H 0.98823696 1.94625080 0.03705522 +H -0.50725090 1.92153422 -0.91285565 +H -0.57756514 1.92360883 0.85796386 +H 0.50584680 -0.36421091 -0.90619124 +H 0.22958380 -0.23909403 2.16431052 +H 0.81692736 -1.62559499 1.22973438 +H 1.76267153 -0.12846566 1.29050755 +H -2.00861510 -0.22792742 0.87121666 +11 +Properties=species:S:1:pos:R:3 A=8.31096 B=4.07963 C=2.92918 mu=2.8354 alpha=39.16 epsHOMO=-0.255 epsLUMO=-0.0279 epsgap=0.2271 =432.1489 zpve=0.088443 U0=-268.287661 U=-268.281505 H=-268.280561 G=-268.316982 Cv=20.344 pbc="F F F" +C -0.05483118 1.46032843 -0.17068647 +C 0.07105714 -0.03524485 0.11225841 +O 0.58204486 -0.33316656 1.40176256 +C -1.27639279 -0.74383027 0.03051185 +O -2.11855775 -0.49643175 -0.79163412 +H 0.93158072 1.93091398 -0.23353204 +H -0.57713995 1.61290939 -1.11835562 +H -0.62444315 1.94776119 0.62573670 +H 0.69687521 -0.50071620 -0.67159471 +H 1.45603316 0.06066659 1.47858584 +H -1.40723217 -1.53388627 0.80211181 +12 +Properties=species:S:1:pos:R:3 A=8.9331 B=4.19405 C=2.96046 mu=3.7163 alpha=44.42 epsHOMO=-0.2424 epsLUMO=0.0327 epsgap=0.2751 =441.85 zpve=0.10227 U0=-248.430371 U=-248.424309 H=-248.423365 G=-248.459383 Cv=19.918 pbc="F F F" +C -0.09776499 1.44917268 0.04561984 +N 0.01043053 0.00373818 -0.00070600 +C 0.05323028 -0.71432112 1.25264891 +C 0.06728716 -0.64067225 -1.20060778 +O 0.03636432 -0.11006515 -2.29109228 +H 0.75650660 1.88747109 0.57647421 +H -0.11648577 1.81632103 -0.98049172 +H -1.01641106 1.75521548 0.56151415 +H -0.85453556 -0.53657675 1.84390168 +H 0.13297722 -1.78696336 1.05851351 +H 0.91637348 -0.40737846 1.85761345 +H 0.14762240 -1.73801339 -1.06805139 +11 +Properties=species:S:1:pos:R:3 A=10.13982 B=3.81346 C=2.86965 mu=2.9514 alpha=39.33 epsHOMO=-0.2699 epsLUMO=-0.0262 epsgap=0.2437 =440.1727 zpve=0.088924 U0=-268.301176 U=-268.295084 H=-268.29414 G=-268.331307 Cv=19.824 pbc="F F F" +C -0.01708808 1.44281136 0.03225501 +C -0.05544542 -0.06560572 -0.02375999 +O -0.17379913 -0.76196233 0.96223129 +C 0.06068107 -0.73615179 -1.38825252 +O 0.00877771 -2.12574390 -1.27749486 +H 0.92062950 1.81463913 -0.39522215 +H -0.83050523 1.86542281 -0.56780350 +H -0.10911975 1.78049045 1.06493675 +H -0.75015067 -0.35235060 -2.03056074 +H 1.00312898 -0.40389029 -1.85592942 +H -0.09063255 -2.29450960 -0.32608019 +13 +Properties=species:S:1:pos:R:3 A=9.55216 B=3.57844 C=2.7341 mu=2.6168 alpha=46.19 epsHOMO=-0.2423 epsLUMO=-0.0072 epsgap=0.2351 =489.8518 zpve=0.112006 U0=-232.377706 U=-232.371073 H=-232.370129 G=-232.408256 Cv=21.716 pbc="F F F" +C -0.04384102 1.54099793 -0.03913814 +C 0.02765132 0.01885817 0.04778773 +C 0.76814644 -0.48842218 1.28000847 +C 0.87850208 -1.99746312 1.42393323 +O 1.24179142 0.26651340 2.09788702 +H 0.95796454 1.97690198 -0.06816012 +H -0.58447717 1.85356031 -0.93690369 +H -0.55173626 1.95737759 0.83440529 +H -0.97692824 -0.42709877 0.05353178 +H 0.51853486 -0.40806507 -0.83809409 +H 1.39924980 -2.42678188 0.56053177 +H 1.42001187 -2.24449367 2.33776426 +H -0.11750602 -2.45360651 1.45141965 +12 +Properties=species:S:1:pos:R:3 A=9.78802 B=3.78441 C=2.84416 mu=3.499 alpha=42.54 epsHOMO=-0.2438 epsLUMO=0.0355 epsgap=0.2793 =457.447 zpve=0.101847 U0=-248.448467 U=-248.441988 H=-248.441044 G=-248.478935 Cv=21.374 pbc="F F F" +C -0.00220144 1.53344329 -0.05960369 +C -0.03235837 0.01206167 0.06840265 +C 0.69666086 -0.48196462 1.31828322 +N 0.98104007 -1.82034162 1.31984698 +O 1.00392124 0.24606232 2.24136749 +H 1.02111190 1.89525169 -0.19182672 +H -0.59707204 1.86206427 -0.91645604 +H -0.39728839 1.99920712 0.84545201 +H -1.06936083 -0.34552935 0.13040806 +H 0.39947165 -0.46906818 -0.81777020 +H 0.63281951 -2.43917647 0.60874785 +H 1.35708014 -2.22217793 2.16303522 +12 +Properties=species:S:1:pos:R:3 A=10.01185 B=3.84195 C=2.87635 mu=3.5402 alpha=43.61 epsHOMO=-0.2418 epsLUMO=0.0387 epsgap=0.2805 =458.9803 zpve=0.101735 U0=-248.443503 U=-248.436899 H=-248.435955 G=-248.474272 Cv=20.967 pbc="F F F" +C 0.00619941 1.45933202 -0.03893859 +N -0.06411616 0.01422963 -0.12046901 +C -1.20595394 -0.68196796 0.16117120 +C -1.08982704 -2.19284899 0.02095775 +O -2.24482911 -0.14443077 0.49994418 +H 0.75053989 1.78372520 0.69715573 +H 0.25692001 1.90395263 -1.00876215 +H -0.97856026 1.81121438 0.27082194 +H 0.75820982 -0.49543660 -0.39464024 +H -0.09909703 -2.53543104 -0.28970003 +H -1.34097671 -2.65395851 0.97972885 +H -1.82903100 -2.53483935 -0.70813076 +11 +Properties=species:S:1:pos:R:3 A=10.44045 B=4.04692 C=2.98547 mu=3.5648 alpha=39.51 epsHOMO=-0.2436 epsLUMO=0.0599 epsgap=0.3034 =428.404 zpve=0.091713 U0=-264.504487 U=-264.498452 H=-264.497508 G=-264.533633 Cv=20.274 pbc="F F F" +C 0.00922630 1.45021814 -0.03194543 +N -0.01429488 -0.00054646 -0.01782667 +C -1.21576579 -0.67252403 0.04421896 +N -1.09733352 -2.04644898 -0.15997741 +O -2.28599299 -0.12893711 0.24196027 +H 0.89659038 1.81885022 0.49120949 +H 0.00233950 1.86388504 -1.04914155 +H -0.88562684 1.79943346 0.48353298 +H 0.75257305 -0.47506631 -0.46719265 +H -0.24882333 -2.48772194 0.16375654 +H -1.93419610 -2.53898393 0.11482880 +12 +Properties=species:S:1:pos:R:3 A=9.69683 B=4.1533 C=3.01703 mu=1.1876 alpha=43.57 epsHOMO=-0.2595 epsLUMO=0.0352 epsgap=0.2948 =443.1687 zpve=0.102062 U0=-248.416462 U=-248.410358 H=-248.409414 G=-248.445651 Cv=20.256 pbc="F F F" +C -0.09160695 1.37540046 -0.00729426 +O -0.06964534 -0.04831581 -0.11148812 +C 0.68114625 -0.56142673 -1.10732458 +C 0.60405298 -2.06701550 -1.08766892 +N 1.32645533 0.19266343 -1.89967731 +H 0.91463916 1.76843655 0.16257460 +H -0.48562826 1.82624615 -0.92235216 +H -0.73971430 1.60007423 0.84110605 +H -0.43430065 -2.39242162 -1.20325205 +H 1.20627110 -2.50049977 -1.88745640 +H 0.95651337 -2.44976670 -0.12501838 +H 1.83504115 -0.36104361 -2.58486055 +11 +Properties=species:S:1:pos:R:3 A=10.20392 B=4.16834 C=3.07281 mu=1.7569 alpha=39.33 epsHOMO=-0.2685 epsLUMO=0.0174 epsgap=0.2859 =427.6606 zpve=0.089436 U0=-268.32127 U=-268.315051 H=-268.314106 G=-268.351214 Cv=19.501 pbc="F F F" +C 0.07295254 1.38840919 0.06442046 +O 0.21049114 -0.03740028 0.04612736 +C 0.50102805 -0.57224288 -1.15975346 +C 0.62218715 -2.07378323 -1.06030684 +O 0.63922154 0.08224418 -2.16157325 +H 1.00029720 1.87062570 -0.25532064 +H -0.73338957 1.70782089 -0.60080454 +H -0.15751280 1.65154060 1.09692954 +H -0.31330001 -2.50202851 -0.68941906 +H 0.85646588 -2.48430275 -2.04157352 +H 1.40651685 -2.34055496 -0.34634301 +10 +Properties=species:S:1:pos:R:3 A=10.68182 B=4.39532 C=3.17969 mu=2.329 alpha=35.5 epsHOMO=-0.2669 epsLUMO=0.0575 epsgap=0.3244 =398.5908 zpve=0.079271 U0=-284.385189 U=-284.379361 H=-284.378417 G=-284.414085 Cv=19.084 pbc="F F F" +C -0.02645771 1.38305753 0.02085660 +O 0.04139566 -0.04439503 -0.00277452 +C 0.66775338 -0.56001625 -1.09000344 +N 0.72605063 -1.92219983 -0.98822954 +O 1.12952381 0.09648143 -1.99322180 +H 0.97529779 1.82044307 0.02387306 +H -0.57085698 1.76214621 -0.84790425 +H -0.55410722 1.63835731 0.94043594 +H 0.12662696 -2.38401590 -0.32566929 +H 0.97230070 -2.41798421 -1.82732573 +10 +Properties=species:S:1:pos:R:3 A=10.20696 B=3.93135 C=2.9219 mu=4.5676 alpha=35.87 epsHOMO=-0.246 epsLUMO=0.0273 epsgap=0.2733 =418.5967 zpve=0.078222 U0=-284.360325 U=-284.354148 H=-284.353204 G=-284.390143 Cv=20.089 pbc="F F F" +N -0.08115607 1.31807026 0.01276742 +C 0.05442259 -0.04477733 0.08155388 +O 1.12163074 -0.59783950 0.20940553 +C -1.28687786 -0.79011642 0.06178435 +O -1.04605114 -2.13954195 -0.23957158 +H 0.76623366 1.85991128 -0.04483425 +H -0.93021346 1.74567447 -0.31565615 +H -1.74559696 -0.65521334 1.05526700 +H -1.96026061 -0.31149222 -0.67026256 +H -1.85637296 -2.63017646 -0.07625478 +10 +Properties=species:S:1:pos:R:3 A=10.14389 B=4.0714 C=3.02223 mu=5.3004 alpha=35.19 epsHOMO=-0.2527 epsLUMO=0.0208 epsgap=0.2735 =408.0279 zpve=0.080317 U0=-284.372483 U=-284.367172 H=-284.366228 G=-284.40095 Cv=17.931 pbc="F F F" +N 0.01838100 0.93057357 0.04943058 +H -0.70674506 0.56116798 -0.55550134 +H 0.68248307 0.18430002 0.21487099 +H 0.21928084 2.79858558 -0.32670585 +C -0.54586914 1.44688585 1.30274586 +C -0.80466975 2.96030569 1.21052835 +O -0.21468822 3.53648884 0.15531687 +O -1.45295676 3.56338618 2.02143528 +H -1.47662579 0.96512183 1.62072169 +H 0.17781209 1.30324286 2.11157176 +13 +Properties=species:S:1:pos:R:3 A=6.6508 B=4.19317 C=3.39441 mu=2.2854 alpha=42.01 epsHOMO=-0.2597 epsLUMO=0.0631 epsgap=0.3228 =438.3028 zpve=0.11345 U0=-269.479234 U=-269.472993 H=-269.472049 G=-269.508213 Cv=22.072 pbc="F F F" +C -0.02775167 1.53421433 0.00651151 +C 0.08343246 0.01218277 0.05258986 +O 0.95856392 -0.48200710 -0.96694113 +C 0.69767574 -0.49516451 1.35948812 +O 2.02247062 -0.02842530 1.52222186 +H 0.94333763 1.98841434 0.21841589 +H -0.37320516 1.87354041 -0.97716908 +H -0.74773817 1.89256394 0.74926853 +H -0.91671848 -0.43697036 -0.06040528 +H 0.76726710 -0.01412177 -1.78502043 +H 0.11650002 -0.13351914 2.21392431 +H 0.65814685 -1.59563445 1.36274474 +H 2.46378566 -0.22762476 0.68698431 +17 +Properties=species:S:1:pos:R:3 A=7.26511 B=3.32874 C=2.54491 mu=0.0618 alpha=56.26 epsHOMO=-0.3085 epsLUMO=0.085 epsgap=0.3934 =565.8412 zpve=0.159632 U0=-197.629387 U=-197.622325 H=-197.621381 G=-197.659365 Cv=25.169 pbc="F F F" +C 0.05879035 1.56174169 -0.01945240 +C -0.01544024 0.03182306 0.00308332 +C -1.44103237 -0.54862028 0.05028629 +C -1.40777007 -2.07231030 -0.13012010 +C -2.18400529 -0.17659759 1.34114303 +H 1.09435638 1.90233607 -0.11900072 +H -0.50689566 1.97217319 -0.86388098 +H -0.34407951 2.00628082 0.89579522 +H 0.48926758 -0.36011214 -0.88953902 +H 0.55254938 -0.35139446 0.86269887 +H -2.00031575 -0.12153682 -0.79559684 +H -0.85501131 -2.55065810 0.68775438 +H -2.41787513 -2.49543628 -0.13720127 +H -0.91928762 -2.35363802 -1.06914014 +H -3.19100197 -0.60699559 1.35137051 +H -1.65197294 -0.56010584 2.22063481 +H -2.28793759 0.90575132 1.46079572 +15 +Properties=species:S:1:pos:R:3 A=8.11598 B=3.43678 C=2.66869 mu=1.3894 alpha=49.45 epsHOMO=-0.2617 epsLUMO=0.0733 epsgap=0.335 =521.8605 zpve=0.136091 U0=-233.555951 U=-233.549143 H=-233.548199 G=-233.585602 Cv=23.99 pbc="F F F" +C -0.03841227 1.55621396 0.00935837 +C 0.01907135 0.02716079 -0.02074203 +C 0.73141506 -0.52709328 -1.25454422 +C 0.83975868 -2.05206973 -1.22872655 +O -0.01226470 -0.08514394 -2.38973758 +H 0.96845664 1.98863424 0.03526234 +H -0.54377006 1.93824134 -0.88074407 +H -0.57652955 1.91383386 0.89256698 +H 0.53166867 -0.34991486 0.87240999 +H -0.99727186 -0.38638654 -0.00185289 +H 1.74909346 -0.09943025 -1.28826184 +H 1.34143968 -2.42487137 -2.12957624 +H 1.41822012 -2.39229108 -0.36340871 +H -0.15616765 -2.50443859 -1.18308875 +H 0.43090825 -0.40901616 -3.17979642 +15 +Properties=species:S:1:pos:R:3 A=7.55335 B=3.78323 C=2.80566 mu=1.0758 alpha=49.8 epsHOMO=-0.2476 epsLUMO=0.086 epsgap=0.3336 =507.9614 zpve=0.135681 U0=-233.545899 U=-233.539034 H=-233.53809 G=-233.57582 Cv=23.573 pbc="F F F" +C -0.00857605 1.38097833 0.09454670 +O -0.02255106 -0.00739461 -0.13062576 +C -1.30243341 -0.61997805 -0.02088309 +C -1.18687286 -1.97885751 -0.70303918 +C -1.75587824 -0.74662760 1.43714508 +H 1.00321550 1.73258087 -0.12443496 +H -0.71511468 1.90838275 -0.56674280 +H -0.24909065 1.64967237 1.13384681 +H -2.03737978 -0.00432241 -0.56884198 +H -0.44792779 -2.59945605 -0.18596870 +H -2.14751041 -2.50225525 -0.69102581 +H -0.86524212 -1.85860679 -1.74077836 +H -2.73321482 -1.23674908 1.49205117 +H -1.03621350 -1.34483828 2.00544671 +H -1.84898410 0.22935483 1.92198087 +15 +Properties=species:S:1:pos:R:3 A=6.14183 B=5.17679 C=3.79297 mu=0.1068 alpha=52.92 epsHOMO=-0.2633 epsLUMO=0.0893 epsgap=0.3526 =439.1643 zpve=0.137025 U0=-196.409349 U=-196.403398 H=-196.402453 G=-196.437676 Cv=22.258 pbc="F F F" +C -0.03913204 1.50456305 0.04978913 +C 0.00985856 -0.01113880 0.01248619 +C -1.24167981 -0.66663044 -0.53989979 +C 1.33803387 -0.66895748 -0.27400430 +C 0.75126442 -0.72221586 1.11862571 +H 0.88633040 1.92490040 0.45579358 +H -0.18183878 1.92045743 -0.95489291 +H -0.86832076 1.85815718 0.67439648 +H -1.43570890 -0.34344387 -1.56976411 +H -1.15326757 -1.75757800 -0.54433832 +H -2.12221416 -0.40570820 0.05951361 +H 1.34398374 -1.58235208 -0.86005084 +H 2.20196897 -0.03329084 -0.43929326 +H 1.21949576 -0.12246018 1.89246580 +H 0.36153319 -1.67153717 1.47171932 +13 +Properties=species:S:1:pos:R:3 A=6.49534 B=5.52329 C=3.9108 mu=1.8235 alpha=45.7 epsHOMO=-0.2596 epsLUMO=0.091 epsgap=0.3505 =405.521 zpve=0.112851 U0=-232.335768 U=-232.329981 H=-232.329037 G=-232.364091 Cv=20.719 pbc="F F F" +C -0.03970330 1.50954998 -0.04112233 +C -0.03023556 -0.00335329 -0.06498361 +C -1.24613189 -0.68356648 0.52531190 +C 0.78937201 -0.71129193 -1.06027559 +O 1.22546798 -0.60059036 0.29712283 +H 0.88992772 1.90948478 -0.45296558 +H -0.87952723 1.90350108 -0.62376642 +H -0.14448576 1.87590604 0.98604429 +H -2.15218727 -0.41012616 -0.02629495 +H -1.13412584 -1.77005431 0.49747032 +H -1.38586631 -0.38055453 1.56882757 +H 0.50712690 -1.71386874 -1.38085018 +H 1.37088104 -0.14369322 -1.78640853 +13 +Properties=species:S:1:pos:R:3 A=6.57648 B=5.31603 C=3.98453 mu=1.3822 alpha=45.85 epsHOMO=-0.2494 epsLUMO=0.0776 epsgap=0.327 =401.4888 zpve=0.113237 U0=-232.33341 U=-232.327734 H=-232.32679 G=-232.36147 Cv=21.17 pbc="F F F" +C -0.03714052 1.53215920 0.01332310 +C 0.01344335 0.02117019 0.01922005 +O -1.17476104 -0.59735284 -0.40931260 +C 1.30744798 -0.69902106 -0.27389650 +C 0.70844749 -0.71373504 1.12226318 +H 0.89026861 1.96240279 0.40276135 +H -0.17846151 1.91561262 -1.00518522 +H -0.87011232 1.88955201 0.62730953 +H -1.28352265 -0.40225391 -1.34690641 +H 1.23973813 -1.61642115 -0.84783774 +H 2.20543993 -0.11523820 -0.44744474 +H 1.19539159 -0.13889834 1.90240284 +H 0.24735439 -1.63670241 1.45378480 +10 +Properties=species:S:1:pos:R:3 A=12.18399 B=5.1384 C=3.78868 mu=2.5732 alpha=40.19 epsHOMO=-0.263 epsLUMO=0.0277 epsgap=0.2907 =352.0378 zpve=0.080558 U0=-247.201165 U=-247.196699 H=-247.195755 G=-247.22841 Cv=15.51 pbc="F F F" +N -0.04445152 1.25623533 0.31681915 +C -0.03914559 0.04913710 -0.01670558 +C -1.08749619 -1.04164446 -0.11488033 +C 0.09869688 -1.90754844 -0.58225894 +O 0.99647508 -0.76306629 -0.44028010 +H 0.88935980 1.66481350 0.24916893 +H -1.54324114 -1.32235812 0.83572172 +H -1.86910036 -0.85713839 -0.85325910 +H 0.39739753 -2.72227350 0.08158721 +H 0.06945080 -2.25418345 -1.61796084 +11 +Properties=species:S:1:pos:R:3 A=10.79571 B=4.78732 C=3.54292 mu=2.7119 alpha=42.77 epsHOMO=-0.2415 epsLUMO=-0.0194 epsgap=0.2222 =379.6371 zpve=0.090544 U0=-231.15578 U=-231.150804 H=-231.149859 G=-231.184401 Cv=17.076 pbc="F F F" +O -0.00101746 0.01846628 -0.20114742 +C -0.01405811 1.19658059 0.00205306 +C -1.13542911 2.22979148 0.21957980 +C -0.03500884 3.29097637 0.53052223 +C 1.08469664 2.25947795 0.18994331 +H -1.71642814 2.41772662 -0.68901078 +H -1.83392757 1.98415059 1.02444244 +H -0.05534741 4.17585264 -0.10670963 +H -0.02541477 3.61399048 1.57278917 +H 1.81074389 2.03288534 0.97578973 +H 1.63600801 2.46255380 -0.73376244 +10 +Properties=species:S:1:pos:R:3 A=12.23436 B=4.97895 C=3.70561 mu=3.6671 alpha=39.73 epsHOMO=-0.25 epsLUMO=0.038 epsgap=0.288 =355.0934 zpve=0.080442 U0=-247.225618 U=-247.220897 H=-247.219953 G=-247.253218 Cv=16.1 pbc="F F F" +O 0.03184134 -0.03461682 0.00849836 +C -0.02440334 1.16440533 0.02160811 +C -1.14541322 2.23712809 0.03012901 +C 0.00928805 3.27945878 0.04557758 +N 0.93843838 2.14652109 0.03554396 +H -1.77030529 2.23779730 -0.86428437 +H -1.77632809 2.21765386 0.92007934 +H 0.07170564 3.91863516 -0.84072193 +H 0.06622603 3.89826625 0.94657952 +H 1.94616840 2.09535713 0.03855945 +9 +Properties=species:S:1:pos:R:3 A=12.44643 B=5.23328 C=3.86599 mu=3.9339 alpha=35.4 epsHOMO=-0.2788 epsLUMO=0.0089 epsgap=0.2878 =336.0792 zpve=0.068574 U0=-267.106213 U=-267.101929 H=-267.100985 G=-267.13332 Cv=14.483 pbc="F F F" +O 0.04424004 0.03933243 -0.33071104 +C -0.04854479 1.17416230 0.00410076 +C -1.14211656 2.23611850 0.15338361 +C 0.02332538 3.12357010 0.61681625 +O 0.95663808 2.01190122 0.42603746 +H -1.62573755 2.51482212 -0.78401102 +H -1.90009213 1.99553386 0.90028663 +H 0.28368077 3.96172751 -0.03229287 +H 0.00782250 3.43942655 1.66162725 +10 +Properties=species:S:1:pos:R:3 A=11.54185 B=4.90368 C=3.63309 mu=2.5257 alpha=39.34 epsHOMO=-0.2437 epsLUMO=-0.0258 epsgap=0.2179 =359.152 zpve=0.07965 U0=-247.190194 U=-247.185543 H=-247.184599 G=-247.217688 Cv=16.083 pbc="F F F" +O 0.00053891 0.00665475 -0.09743049 +C -0.01371990 1.19213881 0.03139936 +C -1.10668681 2.26612284 0.17247913 +N -0.03543445 3.25123475 0.48533693 +C 1.05328615 2.29521506 0.14383904 +H -1.65047970 2.42796175 -0.76886054 +H -1.83606786 2.11370530 0.97567410 +H -0.05434600 4.07193609 -0.10727051 +H 1.80754206 2.16277968 0.92736250 +H 1.56737937 2.47130277 -0.81152688 +9 +Properties=species:S:1:pos:R:3 A=12.18264 B=4.94228 C=3.68162 mu=0.8477 alpha=35.94 epsHOMO=-0.2647 epsLUMO=-0.0352 epsgap=0.2295 =344.5473 zpve=0.066989 U0=-267.068488 U=-267.063976 H=-267.063032 G=-267.095887 Cv=15.115 pbc="F F F" +O -0.00031692 0.00676321 -0.17139774 +C -0.01417098 1.18672865 -0.00980279 +C -1.08283120 2.27653381 0.15574094 +O -0.03856115 3.26460423 0.27513986 +C 1.02857270 2.30515693 0.12774311 +H -1.72923855 2.43647507 -0.71671274 +H -1.70219898 2.19346725 1.05800754 +H 1.67366781 2.23923293 1.01324179 +H 1.64705068 2.48224548 -0.76148355 +15 +Properties=species:S:1:pos:R:3 A=9.63416 B=4.10254 C=3.28665 mu=0.095 alpha=52.94 epsHOMO=-0.2896 epsLUMO=0.0927 epsgap=0.3823 =455.0215 zpve=0.138424 U0=-196.407957 U=-196.40245 H=-196.401505 G=-196.436159 Cv=20.299 pbc="F F F" +C -0.47005934 1.44206547 -0.06684548 +C 0.14287306 0.05485144 0.03747984 +C 1.37254693 -0.30295273 -0.84679168 +C 1.95947994 -1.09364561 0.35326039 +C 0.99887433 -0.30768787 1.28563099 +H 0.29210839 2.21844829 0.06844100 +H -0.93614604 1.60094605 -1.04612799 +H -1.24148161 1.59707353 0.69627593 +H -0.63517341 -0.70560132 -0.10055095 +H 1.19338376 -0.84118177 -1.78129390 +H 1.96867777 0.58857708 -1.07004184 +H 1.69873597 -2.15500718 0.30521100 +H 3.03253510 -1.01077235 0.54148058 +H 1.48290386 0.58242428 1.70211026 +H 0.51304296 -0.84979686 2.10121062 +13 +Properties=species:S:1:pos:R:3 A=9.93129 B=4.56362 C=3.63704 mu=1.6826 alpha=45.72 epsHOMO=-0.241 epsLUMO=0.0915 epsgap=0.3325 =407.6909 zpve=0.11459 U0=-232.33123 U=-232.325877 H=-232.324933 G=-232.359589 Cv=18.582 pbc="F F F" +C -0.32308228 1.53751451 0.01947624 +C 0.11847214 0.08900172 -0.00523140 +C 0.87489284 -0.43763303 -1.24721738 +C 1.97841048 -0.80657483 -0.23740356 +O 1.27344926 -0.15419108 0.83794040 +H 0.49211985 2.19658795 -0.29527664 +H -1.17615835 1.68923490 -0.65134808 +H -0.62776963 1.82747912 1.03013205 +H -0.71410200 -0.56389187 0.29597305 +H 0.41033314 -1.26269706 -1.78910031 +H 1.15560811 0.34596269 -1.95459519 +H 2.09501012 -1.88349764 -0.05606083 +H 2.96970344 -0.36924147 -0.40408009 +13 +Properties=species:S:1:pos:R:3 A=10.13697 B=4.32512 C=3.50912 mu=1.8995 alpha=45.45 epsHOMO=-0.2419 epsLUMO=0.0814 epsgap=0.3233 =414.1575 zpve=0.114694 U0=-232.325947 U=-232.320548 H=-232.319604 G=-232.354576 Cv=18.443 pbc="F F F" +C -0.18371124 1.54668909 -0.01671129 +C 0.04513382 0.04386724 0.02270494 +C 1.20301104 -0.54034580 -0.81983464 +O 1.80061686 -1.15530615 0.33924991 +C 0.83391983 -0.54313754 1.21648003 +H 0.75102609 2.09256015 0.15344911 +H -0.58319248 1.86155707 -0.98694169 +H -0.89843724 1.85917126 0.75244153 +H -0.89506736 -0.48768372 -0.14843995 +H 0.93560472 -1.27857588 -1.58543917 +H 1.86392938 0.21379924 -1.27081649 +H 1.29414565 0.20948993 1.87273952 +H 0.31517042 -1.28326856 1.83756393 +13 +Properties=species:S:1:pos:R:3 A=10.09703 B=4.26865 C=3.40487 mu=1.4604 alpha=45.55 epsHOMO=-0.256 epsLUMO=0.0801 epsgap=0.3361 =413.9118 zpve=0.115063 U0=-232.333258 U=-232.328097 H=-232.327153 G=-232.361103 Cv=19.023 pbc="F F F" +O 0.54622847 1.03270424 -0.58398083 +C -0.00112269 -0.11036621 0.01898238 +C 0.13945950 -0.34310429 1.54777117 +C -1.26863784 -0.99876517 1.51632654 +C -1.53844651 -0.26418236 0.17423510 +H 0.20332379 1.80433874 -0.12071219 +H 0.41296647 -0.95857955 -0.53560402 +H 0.98890738 -0.92719626 1.90921867 +H 0.11786549 0.61323034 2.08356053 +H -1.20828813 -2.08191064 1.38036699 +H -1.94143614 -0.79119746 2.35014116 +H -2.00495682 0.71307933 0.34581493 +H -2.09160311 -0.78230202 -0.61249171 +11 +Properties=species:S:1:pos:R:3 A=10.85394 B=4.52867 C=3.62328 mu=2.4158 alpha=38.58 epsHOMO=-0.2465 epsLUMO=0.0604 epsgap=0.3069 =374.4087 zpve=0.091005 U0=-268.248371 U=-268.243234 H=-268.24229 G=-268.276572 Cv=17.344 pbc="F F F" +O 0.07721714 1.41738724 -0.14439016 +C 0.01675156 0.02484791 0.03233817 +C 0.11193823 -0.54392541 1.47000744 +O -1.16387804 -1.20093191 1.32441605 +C -1.41930178 -0.52040930 0.07750673 +H 1.00022214 1.67889479 -0.21697466 +H 0.66036495 -0.50380879 -0.68180327 +H 0.91806589 -1.25385265 1.68878628 +H 0.09146208 0.24427487 2.23499232 +H -2.16139683 0.28183960 0.18222436 +H -1.72867456 -1.20941157 -0.71550887 +15 +Properties=species:S:1:pos:R:3 A=7.14221 B=4.37083 C=3.30265 mu=0.1023 alpha=52.92 epsHOMO=-0.2632 epsLUMO=0.094 epsgap=0.3573 =465.3301 zpve=0.137341 U0=-196.406419 U=-196.40034 H=-196.399396 G=-196.435152 Cv=22.005 pbc="F F F" +C -0.05189850 1.55217435 -0.10318438 +C 0.01226648 0.04690675 0.03747520 +C 1.30115692 -0.70661553 -0.19725724 +C 0.70431939 -0.64893239 1.19003562 +C 1.39750324 0.09481280 2.31078011 +H 0.87404209 2.03543171 0.22162228 +H -0.21641357 1.83695278 -1.14852958 +H -0.87157646 1.97673684 0.48797046 +H -0.88508206 -0.45596941 -0.31580786 +H 1.27663658 -1.64149022 -0.74697967 +H 2.19424067 -0.11404121 -0.37569359 +H 0.21672461 -1.56377934 1.51902400 +H 1.91317356 0.99051175 1.95271747 +H 0.68738009 0.40901468 3.08446972 +H 2.14934633 -0.54151807 2.79111543 +13 +Properties=species:S:1:pos:R:3 A=7.36997 B=4.78662 C=3.53123 mu=1.3092 alpha=45.84 epsHOMO=-0.2518 epsLUMO=0.0822 epsgap=0.334 =418.298 zpve=0.113827 U0=-232.32907 U=-232.323327 H=-232.322383 G=-232.357426 Cv=20.702 pbc="F F F" +C -0.07992786 1.55914739 -0.03875994 +C 0.00042206 0.05111569 0.04346551 +C 1.31748624 -0.66230034 -0.20269965 +C 0.71624326 -0.61854924 1.18128126 +O 1.28134126 0.21474798 2.15341739 +H 0.80207677 2.01979988 0.41147972 +H -0.15235410 1.89225261 -1.07968732 +H -0.95836082 1.93564781 0.49643179 +H -0.88615174 -0.46939753 -0.30918496 +H 1.32384464 -1.60086657 -0.74666557 +H 2.18619315 -0.03316813 -0.37068758 +H 0.28509951 -1.54025035 1.57291630 +H 2.12931661 -0.16234387 2.40895930 +14 +Properties=species:S:1:pos:R:3 A=7.53724 B=4.74514 C=3.54049 mu=1.2483 alpha=49.79 epsHOMO=-0.2199 epsLUMO=0.0931 epsgap=0.313 =432.5081 zpve=0.125556 U0=-212.438188 U=-212.432286 H=-212.431342 G=-212.466725 Cv=20.993 pbc="F F F" +C -0.17034561 1.55765735 -0.10065470 +C 0.01075256 0.05574638 -0.05225833 +C 0.71794239 -0.67802425 -1.14204150 +N 1.29811574 -0.59777508 0.19386866 +C 2.50047290 0.20256923 0.36428818 +H 0.60876703 2.05717913 -0.68119301 +H -1.13238698 1.79957181 -0.56489127 +H -0.17350949 1.98946323 0.90659028 +H -0.81010441 -0.46148051 0.44427396 +H 0.39136106 -1.66274618 -1.46771171 +H 1.16668484 -0.06908735 -1.92776126 +H 2.58340476 1.06745445 -0.31262255 +H 2.55143652 0.56892747 1.39502638 +H 3.37185012 -0.43769461 0.19201862 +13 +Properties=species:S:1:pos:R:3 A=8.15202 B=4.38313 C=3.43318 mu=1.8159 alpha=46.02 epsHOMO=-0.2573 epsLUMO=0.0984 epsgap=0.3557 =432.2224 zpve=0.113178 U0=-232.334436 U=-232.32857 H=-232.327626 G=-232.363064 Cv=20.451 pbc="F F F" +C -0.03345961 1.54674842 -0.13373520 +C -0.04966080 0.05914273 0.10861437 +O 1.17261123 -0.65888877 -0.09925231 +C 0.62653087 -0.62548063 1.22492030 +C 1.43849738 0.05647689 2.29618065 +H 0.84261573 2.02417904 0.30895947 +H -0.02020603 1.75197977 -1.20938503 +H -0.93419215 2.01073729 0.28317577 +H -0.92262410 -0.44789053 -0.31001063 +H 0.19593793 -1.58039168 1.53656778 +H 1.84118250 1.01302927 1.95813013 +H 0.82514514 0.22925358 3.18745348 +H 2.28152757 -0.57796414 2.58961605 diff --git a/latest/_static/refs.bib b/latest/_static/refs.bib new file mode 100644 index 000000000..c1c9a2c03 --- /dev/null +++ b/latest/_static/refs.bib @@ -0,0 +1,84 @@ +@article{behler_generalized_2007, + title = {Generalized {{Neural-Network Representation}} of {{High-Dimensional Potential-Energy Surfaces}}}, + author = {Behler, J{\"o}rg and Parrinello, Michele}, + year = {2007}, + month = apr, + journal = {Phys. Rev. Lett.}, + volume = {98}, + number = {14}, + pages = {146401}, + publisher = {{American Physical Society}}, + doi = {10.1103/PhysRevLett.98.146401}, + urldate = {2023-08-03} +} + +@article{bartok_representing_2013, + title = {On Representing Chemical Environments}, + author = {Bart{\'o}k, Albert P. and Kondor, Risi and Cs{\'a}nyi, G{\'a}bor}, + year = {2013}, + month = may, + journal = {Phys. Rev. B}, + volume = {87}, + number = {18}, + pages = {184115}, + publisher = {{American Physical Society}}, + doi = {10.1103/PhysRevB.87.184115}, + urldate = {2022-02-24} +} + +@article{willatt_feature_2018, + title = {Feature Optimization for Atomistic Machine Learning Yields a Data-Driven Construction of the Periodic Table of the Elements}, + author = {Willatt, Michael J. and Musil, F{\'e}lix and Ceriotti, Michele}, + year = {2018}, + month = dec, + journal = {Phys. Chem. Chem. Phys.}, + volume = {20}, + number = {47}, + pages = {29661--29668}, + publisher = {{The Royal Society of Chemistry}}, + issn = {1463-9084}, + doi = {10.1039/C8CP05921G}, + urldate = {2024-02-19}, + langid = {english} +} + +@article{mazitov_surface_2024, + author={Mazitov, Arslan and Springer, Maximilian A. and Lopanitsyna, Nataliya and Fraux, Guillaume and De, Sandip and Ceriotti, Michele}, + title={Surface segregation in high-entropy alloys from alchemical machine learning}, + journal={Journal of Physics: Materials}, + url={http://iopscience.iop.org/article/10.1088/2515-7639/ad2983}, + year={2024}, +} + +@article{lopanitsyna_modeling_2023, + title = {Modeling high-entropy transition metal alloys with alchemical compression}, + author = {Lopanitsyna, Nataliya and Fraux, Guillaume and Springer, Maximilian A. and De, Sandip and Ceriotti, Michele}, + journal = {Phys. Rev. Mater.}, + volume = {7}, + issue = {4}, + pages = {045802}, + numpages = {15}, + year = {2023}, + month = {Apr}, + publisher = {American Physical Society}, + doi = {10.1103/PhysRevMaterials.7.045802}, + url = {https://link.aps.org/doi/10.1103/PhysRevMaterials.7.045802} +} + +@article{bigi_smooth_2022, + author = {Bigi, Filippo and Huguenin-Dumittan, Kevin K. and Ceriotti, Michele and Manolopoulos, David E.}, + title = "{A smooth basis for atomistic machine learning}", + journal = {The Journal of Chemical Physics}, + volume = {157}, + number = {23}, + pages = {234101}, + year = {2022}, + month = {12}, + issn = {0021-9606}, + doi = {10.1063/5.0124363}, + url = {https://doi.org/10.1063/5.0124363}, +} + + + + diff --git a/latest/_static/scripts/furo-extensions.js b/latest/_static/scripts/furo-extensions.js new file mode 100644 index 000000000..e69de29bb diff --git a/latest/_static/scripts/furo.js b/latest/_static/scripts/furo.js new file mode 100644 index 000000000..0267c7e11 --- /dev/null +++ b/latest/_static/scripts/furo.js @@ -0,0 +1,3 @@ +/*! For license information please see furo.js.LICENSE.txt */ +(()=>{var t={856:function(t,e,n){var o,r;r=void 0!==n.g?n.g:"undefined"!=typeof window?window:this,o=function(){return function(t){"use strict";var e={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},n=function(t,e,n){if(n.settings.events){var o=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n});e.dispatchEvent(o)}},o=function(t){var e=0;if(t.offsetParent)for(;t;)e+=t.offsetTop,t=t.offsetParent;return e>=0?e:0},r=function(t){t&&t.sort((function(t,e){return o(t.content)=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)},l=function(t,e){var n=t[t.length-1];if(function(t,e){return!(!s()||!c(t.content,e,!0))}(n,e))return n;for(var o=t.length-1;o>=0;o--)if(c(t[o].content,e))return t[o]},a=function(t,e){if(e.nested&&t.parentNode){var n=t.parentNode.closest("li");n&&(n.classList.remove(e.nestedClass),a(n,e))}},i=function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.remove(e.navClass),t.content.classList.remove(e.contentClass),a(o,e),n("gumshoeDeactivate",o,{link:t.nav,content:t.content,settings:e}))}},u=function(t,e){if(e.nested){var n=t.parentNode.closest("li");n&&(n.classList.add(e.nestedClass),u(n,e))}};return function(o,c){var s,a,d,f,m,v={setup:function(){s=document.querySelectorAll(o),a=[],Array.prototype.forEach.call(s,(function(t){var e=document.getElementById(decodeURIComponent(t.hash.substr(1)));e&&a.push({nav:t,content:e})})),r(a)},detect:function(){var t=l(a,m);t?d&&t.content===d.content||(i(d,m),function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.add(e.navClass),t.content.classList.add(e.contentClass),u(o,e),n("gumshoeActivate",o,{link:t.nav,content:t.content,settings:e}))}}(t,m),d=t):d&&(i(d,m),d=null)}},h=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame(v.detect)},g=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame((function(){r(a),v.detect()}))};return v.destroy=function(){d&&i(d,m),t.removeEventListener("scroll",h,!1),m.reflow&&t.removeEventListener("resize",g,!1),a=null,s=null,d=null,f=null,m=null},m=function(){var t={};return Array.prototype.forEach.call(arguments,(function(e){for(var n in e){if(!e.hasOwnProperty(n))return;t[n]=e[n]}})),t}(e,c||{}),v.setup(),v.detect(),t.addEventListener("scroll",h,!1),m.reflow&&t.addEventListener("resize",g,!1),v}}(r)}.apply(e,[]),void 0===o||(t.exports=o)}},e={};function n(o){var r=e[o];if(void 0!==r)return r.exports;var c=e[o]={exports:{}};return t[o].call(c.exports,c,c.exports,n),c.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var o in e)n.o(e,o)&&!n.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{"use strict";var t=n(856),e=n.n(t),o=null,r=null,c=window.pageYOffset||document.documentElement.scrollTop;const s=64;function l(){const t=localStorage.getItem("theme")||"auto";var e;"light"!==(e=window.matchMedia("(prefers-color-scheme: dark)").matches?"auto"===t?"light":"light"==t?"dark":"auto":"auto"===t?"dark":"dark"==t?"light":"auto")&&"dark"!==e&&"auto"!==e&&(console.error(`Got invalid theme mode: ${e}. Resetting to auto.`),e="auto"),document.body.dataset.theme=e,localStorage.setItem("theme",e),console.log(`Changed to ${e} mode.`)}function a(){!function(){const t=document.getElementsByClassName("theme-toggle");Array.from(t).forEach((t=>{t.addEventListener("click",l)}))}(),function(){let t=0,e=!1;window.addEventListener("scroll",(function(n){t=window.scrollY,e||(window.requestAnimationFrame((function(){var n;n=t,0==Math.floor(r.getBoundingClientRect().top)?r.classList.add("scrolled"):r.classList.remove("scrolled"),function(t){tc&&document.documentElement.classList.remove("show-back-to-top"),c=t}(n),function(t){null!==o&&(0==t?o.scrollTo(0,0):Math.ceil(t)>=Math.floor(document.documentElement.scrollHeight-window.innerHeight)?o.scrollTo(0,o.scrollHeight):document.querySelector(".scroll-current"))}(n),e=!1})),e=!0)})),window.scroll()}(),null!==o&&new(e())(".toc-tree a",{reflow:!0,recursive:!0,navClass:"scroll-current",offset:()=>{let t=parseFloat(getComputedStyle(document.documentElement).fontSize);return r.getBoundingClientRect().height+2.5*t+1}})}document.addEventListener("DOMContentLoaded",(function(){document.body.parentNode.classList.remove("no-js"),r=document.querySelector("header"),o=document.querySelector(".toc-scroll"),a()}))})()})(); +//# sourceMappingURL=furo.js.map \ No newline at end of file diff --git a/latest/_static/scripts/furo.js.LICENSE.txt b/latest/_static/scripts/furo.js.LICENSE.txt new file mode 100644 index 000000000..1632189c7 --- /dev/null +++ b/latest/_static/scripts/furo.js.LICENSE.txt @@ -0,0 +1,7 @@ +/*! + * gumshoejs v5.1.2 (patched by @pradyunsg) + * A simple, framework-agnostic scrollspy script. + * (c) 2019 Chris Ferdinandi + * MIT License + * http://github.com/cferdinandi/gumshoe + */ diff --git a/latest/_static/scripts/furo.js.map b/latest/_static/scripts/furo.js.map new file mode 100644 index 000000000..c3b37aaa9 --- /dev/null +++ b/latest/_static/scripts/furo.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scripts/furo.js","mappings":";iCAAA,MAQWA,SAWS,IAAX,EAAAC,EACH,EAAAA,EACkB,oBAAXC,OACLA,OACAC,KAbO,EAAF,WACP,OAaJ,SAAUD,GACR,aAMA,IAAIE,EAAW,CAEbC,SAAU,SACVC,aAAc,SAGdC,QAAQ,EACRC,YAAa,SAGbC,OAAQ,EACRC,QAAQ,EAGRC,QAAQ,GA6BNC,EAAY,SAAUC,EAAMC,EAAMC,GAEpC,GAAKA,EAAOC,SAASL,OAArB,CAGA,IAAIM,EAAQ,IAAIC,YAAYL,EAAM,CAChCM,SAAS,EACTC,YAAY,EACZL,OAAQA,IAIVD,EAAKO,cAAcJ,EAVgB,CAWrC,EAOIK,EAAe,SAAUR,GAC3B,IAAIS,EAAW,EACf,GAAIT,EAAKU,aACP,KAAOV,GACLS,GAAYT,EAAKW,UACjBX,EAAOA,EAAKU,aAGhB,OAAOD,GAAY,EAAIA,EAAW,CACpC,EAMIG,EAAe,SAAUC,GACvBA,GACFA,EAASC,MAAK,SAAUC,EAAOC,GAG7B,OAFcR,EAAaO,EAAME,SACnBT,EAAaQ,EAAMC,UACF,EACxB,CACT,GAEJ,EAwCIC,EAAW,SAAUlB,EAAME,EAAUiB,GACvC,IAAIC,EAASpB,EAAKqB,wBACd1B,EAnCU,SAAUO,GAExB,MAA+B,mBAApBA,EAASP,OACX2B,WAAWpB,EAASP,UAItB2B,WAAWpB,EAASP,OAC7B,CA2Be4B,CAAUrB,GACvB,OAAIiB,EAEAK,SAASJ,EAAOD,OAAQ,KACvB/B,EAAOqC,aAAeC,SAASC,gBAAgBC,cAG7CJ,SAASJ,EAAOS,IAAK,KAAOlC,CACrC,EAMImC,EAAa,WACf,OACEC,KAAKC,KAAK5C,EAAOqC,YAAcrC,EAAO6C,cAnCjCF,KAAKG,IACVR,SAASS,KAAKC,aACdV,SAASC,gBAAgBS,aACzBV,SAASS,KAAKE,aACdX,SAASC,gBAAgBU,aACzBX,SAASS,KAAKP,aACdF,SAASC,gBAAgBC,aAkC7B,EAmBIU,EAAY,SAAUzB,EAAUX,GAClC,IAAIqC,EAAO1B,EAASA,EAAS2B,OAAS,GACtC,GAbgB,SAAUC,EAAMvC,GAChC,SAAI4B,MAAgBZ,EAASuB,EAAKxB,QAASf,GAAU,GAEvD,CAUMwC,CAAYH,EAAMrC,GAAW,OAAOqC,EACxC,IAAK,IAAII,EAAI9B,EAAS2B,OAAS,EAAGG,GAAK,EAAGA,IACxC,GAAIzB,EAASL,EAAS8B,GAAG1B,QAASf,GAAW,OAAOW,EAAS8B,EAEjE,EAOIC,EAAmB,SAAUC,EAAK3C,GAEpC,GAAKA,EAAST,QAAWoD,EAAIC,WAA7B,CAGA,IAAIC,EAAKF,EAAIC,WAAWE,QAAQ,MAC3BD,IAGLA,EAAGE,UAAUC,OAAOhD,EAASR,aAG7BkD,EAAiBG,EAAI7C,GAV0B,CAWjD,EAOIiD,EAAa,SAAUC,EAAOlD,GAEhC,GAAKkD,EAAL,CAGA,IAAIL,EAAKK,EAAMP,IAAIG,QAAQ,MACtBD,IAGLA,EAAGE,UAAUC,OAAOhD,EAASX,UAC7B6D,EAAMnC,QAAQgC,UAAUC,OAAOhD,EAASV,cAGxCoD,EAAiBG,EAAI7C,GAGrBJ,EAAU,oBAAqBiD,EAAI,CACjCM,KAAMD,EAAMP,IACZ5B,QAASmC,EAAMnC,QACff,SAAUA,IAjBM,CAmBpB,EAOIoD,EAAiB,SAAUT,EAAK3C,GAElC,GAAKA,EAAST,OAAd,CAGA,IAAIsD,EAAKF,EAAIC,WAAWE,QAAQ,MAC3BD,IAGLA,EAAGE,UAAUM,IAAIrD,EAASR,aAG1B4D,EAAeP,EAAI7C,GAVS,CAW9B,EA6LA,OA1JkB,SAAUsD,EAAUC,GAKpC,IACIC,EAAU7C,EAAU8C,EAASC,EAAS1D,EADtC2D,EAAa,CAUjBA,MAAmB,WAEjBH,EAAWhC,SAASoC,iBAAiBN,GAGrC3C,EAAW,GAGXkD,MAAMC,UAAUC,QAAQC,KAAKR,GAAU,SAAUjB,GAE/C,IAAIxB,EAAUS,SAASyC,eACrBC,mBAAmB3B,EAAK4B,KAAKC,OAAO,KAEjCrD,GAGLJ,EAAS0D,KAAK,CACZ1B,IAAKJ,EACLxB,QAASA,GAEb,IAGAL,EAAaC,EACf,EAKAgD,OAAoB,WAElB,IAAIW,EAASlC,EAAUzB,EAAUX,GAG5BsE,EASDb,GAAWa,EAAOvD,UAAY0C,EAAQ1C,UAG1CkC,EAAWQ,EAASzD,GAzFT,SAAUkD,EAAOlD,GAE9B,GAAKkD,EAAL,CAGA,IAAIL,EAAKK,EAAMP,IAAIG,QAAQ,MACtBD,IAGLA,EAAGE,UAAUM,IAAIrD,EAASX,UAC1B6D,EAAMnC,QAAQgC,UAAUM,IAAIrD,EAASV,cAGrC8D,EAAeP,EAAI7C,GAGnBJ,EAAU,kBAAmBiD,EAAI,CAC/BM,KAAMD,EAAMP,IACZ5B,QAASmC,EAAMnC,QACff,SAAUA,IAjBM,CAmBpB,CAqEIuE,CAASD,EAAQtE,GAGjByD,EAAUa,GAfJb,IACFR,EAAWQ,EAASzD,GACpByD,EAAU,KAchB,GAMIe,EAAgB,SAAUvE,GAExByD,GACFxE,EAAOuF,qBAAqBf,GAI9BA,EAAUxE,EAAOwF,sBAAsBf,EAAWgB,OACpD,EAMIC,EAAgB,SAAU3E,GAExByD,GACFxE,EAAOuF,qBAAqBf,GAI9BA,EAAUxE,EAAOwF,uBAAsB,WACrChE,EAAaC,GACbgD,EAAWgB,QACb,GACF,EAkDA,OA7CAhB,EAAWkB,QAAU,WAEfpB,GACFR,EAAWQ,EAASzD,GAItBd,EAAO4F,oBAAoB,SAAUN,GAAe,GAChDxE,EAASN,QACXR,EAAO4F,oBAAoB,SAAUF,GAAe,GAItDjE,EAAW,KACX6C,EAAW,KACXC,EAAU,KACVC,EAAU,KACV1D,EAAW,IACb,EAOEA,EA3XS,WACX,IAAI+E,EAAS,CAAC,EAOd,OANAlB,MAAMC,UAAUC,QAAQC,KAAKgB,WAAW,SAAUC,GAChD,IAAK,IAAIC,KAAOD,EAAK,CACnB,IAAKA,EAAIE,eAAeD,GAAM,OAC9BH,EAAOG,GAAOD,EAAIC,EACpB,CACF,IACOH,CACT,CAkXeK,CAAOhG,EAAUmE,GAAW,CAAC,GAGxCI,EAAW0B,QAGX1B,EAAWgB,SAGXzF,EAAOoG,iBAAiB,SAAUd,GAAe,GAC7CxE,EAASN,QACXR,EAAOoG,iBAAiB,SAAUV,GAAe,GAS9CjB,CACT,CAOF,CArcW4B,CAAQvG,EAChB,UAFM,SAEN,uBCXDwG,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaE,QAGrB,IAAIC,EAASN,EAAyBE,GAAY,CAGjDG,QAAS,CAAC,GAOX,OAHAE,EAAoBL,GAAU1B,KAAK8B,EAAOD,QAASC,EAAQA,EAAOD,QAASJ,GAGpEK,EAAOD,OACf,CCrBAJ,EAAoBO,EAAKF,IACxB,IAAIG,EAASH,GAAUA,EAAOI,WAC7B,IAAOJ,EAAiB,QACxB,IAAM,EAEP,OADAL,EAAoBU,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLdR,EAAoBU,EAAI,CAACN,EAASQ,KACjC,IAAI,IAAInB,KAAOmB,EACXZ,EAAoBa,EAAED,EAAYnB,KAASO,EAAoBa,EAAET,EAASX,IAC5EqB,OAAOC,eAAeX,EAASX,EAAK,CAAEuB,YAAY,EAAMC,IAAKL,EAAWnB,IAE1E,ECNDO,EAAoBxG,EAAI,WACvB,GAA0B,iBAAf0H,WAAyB,OAAOA,WAC3C,IACC,OAAOxH,MAAQ,IAAIyH,SAAS,cAAb,EAChB,CAAE,MAAOC,GACR,GAAsB,iBAAX3H,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBuG,EAAoBa,EAAI,CAACrB,EAAK6B,IAAUP,OAAOzC,UAAUqB,eAAenB,KAAKiB,EAAK6B,4CCK9EC,EAAY,KACZC,EAAS,KACTC,EAAgB/H,OAAO6C,aAAeP,SAASC,gBAAgByF,UACnE,MAAMC,EAAmB,GA2EzB,SAASC,IACP,MAAMC,EAAeC,aAAaC,QAAQ,UAAY,OAZxD,IAAkBC,EACH,WADGA,EAaItI,OAAOuI,WAAW,gCAAgCC,QAI/C,SAAjBL,EACO,QACgB,SAAhBA,EACA,OAEA,OAIU,SAAjBA,EACO,OACgB,QAAhBA,EACA,QAEA,SA9BoB,SAATG,GAA4B,SAATA,IACzCG,QAAQC,MAAM,2BAA2BJ,yBACzCA,EAAO,QAGThG,SAASS,KAAK4F,QAAQC,MAAQN,EAC9BF,aAAaS,QAAQ,QAASP,GAC9BG,QAAQK,IAAI,cAAcR,UA0B5B,CAkDA,SAASnC,KART,WAEE,MAAM4C,EAAUzG,SAAS0G,uBAAuB,gBAChDrE,MAAMsE,KAAKF,GAASlE,SAASqE,IAC3BA,EAAI9C,iBAAiB,QAAS8B,EAAe,GAEjD,CAGEiB,GA9CF,WAEE,IAAIC,EAA6B,EAC7BC,GAAU,EAEdrJ,OAAOoG,iBAAiB,UAAU,SAAUuB,GAC1CyB,EAA6BpJ,OAAOsJ,QAE/BD,IACHrJ,OAAOwF,uBAAsB,WAzDnC,IAAuB+D,IA0DDH,EA9GkC,GAAlDzG,KAAK6G,MAAM1B,EAAO7F,wBAAwBQ,KAC5CqF,EAAOjE,UAAUM,IAAI,YAErB2D,EAAOjE,UAAUC,OAAO,YAI5B,SAAmCyF,GAC7BA,EAAYtB,EACd3F,SAASC,gBAAgBsB,UAAUC,OAAO,oBAEtCyF,EAAYxB,EACdzF,SAASC,gBAAgBsB,UAAUM,IAAI,oBAC9BoF,EAAYxB,GACrBzF,SAASC,gBAAgBsB,UAAUC,OAAO,oBAG9CiE,EAAgBwB,CAClB,CAoCEE,CAA0BF,GAlC5B,SAA6BA,GACT,OAAd1B,IAKa,GAAb0B,EACF1B,EAAU6B,SAAS,EAAG,GAGtB/G,KAAKC,KAAK2G,IACV5G,KAAK6G,MAAMlH,SAASC,gBAAgBS,aAAehD,OAAOqC,aAE1DwF,EAAU6B,SAAS,EAAG7B,EAAU7E,cAGhBV,SAASqH,cAAc,mBAc3C,CAKEC,CAAoBL,GAwDdF,GAAU,CACZ,IAEAA,GAAU,EAEd,IACArJ,OAAO6J,QACT,CA6BEC,GA1BkB,OAAdjC,GAKJ,IAAI,IAAJ,CAAY,cAAe,CACzBrH,QAAQ,EACRuJ,WAAW,EACX5J,SAAU,iBACVI,OAAQ,KACN,IAAIyJ,EAAM9H,WAAW+H,iBAAiB3H,SAASC,iBAAiB2H,UAChE,OAAOpC,EAAO7F,wBAAwBkI,OAAS,IAAMH,EAAM,CAAC,GAiBlE,CAcA1H,SAAS8D,iBAAiB,oBAT1B,WACE9D,SAASS,KAAKW,WAAWG,UAAUC,OAAO,SAE1CgE,EAASxF,SAASqH,cAAc,UAChC9B,EAAYvF,SAASqH,cAAc,eAEnCxD,GACF","sources":["webpack:///./src/furo/assets/scripts/gumshoe-patched.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///./src/furo/assets/scripts/furo.js"],"sourcesContent":["/*!\n * gumshoejs v5.1.2 (patched by @pradyunsg)\n * A simple, framework-agnostic scrollspy script.\n * (c) 2019 Chris Ferdinandi\n * MIT License\n * http://github.com/cferdinandi/gumshoe\n */\n\n(function (root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define([], function () {\n return factory(root);\n });\n } else if (typeof exports === \"object\") {\n module.exports = factory(root);\n } else {\n root.Gumshoe = factory(root);\n }\n})(\n typeof global !== \"undefined\"\n ? global\n : typeof window !== \"undefined\"\n ? window\n : this,\n function (window) {\n \"use strict\";\n\n //\n // Defaults\n //\n\n var defaults = {\n // Active classes\n navClass: \"active\",\n contentClass: \"active\",\n\n // Nested navigation\n nested: false,\n nestedClass: \"active\",\n\n // Offset & reflow\n offset: 0,\n reflow: false,\n\n // Event support\n events: true,\n };\n\n //\n // Methods\n //\n\n /**\n * Merge two or more objects together.\n * @param {Object} objects The objects to merge together\n * @returns {Object} Merged values of defaults and options\n */\n var extend = function () {\n var merged = {};\n Array.prototype.forEach.call(arguments, function (obj) {\n for (var key in obj) {\n if (!obj.hasOwnProperty(key)) return;\n merged[key] = obj[key];\n }\n });\n return merged;\n };\n\n /**\n * Emit a custom event\n * @param {String} type The event type\n * @param {Node} elem The element to attach the event to\n * @param {Object} detail Any details to pass along with the event\n */\n var emitEvent = function (type, elem, detail) {\n // Make sure events are enabled\n if (!detail.settings.events) return;\n\n // Create a new event\n var event = new CustomEvent(type, {\n bubbles: true,\n cancelable: true,\n detail: detail,\n });\n\n // Dispatch the event\n elem.dispatchEvent(event);\n };\n\n /**\n * Get an element's distance from the top of the Document.\n * @param {Node} elem The element\n * @return {Number} Distance from the top in pixels\n */\n var getOffsetTop = function (elem) {\n var location = 0;\n if (elem.offsetParent) {\n while (elem) {\n location += elem.offsetTop;\n elem = elem.offsetParent;\n }\n }\n return location >= 0 ? location : 0;\n };\n\n /**\n * Sort content from first to last in the DOM\n * @param {Array} contents The content areas\n */\n var sortContents = function (contents) {\n if (contents) {\n contents.sort(function (item1, item2) {\n var offset1 = getOffsetTop(item1.content);\n var offset2 = getOffsetTop(item2.content);\n if (offset1 < offset2) return -1;\n return 1;\n });\n }\n };\n\n /**\n * Get the offset to use for calculating position\n * @param {Object} settings The settings for this instantiation\n * @return {Float} The number of pixels to offset the calculations\n */\n var getOffset = function (settings) {\n // if the offset is a function run it\n if (typeof settings.offset === \"function\") {\n return parseFloat(settings.offset());\n }\n\n // Otherwise, return it as-is\n return parseFloat(settings.offset);\n };\n\n /**\n * Get the document element's height\n * @private\n * @returns {Number}\n */\n var getDocumentHeight = function () {\n return Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n document.body.offsetHeight,\n document.documentElement.offsetHeight,\n document.body.clientHeight,\n document.documentElement.clientHeight,\n );\n };\n\n /**\n * Determine if an element is in view\n * @param {Node} elem The element\n * @param {Object} settings The settings for this instantiation\n * @param {Boolean} bottom If true, check if element is above bottom of viewport instead\n * @return {Boolean} Returns true if element is in the viewport\n */\n var isInView = function (elem, settings, bottom) {\n var bounds = elem.getBoundingClientRect();\n var offset = getOffset(settings);\n if (bottom) {\n return (\n parseInt(bounds.bottom, 10) <\n (window.innerHeight || document.documentElement.clientHeight)\n );\n }\n return parseInt(bounds.top, 10) <= offset;\n };\n\n /**\n * Check if at the bottom of the viewport\n * @return {Boolean} If true, page is at the bottom of the viewport\n */\n var isAtBottom = function () {\n if (\n Math.ceil(window.innerHeight + window.pageYOffset) >=\n getDocumentHeight()\n )\n return true;\n return false;\n };\n\n /**\n * Check if the last item should be used (even if not at the top of the page)\n * @param {Object} item The last item\n * @param {Object} settings The settings for this instantiation\n * @return {Boolean} If true, use the last item\n */\n var useLastItem = function (item, settings) {\n if (isAtBottom() && isInView(item.content, settings, true)) return true;\n return false;\n };\n\n /**\n * Get the active content\n * @param {Array} contents The content areas\n * @param {Object} settings The settings for this instantiation\n * @return {Object} The content area and matching navigation link\n */\n var getActive = function (contents, settings) {\n var last = contents[contents.length - 1];\n if (useLastItem(last, settings)) return last;\n for (var i = contents.length - 1; i >= 0; i--) {\n if (isInView(contents[i].content, settings)) return contents[i];\n }\n };\n\n /**\n * Deactivate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var deactivateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested || !nav.parentNode) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Remove the active class\n li.classList.remove(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n deactivateNested(li, settings);\n };\n\n /**\n * Deactivate a nav and content area\n * @param {Object} items The nav item and content to deactivate\n * @param {Object} settings The settings for this instantiation\n */\n var deactivate = function (items, settings) {\n // Make sure there are items to deactivate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Remove the active class from the nav and content\n li.classList.remove(settings.navClass);\n items.content.classList.remove(settings.contentClass);\n\n // Deactivate any parent navs in a nested navigation\n deactivateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeDeactivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Activate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var activateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Add the active class\n li.classList.add(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n activateNested(li, settings);\n };\n\n /**\n * Activate a nav and content area\n * @param {Object} items The nav item and content to activate\n * @param {Object} settings The settings for this instantiation\n */\n var activate = function (items, settings) {\n // Make sure there are items to activate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Add the active class to the nav and content\n li.classList.add(settings.navClass);\n items.content.classList.add(settings.contentClass);\n\n // Activate any parent navs in a nested navigation\n activateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeActivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Create the Constructor object\n * @param {String} selector The selector to use for navigation items\n * @param {Object} options User options and settings\n */\n var Constructor = function (selector, options) {\n //\n // Variables\n //\n\n var publicAPIs = {};\n var navItems, contents, current, timeout, settings;\n\n //\n // Methods\n //\n\n /**\n * Set variables from DOM elements\n */\n publicAPIs.setup = function () {\n // Get all nav items\n navItems = document.querySelectorAll(selector);\n\n // Create contents array\n contents = [];\n\n // Loop through each item, get it's matching content, and push to the array\n Array.prototype.forEach.call(navItems, function (item) {\n // Get the content for the nav item\n var content = document.getElementById(\n decodeURIComponent(item.hash.substr(1)),\n );\n if (!content) return;\n\n // Push to the contents array\n contents.push({\n nav: item,\n content: content,\n });\n });\n\n // Sort contents by the order they appear in the DOM\n sortContents(contents);\n };\n\n /**\n * Detect which content is currently active\n */\n publicAPIs.detect = function () {\n // Get the active content\n var active = getActive(contents, settings);\n\n // if there's no active content, deactivate and bail\n if (!active) {\n if (current) {\n deactivate(current, settings);\n current = null;\n }\n return;\n }\n\n // If the active content is the one currently active, do nothing\n if (current && active.content === current.content) return;\n\n // Deactivate the current content and activate the new content\n deactivate(current, settings);\n activate(active, settings);\n\n // Update the currently active content\n current = active;\n };\n\n /**\n * Detect the active content on scroll\n * Debounced for performance\n */\n var scrollHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(publicAPIs.detect);\n };\n\n /**\n * Update content sorting on resize\n * Debounced for performance\n */\n var resizeHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(function () {\n sortContents(contents);\n publicAPIs.detect();\n });\n };\n\n /**\n * Destroy the current instantiation\n */\n publicAPIs.destroy = function () {\n // Undo DOM changes\n if (current) {\n deactivate(current, settings);\n }\n\n // Remove event listeners\n window.removeEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.removeEventListener(\"resize\", resizeHandler, false);\n }\n\n // Reset variables\n contents = null;\n navItems = null;\n current = null;\n timeout = null;\n settings = null;\n };\n\n /**\n * Initialize the current instantiation\n */\n var init = function () {\n // Merge user options into defaults\n settings = extend(defaults, options || {});\n\n // Setup variables based on the current DOM\n publicAPIs.setup();\n\n // Find the currently active content\n publicAPIs.detect();\n\n // Setup event listeners\n window.addEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.addEventListener(\"resize\", resizeHandler, false);\n }\n };\n\n //\n // Initialize and return the public APIs\n //\n\n init();\n return publicAPIs;\n };\n\n //\n // Return the Constructor\n //\n\n return Constructor;\n },\n);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","import Gumshoe from \"./gumshoe-patched.js\";\n\n////////////////////////////////////////////////////////////////////////////////\n// Scroll Handling\n////////////////////////////////////////////////////////////////////////////////\nvar tocScroll = null;\nvar header = null;\nvar lastScrollTop = window.pageYOffset || document.documentElement.scrollTop;\nconst GO_TO_TOP_OFFSET = 64;\n\nfunction scrollHandlerForHeader() {\n if (Math.floor(header.getBoundingClientRect().top) == 0) {\n header.classList.add(\"scrolled\");\n } else {\n header.classList.remove(\"scrolled\");\n }\n}\n\nfunction scrollHandlerForBackToTop(positionY) {\n if (positionY < GO_TO_TOP_OFFSET) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n } else {\n if (positionY < lastScrollTop) {\n document.documentElement.classList.add(\"show-back-to-top\");\n } else if (positionY > lastScrollTop) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n }\n }\n lastScrollTop = positionY;\n}\n\nfunction scrollHandlerForTOC(positionY) {\n if (tocScroll === null) {\n return;\n }\n\n // top of page.\n if (positionY == 0) {\n tocScroll.scrollTo(0, 0);\n } else if (\n // bottom of page.\n Math.ceil(positionY) >=\n Math.floor(document.documentElement.scrollHeight - window.innerHeight)\n ) {\n tocScroll.scrollTo(0, tocScroll.scrollHeight);\n } else {\n // somewhere in the middle.\n const current = document.querySelector(\".scroll-current\");\n if (current == null) {\n return;\n }\n\n // https://github.com/pypa/pip/issues/9159 This breaks scroll behaviours.\n // // scroll the currently \"active\" heading in toc, into view.\n // const rect = current.getBoundingClientRect();\n // if (0 > rect.top) {\n // current.scrollIntoView(true); // the argument is \"alignTop\"\n // } else if (rect.bottom > window.innerHeight) {\n // current.scrollIntoView(false);\n // }\n }\n}\n\nfunction scrollHandler(positionY) {\n scrollHandlerForHeader();\n scrollHandlerForBackToTop(positionY);\n scrollHandlerForTOC(positionY);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Theme Toggle\n////////////////////////////////////////////////////////////////////////////////\nfunction setTheme(mode) {\n if (mode !== \"light\" && mode !== \"dark\" && mode !== \"auto\") {\n console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);\n mode = \"auto\";\n }\n\n document.body.dataset.theme = mode;\n localStorage.setItem(\"theme\", mode);\n console.log(`Changed to ${mode} mode.`);\n}\n\nfunction cycleThemeOnce() {\n const currentTheme = localStorage.getItem(\"theme\") || \"auto\";\n const prefersDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n\n if (prefersDark) {\n // Auto (dark) -> Light -> Dark\n if (currentTheme === \"auto\") {\n setTheme(\"light\");\n } else if (currentTheme == \"light\") {\n setTheme(\"dark\");\n } else {\n setTheme(\"auto\");\n }\n } else {\n // Auto (light) -> Dark -> Light\n if (currentTheme === \"auto\") {\n setTheme(\"dark\");\n } else if (currentTheme == \"dark\") {\n setTheme(\"light\");\n } else {\n setTheme(\"auto\");\n }\n }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Setup\n////////////////////////////////////////////////////////////////////////////////\nfunction setupScrollHandler() {\n // Taken from https://developer.mozilla.org/en-US/docs/Web/API/Document/scroll_event\n let last_known_scroll_position = 0;\n let ticking = false;\n\n window.addEventListener(\"scroll\", function (e) {\n last_known_scroll_position = window.scrollY;\n\n if (!ticking) {\n window.requestAnimationFrame(function () {\n scrollHandler(last_known_scroll_position);\n ticking = false;\n });\n\n ticking = true;\n }\n });\n window.scroll();\n}\n\nfunction setupScrollSpy() {\n if (tocScroll === null) {\n return;\n }\n\n // Scrollspy -- highlight table on contents, based on scroll\n new Gumshoe(\".toc-tree a\", {\n reflow: true,\n recursive: true,\n navClass: \"scroll-current\",\n offset: () => {\n let rem = parseFloat(getComputedStyle(document.documentElement).fontSize);\n return header.getBoundingClientRect().height + 2.5 * rem + 1;\n },\n });\n}\n\nfunction setupTheme() {\n // Attach event handlers for toggling themes\n const buttons = document.getElementsByClassName(\"theme-toggle\");\n Array.from(buttons).forEach((btn) => {\n btn.addEventListener(\"click\", cycleThemeOnce);\n });\n}\n\nfunction setup() {\n setupTheme();\n setupScrollHandler();\n setupScrollSpy();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Main entrypoint\n////////////////////////////////////////////////////////////////////////////////\nfunction main() {\n document.body.parentNode.classList.remove(\"no-js\");\n\n header = document.querySelector(\"header\");\n tocScroll = document.querySelector(\".toc-scroll\");\n\n setup();\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", main);\n"],"names":["root","g","window","this","defaults","navClass","contentClass","nested","nestedClass","offset","reflow","events","emitEvent","type","elem","detail","settings","event","CustomEvent","bubbles","cancelable","dispatchEvent","getOffsetTop","location","offsetParent","offsetTop","sortContents","contents","sort","item1","item2","content","isInView","bottom","bounds","getBoundingClientRect","parseFloat","getOffset","parseInt","innerHeight","document","documentElement","clientHeight","top","isAtBottom","Math","ceil","pageYOffset","max","body","scrollHeight","offsetHeight","getActive","last","length","item","useLastItem","i","deactivateNested","nav","parentNode","li","closest","classList","remove","deactivate","items","link","activateNested","add","selector","options","navItems","current","timeout","publicAPIs","querySelectorAll","Array","prototype","forEach","call","getElementById","decodeURIComponent","hash","substr","push","active","activate","scrollHandler","cancelAnimationFrame","requestAnimationFrame","detect","resizeHandler","destroy","removeEventListener","merged","arguments","obj","key","hasOwnProperty","extend","setup","addEventListener","factory","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","o","Object","defineProperty","enumerable","get","globalThis","Function","e","prop","tocScroll","header","lastScrollTop","scrollTop","GO_TO_TOP_OFFSET","cycleThemeOnce","currentTheme","localStorage","getItem","mode","matchMedia","matches","console","error","dataset","theme","setItem","log","buttons","getElementsByClassName","from","btn","setupTheme","last_known_scroll_position","ticking","scrollY","positionY","floor","scrollHandlerForBackToTop","scrollTo","querySelector","scrollHandlerForTOC","scroll","setupScrollHandler","recursive","rem","getComputedStyle","fontSize","height"],"sourceRoot":""} \ No newline at end of file diff --git a/latest/_static/searchtools.js b/latest/_static/searchtools.js new file mode 100644 index 000000000..92da3f8b2 --- /dev/null +++ b/latest/_static/searchtools.js @@ -0,0 +1,619 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlinks", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/latest/_static/sg_gallery-binder.css b/latest/_static/sg_gallery-binder.css new file mode 100644 index 000000000..420005d22 --- /dev/null +++ b/latest/_static/sg_gallery-binder.css @@ -0,0 +1,11 @@ +/* CSS for binder integration */ + +div.binder-badge { + margin: 1em auto; + vertical-align: middle; +} + +div.lite-badge { + margin: 1em auto; + vertical-align: middle; +} diff --git a/latest/_static/sg_gallery-dataframe.css b/latest/_static/sg_gallery-dataframe.css new file mode 100644 index 000000000..fac74c43b --- /dev/null +++ b/latest/_static/sg_gallery-dataframe.css @@ -0,0 +1,47 @@ +/* Pandas dataframe css */ +/* Taken from: https://github.com/spatialaudio/nbsphinx/blob/fb3ba670fc1ba5f54d4c487573dbc1b4ecf7e9ff/src/nbsphinx.py#L587-L619 */ +html[data-theme="light"] { + --sg-text-color: #000; + --sg-tr-odd-color: #f5f5f5; + --sg-tr-hover-color: rgba(66, 165, 245, 0.2); +} +html[data-theme="dark"] { + --sg-text-color: #fff; + --sg-tr-odd-color: #373737; + --sg-tr-hover-color: rgba(30, 81, 122, 0.2); +} + +table.dataframe { + border: none !important; + border-collapse: collapse; + border-spacing: 0; + border-color: transparent; + color: var(--sg-text-color); + font-size: 12px; + table-layout: fixed; + width: auto; +} +table.dataframe thead { + border-bottom: 1px solid var(--sg-text-color); + vertical-align: bottom; +} +table.dataframe tr, +table.dataframe th, +table.dataframe td { + text-align: right; + vertical-align: middle; + padding: 0.5em 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} +table.dataframe th { + font-weight: bold; +} +table.dataframe tbody tr:nth-child(odd) { + background: var(--sg-tr-odd-color); +} +table.dataframe tbody tr:hover { + background: var(--sg-tr-hover-color); +} diff --git a/latest/_static/sg_gallery-rendered-html.css b/latest/_static/sg_gallery-rendered-html.css new file mode 100644 index 000000000..93dc2ffb0 --- /dev/null +++ b/latest/_static/sg_gallery-rendered-html.css @@ -0,0 +1,224 @@ +/* Adapted from notebook/static/style/style.min.css */ +html[data-theme="light"] { + --sg-text-color: #000; + --sg-background-color: #ffffff; + --sg-code-background-color: #eff0f1; + --sg-tr-hover-color: rgba(66, 165, 245, 0.2); + --sg-tr-odd-color: #f5f5f5; +} +html[data-theme="dark"] { + --sg-text-color: #fff; + --sg-background-color: #121212; + --sg-code-background-color: #2f2f30; + --sg-tr-hover-color: rgba(66, 165, 245, 0.2); + --sg-tr-odd-color: #1f1f1f; +} + +.rendered_html { + color: var(--sg-text-color); + /* any extras will just be numbers: */ +} +.rendered_html em { + font-style: italic; +} +.rendered_html strong { + font-weight: bold; +} +.rendered_html u { + text-decoration: underline; +} +.rendered_html :link { + text-decoration: underline; +} +.rendered_html :visited { + text-decoration: underline; +} +.rendered_html h1 { + font-size: 185.7%; + margin: 1.08em 0 0 0; + font-weight: bold; + line-height: 1.0; +} +.rendered_html h2 { + font-size: 157.1%; + margin: 1.27em 0 0 0; + font-weight: bold; + line-height: 1.0; +} +.rendered_html h3 { + font-size: 128.6%; + margin: 1.55em 0 0 0; + font-weight: bold; + line-height: 1.0; +} +.rendered_html h4 { + font-size: 100%; + margin: 2em 0 0 0; + font-weight: bold; + line-height: 1.0; +} +.rendered_html h5 { + font-size: 100%; + margin: 2em 0 0 0; + font-weight: bold; + line-height: 1.0; + font-style: italic; +} +.rendered_html h6 { + font-size: 100%; + margin: 2em 0 0 0; + font-weight: bold; + line-height: 1.0; + font-style: italic; +} +.rendered_html h1:first-child { + margin-top: 0.538em; +} +.rendered_html h2:first-child { + margin-top: 0.636em; +} +.rendered_html h3:first-child { + margin-top: 0.777em; +} +.rendered_html h4:first-child { + margin-top: 1em; +} +.rendered_html h5:first-child { + margin-top: 1em; +} +.rendered_html h6:first-child { + margin-top: 1em; +} +.rendered_html ul:not(.list-inline), +.rendered_html ol:not(.list-inline) { + padding-left: 2em; +} +.rendered_html ul { + list-style: disc; +} +.rendered_html ul ul { + list-style: square; + margin-top: 0; +} +.rendered_html ul ul ul { + list-style: circle; +} +.rendered_html ol { + list-style: decimal; +} +.rendered_html ol ol { + list-style: upper-alpha; + margin-top: 0; +} +.rendered_html ol ol ol { + list-style: lower-alpha; +} +.rendered_html ol ol ol ol { + list-style: lower-roman; +} +.rendered_html ol ol ol ol ol { + list-style: decimal; +} +.rendered_html * + ul { + margin-top: 1em; +} +.rendered_html * + ol { + margin-top: 1em; +} +.rendered_html hr { + color: var(--sg-text-color); + background-color: var(--sg-text-color); +} +.rendered_html pre { + margin: 1em 2em; + padding: 0px; + background-color: var(--sg-background-color); +} +.rendered_html code { + background-color: var(--sg-code-background-color); +} +.rendered_html p code { + padding: 1px 5px; +} +.rendered_html pre code { + background-color: var(--sg-background-color); +} +.rendered_html pre, +.rendered_html code { + border: 0; + color: var(--sg-text-color); + font-size: 100%; +} +.rendered_html blockquote { + margin: 1em 2em; +} +.rendered_html table { + margin-left: auto; + margin-right: auto; + border: none; + border-collapse: collapse; + border-spacing: 0; + color: var(--sg-text-color); + font-size: 12px; + table-layout: fixed; +} +.rendered_html thead { + border-bottom: 1px solid var(--sg-text-color); + vertical-align: bottom; +} +.rendered_html tr, +.rendered_html th, +.rendered_html td { + text-align: right; + vertical-align: middle; + padding: 0.5em 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} +.rendered_html th { + font-weight: bold; +} +.rendered_html tbody tr:nth-child(odd) { + background: var(--sg-tr-odd-color); +} +.rendered_html tbody tr:hover { + color: var(--sg-text-color); + background: var(--sg-tr-hover-color); +} +.rendered_html * + table { + margin-top: 1em; +} +.rendered_html p { + text-align: left; +} +.rendered_html * + p { + margin-top: 1em; +} +.rendered_html img { + display: block; + margin-left: auto; + margin-right: auto; +} +.rendered_html * + img { + margin-top: 1em; +} +.rendered_html img, +.rendered_html svg { + max-width: 100%; + height: auto; +} +.rendered_html img.unconfined, +.rendered_html svg.unconfined { + max-width: none; +} +.rendered_html .alert { + margin-bottom: initial; +} +.rendered_html * + .alert { + margin-top: 1em; +} +[dir="rtl"] .rendered_html p { + text-align: right; +} diff --git a/latest/_static/sg_gallery.css b/latest/_static/sg_gallery.css new file mode 100644 index 000000000..72227837d --- /dev/null +++ b/latest/_static/sg_gallery.css @@ -0,0 +1,342 @@ +/* +Sphinx-Gallery has compatible CSS to fix default sphinx themes +Tested for Sphinx 1.3.1 for all themes: default, alabaster, sphinxdoc, +scrolls, agogo, traditional, nature, haiku, pyramid +Tested for Read the Docs theme 0.1.7 */ + +/* Define light colors */ +:root, html[data-theme="light"], body[data-theme="light"]{ + --sg-tooltip-foreground: black; + --sg-tooltip-background: rgba(250, 250, 250, 0.9); + --sg-tooltip-border: #ccc transparent; + --sg-thumb-box-shadow-color: #6c757d40; + --sg-thumb-hover-border: #0069d9; + --sg-script-out: #888; + --sg-script-pre: #fafae2; + --sg-pytb-foreground: #000; + --sg-pytb-background: #ffe4e4; + --sg-pytb-border-color: #f66; + --sg-download-a-background-color: #ffc; + --sg-download-a-background-image: linear-gradient(to bottom, #ffc, #d5d57e); + --sg-download-a-border-color: 1px solid #c2c22d; + --sg-download-a-color: #000; + --sg-download-a-hover-background-color: #d5d57e; + --sg-download-a-hover-box-shadow-1: rgba(255, 255, 255, 0.1); + --sg-download-a-hover-box-shadow-2: rgba(0, 0, 0, 0.25); +} +@media(prefers-color-scheme: light) { + :root[data-theme="auto"], html[data-theme="auto"], body[data-theme="auto"] { + --sg-tooltip-foreground: black; + --sg-tooltip-background: rgba(250, 250, 250, 0.9); + --sg-tooltip-border: #ccc transparent; + --sg-thumb-box-shadow-color: #6c757d40; + --sg-thumb-hover-border: #0069d9; + --sg-script-out: #888; + --sg-script-pre: #fafae2; + --sg-pytb-foreground: #000; + --sg-pytb-background: #ffe4e4; + --sg-pytb-border-color: #f66; + --sg-download-a-background-color: #ffc; + --sg-download-a-background-image: linear-gradient(to bottom, #ffc, #d5d57e); + --sg-download-a-border-color: 1px solid #c2c22d; + --sg-download-a-color: #000; + --sg-download-a-hover-background-color: #d5d57e; + --sg-download-a-hover-box-shadow-1: rgba(255, 255, 255, 0.1); + --sg-download-a-hover-box-shadow-2: rgba(0, 0, 0, 0.25); + } +} + +html[data-theme="dark"], body[data-theme="dark"] { + --sg-tooltip-foreground: white; + --sg-tooltip-background: rgba(10, 10, 10, 0.9); + --sg-tooltip-border: #333 transparent; + --sg-thumb-box-shadow-color: #79848d40; + --sg-thumb-hover-border: #003975; + --sg-script-out: rgb(179, 179, 179); + --sg-script-pre: #2e2e22; + --sg-pytb-foreground: #fff; + --sg-pytb-background: #1b1717; + --sg-pytb-border-color: #622; + --sg-download-a-background-color: #443; + --sg-download-a-background-image: linear-gradient(to bottom, #443, #221); + --sg-download-a-border-color: 1px solid #3a3a0d; + --sg-download-a-color: #fff; + --sg-download-a-hover-background-color: #616135; + --sg-download-a-hover-box-shadow-1: rgba(0, 0, 0, 0.1); + --sg-download-a-hover-box-shadow-2: rgba(255, 255, 255, 0.25); +} +@media(prefers-color-scheme: dark){ + html[data-theme="auto"], body[data-theme="auto"] { + --sg-tooltip-foreground: white; + --sg-tooltip-background: rgba(10, 10, 10, 0.9); + --sg-tooltip-border: #333 transparent; + --sg-thumb-box-shadow-color: #79848d40; + --sg-thumb-hover-border: #003975; + --sg-script-out: rgb(179, 179, 179); + --sg-script-pre: #2e2e22; + --sg-pytb-foreground: #fff; + --sg-pytb-background: #1b1717; + --sg-pytb-border-color: #622; + --sg-download-a-background-color: #443; + --sg-download-a-background-image: linear-gradient(to bottom, #443, #221); + --sg-download-a-border-color: 1px solid #3a3a0d; + --sg-download-a-color: #fff; + --sg-download-a-hover-background-color: #616135; + --sg-download-a-hover-box-shadow-1: rgba(0, 0, 0, 0.1); + --sg-download-a-hover-box-shadow-2: rgba(255, 255, 255, 0.25); + } +} + +.sphx-glr-thumbnails { + width: 100%; + margin: 0px 0px 20px 0px; + + /* align thumbnails on a grid */ + justify-content: space-between; + display: grid; + /* each grid column should be at least 160px (this will determine + the actual number of columns) and then take as much of the + remaining width as possible */ + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + gap: 15px; +} +.sphx-glr-thumbnails .toctree-wrapper { + /* hide empty toctree divs added to the DOM + by sphinx even though the toctree is hidden + (they would fill grid places with empty divs) */ + display: none; +} +.sphx-glr-thumbcontainer { + background: transparent; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + box-shadow: 0 0 10px var(--sg-thumb-box-shadow-color); + + /* useful to absolutely position link in div */ + position: relative; + + /* thumbnail width should include padding and borders + and take all available space */ + box-sizing: border-box; + width: 100%; + padding: 10px; + border: 1px solid transparent; + + /* align content in thumbnail */ + display: flex; + flex-direction: column; + align-items: center; + gap: 7px; +} +.sphx-glr-thumbcontainer p { + position: absolute; + top: 0; + left: 0; +} +.sphx-glr-thumbcontainer p, +.sphx-glr-thumbcontainer p a { + /* link should cover the whole thumbnail div */ + width: 100%; + height: 100%; +} +.sphx-glr-thumbcontainer p a span { + /* text within link should be masked + (we are just interested in the href) */ + display: none; +} +.sphx-glr-thumbcontainer:hover { + border: 1px solid; + border-color: var(--sg-thumb-hover-border); + cursor: pointer; +} +.sphx-glr-thumbcontainer a.internal { + bottom: 0; + display: block; + left: 0; + box-sizing: border-box; + padding: 150px 10px 0; + position: absolute; + right: 0; + top: 0; +} +/* Next one is to avoid Sphinx traditional theme to cover all the +thumbnail with its default link Background color */ +.sphx-glr-thumbcontainer a.internal:hover { + background-color: transparent; +} + +.sphx-glr-thumbcontainer p { + margin: 0 0 0.1em 0; +} +.sphx-glr-thumbcontainer .figure { + margin: 10px; + width: 160px; +} +.sphx-glr-thumbcontainer img { + display: inline; + max-height: 112px; + max-width: 160px; +} +.sphx-glr-thumbcontainer[tooltip]:hover:after { + background: var(--sg-tooltip-background); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + color: var(--sg-tooltip-foreground); + content: attr(tooltip); + padding: 10px; + z-index: 98; + width: 100%; + height: 100%; + position: absolute; + pointer-events: none; + top: 0; + box-sizing: border-box; + overflow: hidden; + backdrop-filter: blur(3px); +} + +.sphx-glr-script-out { + color: var(--sg-script-out); + display: flex; + gap: 0.5em; +} +.sphx-glr-script-out::before { + content: "Out:"; + /* These numbers come from the pre style in the pydata sphinx theme. This + * turns out to match perfectly on the rtd theme, but be a bit too low for + * the pydata sphinx theme. As I could not find a dimension to use that was + * scaled the same way, I just picked one option that worked pretty close for + * both. */ + line-height: 1.4; + padding-top: 10px; +} +.sphx-glr-script-out .highlight { + background-color: transparent; + /* These options make the div expand... */ + flex-grow: 1; + /* ... but also keep it from overflowing its flex container. */ + overflow: auto; +} +.sphx-glr-script-out .highlight pre { + background-color: var(--sg-script-pre); + border: 0; + max-height: 30em; + overflow: auto; + padding-left: 1ex; + /* This margin is necessary in the pydata sphinx theme because pre has a box + * shadow which would be clipped by the overflow:auto in the parent div + * above. */ + margin: 2px; + word-break: break-word; +} +.sphx-glr-script-out + p { + margin-top: 1.8em; +} +blockquote.sphx-glr-script-out { + margin-left: 0pt; +} +.sphx-glr-script-out.highlight-pytb .highlight pre { + color: var(--sg-pytb-foreground); + background-color: var(--sg-pytb-background); + border: 1px solid var(--sg-pytb-border-color); + margin-top: 10px; + padding: 7px; +} + +div.sphx-glr-footer { + text-align: center; +} + +div.sphx-glr-download { + margin: 1em auto; + vertical-align: middle; +} + +div.sphx-glr-download a { + background-color: var(--sg-download-a-background-color); + background-image: var(--sg-download-a-background-image); + border-radius: 4px; + border: 1px solid var(--sg-download-a-border-color); + color: var(--sg-download-a-color); + display: inline-block; + font-weight: bold; + padding: 1ex; + text-align: center; +} + +div.sphx-glr-download code.download { + display: inline-block; + white-space: normal; + word-break: normal; + overflow-wrap: break-word; + /* border and background are given by the enclosing 'a' */ + border: none; + background: none; +} + +div.sphx-glr-download a:hover { + box-shadow: inset 0 1px 0 var(--sg-download-a-hover-box-shadow-1), 0 1px 5px var(--sg-download-a-hover-box-shadow-2); + text-decoration: none; + background-image: none; + background-color: var(--sg-download-a-hover-background-color); +} + +.sphx-glr-example-title:target::before { + display: block; + content: ""; + margin-top: -50px; + height: 50px; + visibility: hidden; +} + +ul.sphx-glr-horizontal { + list-style: none; + padding: 0; +} +ul.sphx-glr-horizontal li { + display: inline; +} +ul.sphx-glr-horizontal img { + height: auto !important; +} + +.sphx-glr-single-img { + margin: auto; + display: block; + max-width: 100%; +} + +.sphx-glr-multi-img { + max-width: 42%; + height: auto; +} + +div.sphx-glr-animation { + margin: auto; + display: block; + max-width: 100%; +} +div.sphx-glr-animation .animation { + display: block; +} + +p.sphx-glr-signature a.reference.external { + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + padding: 3px; + font-size: 75%; + text-align: right; + margin-left: auto; + display: table; +} + +.sphx-glr-clear { + clear: both; +} + +a.sphx-glr-backref-instance { + text-decoration: none; +} diff --git a/latest/_static/skeleton.css b/latest/_static/skeleton.css new file mode 100644 index 000000000..467c878c6 --- /dev/null +++ b/latest/_static/skeleton.css @@ -0,0 +1,296 @@ +/* Some sane resets. */ +html { + height: 100%; +} + +body { + margin: 0; + min-height: 100%; +} + +/* All the flexbox magic! */ +body, +.sb-announcement, +.sb-content, +.sb-main, +.sb-container, +.sb-container__inner, +.sb-article-container, +.sb-footer-content, +.sb-header, +.sb-header-secondary, +.sb-footer { + display: flex; +} + +/* These order things vertically */ +body, +.sb-main, +.sb-article-container { + flex-direction: column; +} + +/* Put elements in the center */ +.sb-header, +.sb-header-secondary, +.sb-container, +.sb-content, +.sb-footer, +.sb-footer-content { + justify-content: center; +} +/* Put elements at the ends */ +.sb-article-container { + justify-content: space-between; +} + +/* These elements grow. */ +.sb-main, +.sb-content, +.sb-container, +article { + flex-grow: 1; +} + +/* Because padding making this wider is not fun */ +article { + box-sizing: border-box; +} + +/* The announcements element should never be wider than the page. */ +.sb-announcement { + max-width: 100%; +} + +.sb-sidebar-primary, +.sb-sidebar-secondary { + flex-shrink: 0; + width: 17rem; +} + +.sb-announcement__inner { + justify-content: center; + + box-sizing: border-box; + height: 3rem; + + overflow-x: auto; + white-space: nowrap; +} + +/* Sidebars, with checkbox-based toggle */ +.sb-sidebar-primary, +.sb-sidebar-secondary { + position: fixed; + height: 100%; + top: 0; +} + +.sb-sidebar-primary { + left: -17rem; + transition: left 250ms ease-in-out; +} +.sb-sidebar-secondary { + right: -17rem; + transition: right 250ms ease-in-out; +} + +.sb-sidebar-toggle { + display: none; +} +.sb-sidebar-overlay { + position: fixed; + top: 0; + width: 0; + height: 0; + + transition: width 0ms ease 250ms, height 0ms ease 250ms, opacity 250ms ease; + + opacity: 0; + background-color: rgba(0, 0, 0, 0.54); +} + +#sb-sidebar-toggle--primary:checked + ~ .sb-sidebar-overlay[for="sb-sidebar-toggle--primary"], +#sb-sidebar-toggle--secondary:checked + ~ .sb-sidebar-overlay[for="sb-sidebar-toggle--secondary"] { + width: 100%; + height: 100%; + opacity: 1; + transition: width 0ms ease, height 0ms ease, opacity 250ms ease; +} + +#sb-sidebar-toggle--primary:checked ~ .sb-container .sb-sidebar-primary { + left: 0; +} +#sb-sidebar-toggle--secondary:checked ~ .sb-container .sb-sidebar-secondary { + right: 0; +} + +/* Full-width mode */ +.drop-secondary-sidebar-for-full-width-content + .hide-when-secondary-sidebar-shown { + display: none !important; +} +.drop-secondary-sidebar-for-full-width-content .sb-sidebar-secondary { + display: none !important; +} + +/* Mobile views */ +.sb-page-width { + width: 100%; +} + +.sb-article-container, +.sb-footer-content__inner, +.drop-secondary-sidebar-for-full-width-content .sb-article, +.drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 100vw; +} + +.sb-article, +.match-content-width { + padding: 0 1rem; + box-sizing: border-box; +} + +@media (min-width: 32rem) { + .sb-article, + .match-content-width { + padding: 0 2rem; + } +} + +/* Tablet views */ +@media (min-width: 42rem) { + .sb-article-container { + width: auto; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 42rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} +@media (min-width: 46rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 46rem; + } + .sb-article, + .match-content-width { + width: 46rem; + } +} +@media (min-width: 50rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 50rem; + } + .sb-article, + .match-content-width { + width: 50rem; + } +} + +/* Tablet views */ +@media (min-width: 59rem) { + .sb-sidebar-secondary { + position: static; + } + .hide-when-secondary-sidebar-shown { + display: none !important; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 59rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} +@media (min-width: 63rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 63rem; + } + .sb-article, + .match-content-width { + width: 46rem; + } +} +@media (min-width: 67rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } + .sb-article, + .match-content-width { + width: 50rem; + } +} + +/* Desktop views */ +@media (min-width: 76rem) { + .sb-sidebar-primary { + position: static; + } + .hide-when-primary-sidebar-shown { + display: none !important; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 59rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} + +/* Full desktop views */ +@media (min-width: 80rem) { + .sb-article, + .match-content-width { + width: 46rem; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 63rem; + } +} + +@media (min-width: 84rem) { + .sb-article, + .match-content-width { + width: 50rem; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } +} + +@media (min-width: 88rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } + .sb-page-width { + width: 88rem; + } +} diff --git a/latest/_static/sphinx_highlight.js b/latest/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/latest/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/latest/_static/styles/furo-extensions.css b/latest/_static/styles/furo-extensions.css new file mode 100644 index 000000000..bc447f228 --- /dev/null +++ b/latest/_static/styles/furo-extensions.css @@ -0,0 +1,2 @@ +#furo-sidebar-ad-placement{padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)}#furo-sidebar-ad-placement .ethical-sidebar{background:var(--color-background-secondary);border:none;box-shadow:none}#furo-sidebar-ad-placement .ethical-sidebar:hover{background:var(--color-background-hover)}#furo-sidebar-ad-placement .ethical-sidebar a{color:var(--color-foreground-primary)}#furo-sidebar-ad-placement .ethical-callout a{color:var(--color-foreground-secondary)!important}#furo-readthedocs-versions{background:transparent;display:block;position:static;width:100%}#furo-readthedocs-versions .rst-versions{background:#1a1c1e}#furo-readthedocs-versions .rst-current-version{background:var(--color-sidebar-item-background);cursor:unset}#furo-readthedocs-versions .rst-current-version:hover{background:var(--color-sidebar-item-background)}#furo-readthedocs-versions .rst-current-version .fa-book{color:var(--color-foreground-primary)}#furo-readthedocs-versions>.rst-other-versions{padding:0}#furo-readthedocs-versions>.rst-other-versions small{opacity:1}#furo-readthedocs-versions .injected .rst-versions{position:unset}#furo-readthedocs-versions:focus-within,#furo-readthedocs-versions:hover{box-shadow:0 0 0 1px var(--color-sidebar-background-border)}#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:hover .rst-current-version{background:#1a1c1e;font-size:inherit;height:auto;line-height:inherit;padding:12px;text-align:right}#furo-readthedocs-versions:focus-within .rst-current-version .fa-book,#furo-readthedocs-versions:hover .rst-current-version .fa-book{color:#fff;float:left}#furo-readthedocs-versions:focus-within .fa-caret-down,#furo-readthedocs-versions:hover .fa-caret-down{display:none}#furo-readthedocs-versions:focus-within .injected,#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:focus-within .rst-other-versions,#furo-readthedocs-versions:hover .injected,#furo-readthedocs-versions:hover .rst-current-version,#furo-readthedocs-versions:hover .rst-other-versions{display:block}#furo-readthedocs-versions:focus-within>.rst-current-version,#furo-readthedocs-versions:hover>.rst-current-version{display:none}.highlight:hover button.copybtn{color:var(--color-code-foreground)}.highlight button.copybtn{align-items:center;background-color:var(--color-code-background);border:none;color:var(--color-background-item);cursor:pointer;height:1.25em;opacity:1;right:.5rem;top:.625rem;transition:color .3s,opacity .3s;width:1.25em}.highlight button.copybtn:hover{background-color:var(--color-code-background);color:var(--color-brand-content)}.highlight button.copybtn:after{background-color:transparent;color:var(--color-code-foreground);display:none}.highlight button.copybtn.success{color:#22863a;transition:color 0ms}.highlight button.copybtn.success:after{display:block}.highlight button.copybtn svg{padding:0}body{--sd-color-primary:var(--color-brand-primary);--sd-color-primary-highlight:var(--color-brand-content);--sd-color-primary-text:var(--color-background-primary);--sd-color-shadow:rgba(0,0,0,.05);--sd-color-card-border:var(--color-card-border);--sd-color-card-border-hover:var(--color-brand-content);--sd-color-card-background:var(--color-card-background);--sd-color-card-text:var(--color-foreground-primary);--sd-color-card-header:var(--color-card-marginals-background);--sd-color-card-footer:var(--color-card-marginals-background);--sd-color-tabs-label-active:var(--color-brand-content);--sd-color-tabs-label-hover:var(--color-foreground-muted);--sd-color-tabs-label-inactive:var(--color-foreground-muted);--sd-color-tabs-underline-active:var(--color-brand-content);--sd-color-tabs-underline-hover:var(--color-foreground-border);--sd-color-tabs-underline-inactive:var(--color-background-border);--sd-color-tabs-overline:var(--color-background-border);--sd-color-tabs-underline:var(--color-background-border)}.sd-tab-content{box-shadow:0 -2px var(--sd-color-tabs-overline),0 1px var(--sd-color-tabs-underline)}.sd-card{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)}.sd-shadow-sm{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-md{box-shadow:0 .3rem .75rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-lg{box-shadow:0 .6rem 1.5rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-card-hover:hover{transform:none}.sd-cards-carousel{gap:.25rem;padding:.25rem}body{--tabs--label-text:var(--color-foreground-muted);--tabs--label-text--hover:var(--color-foreground-muted);--tabs--label-text--active:var(--color-brand-content);--tabs--label-text--active--hover:var(--color-brand-content);--tabs--label-background:transparent;--tabs--label-background--hover:transparent;--tabs--label-background--active:transparent;--tabs--label-background--active--hover:transparent;--tabs--padding-x:0.25em;--tabs--margin-x:1em;--tabs--border:var(--color-background-border);--tabs--label-border:transparent;--tabs--label-border--hover:var(--color-foreground-muted);--tabs--label-border--active:var(--color-brand-content);--tabs--label-border--active--hover:var(--color-brand-content)}[role=main] .container{max-width:none;padding-left:0;padding-right:0}.shadow.docutils{border:none;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)!important}.sphinx-bs .card{background-color:var(--color-background-secondary);color:var(--color-foreground)} +/*# sourceMappingURL=furo-extensions.css.map*/ \ No newline at end of file diff --git a/latest/_static/styles/furo-extensions.css.map b/latest/_static/styles/furo-extensions.css.map new file mode 100644 index 000000000..9ba5637f9 --- /dev/null +++ b/latest/_static/styles/furo-extensions.css.map @@ -0,0 +1 @@ +{"version":3,"file":"styles/furo-extensions.css","mappings":"AAGA,2BACE,oFACA,4CAKE,6CAHA,YACA,eAEA,CACA,kDACE,yCAEF,8CACE,sCAEJ,8CACE,kDAEJ,2BAGE,uBACA,cAHA,gBACA,UAEA,CAGA,yCACE,mBAEF,gDAEE,gDADA,YACA,CACA,sDACE,gDACF,yDACE,sCAEJ,+CACE,UACA,qDACE,UAGF,mDACE,eAEJ,yEAEE,4DAEA,mHASE,mBAPA,kBAEA,YADA,oBAGA,aADA,gBAIA,CAEA,qIAEE,WADA,UACA,CAEJ,uGACE,aAEF,iUAGE,cAEF,mHACE,aC1EJ,gCACE,mCAEF,0BAKE,mBAUA,8CACA,YAFA,mCAKA,eAZA,cALA,UASA,YADA,YAYA,iCAdA,YAcA,CAEA,gCAEE,8CADA,gCACA,CAEF,gCAGE,6BADA,mCADA,YAEA,CAEF,kCAEE,cADA,oBACA,CACA,wCACE,cAEJ,8BACE,UC5CN,KAEE,6CAA8C,CAC9C,uDAAwD,CACxD,uDAAwD,CAGxD,iCAAsC,CAGtC,+CAAgD,CAChD,uDAAwD,CACxD,uDAAwD,CACxD,oDAAqD,CACrD,6DAA8D,CAC9D,6DAA8D,CAG9D,uDAAwD,CACxD,yDAA0D,CAC1D,4DAA6D,CAC7D,2DAA4D,CAC5D,8DAA+D,CAC/D,iEAAkE,CAClE,uDAAwD,CACxD,wDAAyD,CAG3D,gBACE,qFAGF,SACE,6EAEF,cACE,uFAEF,cACE,uFAEF,cACE,uFAGF,qBACE,eAEF,mBACE,WACA,eChDF,KACE,gDAAiD,CACjD,uDAAwD,CACxD,qDAAsD,CACtD,4DAA6D,CAC7D,oCAAqC,CACrC,2CAA4C,CAC5C,4CAA6C,CAC7C,mDAAoD,CACpD,wBAAyB,CACzB,oBAAqB,CACrB,6CAA8C,CAC9C,gCAAiC,CACjC,yDAA0D,CAC1D,uDAAwD,CACxD,8DAA+D,CCbjE,uBACE,eACA,eACA,gBAGF,iBACE,YACA,+EAGF,iBACE,mDACA","sources":["webpack:///./src/furo/assets/styles/extensions/_readthedocs.sass","webpack:///./src/furo/assets/styles/extensions/_copybutton.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-design.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-inline-tabs.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-panels.sass"],"sourcesContent":["// This file contains the styles used for tweaking how ReadTheDoc's embedded\n// contents would show up inside the theme.\n\n#furo-sidebar-ad-placement\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n .ethical-sidebar\n // Remove the border and box-shadow.\n border: none\n box-shadow: none\n // Manage the background colors.\n background: var(--color-background-secondary)\n &:hover\n background: var(--color-background-hover)\n // Ensure the text is legible.\n a\n color: var(--color-foreground-primary)\n\n .ethical-callout a\n color: var(--color-foreground-secondary) !important\n\n#furo-readthedocs-versions\n position: static\n width: 100%\n background: transparent\n display: block\n\n // Make the background color fit with the theme's aesthetic.\n .rst-versions\n background: rgb(26, 28, 30)\n\n .rst-current-version\n cursor: unset\n background: var(--color-sidebar-item-background)\n &:hover\n background: var(--color-sidebar-item-background)\n .fa-book\n color: var(--color-foreground-primary)\n\n > .rst-other-versions\n padding: 0\n small\n opacity: 1\n\n .injected\n .rst-versions\n position: unset\n\n &:hover,\n &:focus-within\n box-shadow: 0 0 0 1px var(--color-sidebar-background-border)\n\n .rst-current-version\n // Undo the tweaks done in RTD's CSS\n font-size: inherit\n line-height: inherit\n height: auto\n text-align: right\n padding: 12px\n\n // Match the rest of the body\n background: #1a1c1e\n\n .fa-book\n float: left\n color: white\n\n .fa-caret-down\n display: none\n\n .rst-current-version,\n .rst-other-versions,\n .injected\n display: block\n\n > .rst-current-version\n display: none\n",".highlight\n &:hover button.copybtn\n color: var(--color-code-foreground)\n\n button.copybtn\n // Make it visible\n opacity: 1\n\n // Align things correctly\n align-items: center\n\n height: 1.25em\n width: 1.25em\n\n top: 0.625rem // $code-spacing-vertical\n right: 0.5rem\n\n // Make it look better\n color: var(--color-background-item)\n background-color: var(--color-code-background)\n border: none\n\n // Change to cursor to make it obvious that you can click on it\n cursor: pointer\n\n // Transition smoothly, for aesthetics\n transition: color 300ms, opacity 300ms\n\n &:hover\n color: var(--color-brand-content)\n background-color: var(--color-code-background)\n\n &::after\n display: none\n color: var(--color-code-foreground)\n background-color: transparent\n\n &.success\n transition: color 0ms\n color: #22863a\n &::after\n display: block\n\n svg\n padding: 0\n","body\n // Colors\n --sd-color-primary: var(--color-brand-primary)\n --sd-color-primary-highlight: var(--color-brand-content)\n --sd-color-primary-text: var(--color-background-primary)\n\n // Shadows\n --sd-color-shadow: rgba(0, 0, 0, 0.05)\n\n // Cards\n --sd-color-card-border: var(--color-card-border)\n --sd-color-card-border-hover: var(--color-brand-content)\n --sd-color-card-background: var(--color-card-background)\n --sd-color-card-text: var(--color-foreground-primary)\n --sd-color-card-header: var(--color-card-marginals-background)\n --sd-color-card-footer: var(--color-card-marginals-background)\n\n // Tabs\n --sd-color-tabs-label-active: var(--color-brand-content)\n --sd-color-tabs-label-hover: var(--color-foreground-muted)\n --sd-color-tabs-label-inactive: var(--color-foreground-muted)\n --sd-color-tabs-underline-active: var(--color-brand-content)\n --sd-color-tabs-underline-hover: var(--color-foreground-border)\n --sd-color-tabs-underline-inactive: var(--color-background-border)\n --sd-color-tabs-overline: var(--color-background-border)\n --sd-color-tabs-underline: var(--color-background-border)\n\n// Tabs\n.sd-tab-content\n box-shadow: 0 -2px var(--sd-color-tabs-overline), 0 1px var(--sd-color-tabs-underline)\n\n// Shadows\n.sd-card // Have a shadow by default\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n.sd-shadow-sm\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-md\n box-shadow: 0 0.3rem 0.75rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-lg\n box-shadow: 0 0.6rem 1.5rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Cards\n.sd-card-hover:hover // Don't change scale on hover\n transform: none\n\n.sd-cards-carousel // Have a bit of gap in the carousel by default\n gap: 0.25rem\n padding: 0.25rem\n","// This file contains styles to tweak sphinx-inline-tabs to work well with Furo.\n\nbody\n --tabs--label-text: var(--color-foreground-muted)\n --tabs--label-text--hover: var(--color-foreground-muted)\n --tabs--label-text--active: var(--color-brand-content)\n --tabs--label-text--active--hover: var(--color-brand-content)\n --tabs--label-background: transparent\n --tabs--label-background--hover: transparent\n --tabs--label-background--active: transparent\n --tabs--label-background--active--hover: transparent\n --tabs--padding-x: 0.25em\n --tabs--margin-x: 1em\n --tabs--border: var(--color-background-border)\n --tabs--label-border: transparent\n --tabs--label-border--hover: var(--color-foreground-muted)\n --tabs--label-border--active: var(--color-brand-content)\n --tabs--label-border--active--hover: var(--color-brand-content)\n","// This file contains styles to tweak sphinx-panels to work well with Furo.\n\n// sphinx-panels includes Bootstrap 4, which uses .container which can conflict\n// with docutils' `.. container::` directive.\n[role=\"main\"] .container\n max-width: initial\n padding-left: initial\n padding-right: initial\n\n// Make the panels look nicer!\n.shadow.docutils\n border: none\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Make panel colors respond to dark mode\n.sphinx-bs .card\n background-color: var(--color-background-secondary)\n color: var(--color-foreground)\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/latest/_static/styles/furo.css b/latest/_static/styles/furo.css new file mode 100644 index 000000000..e3d4e57b8 --- /dev/null +++ b/latest/_static/styles/furo.css @@ -0,0 +1,2 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}@media print{.content-icon-container,.headerlink,.mobile-header,.related-pages{display:none!important}.highlight{border:.1pt solid var(--color-foreground-border)}a,blockquote,dl,ol,pre,table,ul{page-break-inside:avoid}caption,figure,h1,h2,h3,h4,h5,h6,img{page-break-after:avoid;page-break-inside:avoid}dl,ol,ul{page-break-before:avoid}}.visually-hidden{height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;clip:rect(0,0,0,0)!important;background:var(--color-background-primary);border:0!important;color:var(--color-foreground-primary);white-space:nowrap!important}:-moz-focusring{outline:auto}body{--font-stack:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;--font-stack--monospace:"SFMono-Regular",Menlo,Consolas,Monaco,Liberation Mono,Lucida Console,monospace;--font-stack--headings:var(--font-stack);--font-size--normal:100%;--font-size--small:87.5%;--font-size--small--2:81.25%;--font-size--small--3:75%;--font-size--small--4:62.5%;--sidebar-caption-font-size:var(--font-size--small--2);--sidebar-item-font-size:var(--font-size--small);--sidebar-search-input-font-size:var(--font-size--small);--toc-font-size:var(--font-size--small--3);--toc-font-size--mobile:var(--font-size--normal);--toc-title-font-size:var(--font-size--small--4);--admonition-font-size:0.8125rem;--admonition-title-font-size:0.8125rem;--code-font-size:var(--font-size--small--2);--api-font-size:var(--font-size--small);--header-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*4);--header-padding:0.5rem;--sidebar-tree-space-above:1.5rem;--sidebar-caption-space-above:1rem;--sidebar-item-line-height:1rem;--sidebar-item-spacing-vertical:0.5rem;--sidebar-item-spacing-horizontal:1rem;--sidebar-item-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*2);--sidebar-expander-width:var(--sidebar-item-height);--sidebar-search-space-above:0.5rem;--sidebar-search-input-spacing-vertical:0.5rem;--sidebar-search-input-spacing-horizontal:0.5rem;--sidebar-search-input-height:1rem;--sidebar-search-icon-size:var(--sidebar-search-input-height);--toc-title-padding:0.25rem 0;--toc-spacing-vertical:1.5rem;--toc-spacing-horizontal:1.5rem;--toc-item-spacing-vertical:0.4rem;--toc-item-spacing-horizontal:1rem;--icon-search:url('data:image/svg+xml;charset=utf-8,');--icon-pencil:url('data:image/svg+xml;charset=utf-8,');--icon-abstract:url('data:image/svg+xml;charset=utf-8,');--icon-info:url('data:image/svg+xml;charset=utf-8,');--icon-flame:url('data:image/svg+xml;charset=utf-8,');--icon-question:url('data:image/svg+xml;charset=utf-8,');--icon-warning:url('data:image/svg+xml;charset=utf-8,');--icon-failure:url('data:image/svg+xml;charset=utf-8,');--icon-spark:url('data:image/svg+xml;charset=utf-8,');--color-admonition-title--caution:#ff9100;--color-admonition-title-background--caution:rgba(255,145,0,.2);--color-admonition-title--warning:#ff9100;--color-admonition-title-background--warning:rgba(255,145,0,.2);--color-admonition-title--danger:#ff5252;--color-admonition-title-background--danger:rgba(255,82,82,.2);--color-admonition-title--attention:#ff5252;--color-admonition-title-background--attention:rgba(255,82,82,.2);--color-admonition-title--error:#ff5252;--color-admonition-title-background--error:rgba(255,82,82,.2);--color-admonition-title--hint:#00c852;--color-admonition-title-background--hint:rgba(0,200,82,.2);--color-admonition-title--tip:#00c852;--color-admonition-title-background--tip:rgba(0,200,82,.2);--color-admonition-title--important:#00bfa5;--color-admonition-title-background--important:rgba(0,191,165,.2);--color-admonition-title--note:#00b0ff;--color-admonition-title-background--note:rgba(0,176,255,.2);--color-admonition-title--seealso:#448aff;--color-admonition-title-background--seealso:rgba(68,138,255,.2);--color-admonition-title--admonition-todo:grey;--color-admonition-title-background--admonition-todo:hsla(0,0%,50%,.2);--color-admonition-title:#651fff;--color-admonition-title-background:rgba(101,31,255,.2);--icon-admonition-default:var(--icon-abstract);--color-topic-title:#14b8a6;--color-topic-title-background:rgba(20,184,166,.2);--icon-topic-default:var(--icon-pencil);--color-problematic:#b30000;--color-foreground-primary:#000;--color-foreground-secondary:#5a5c63;--color-foreground-muted:#6b6f76;--color-foreground-border:#878787;--color-background-primary:#fff;--color-background-secondary:#f8f9fb;--color-background-hover:#efeff4;--color-background-hover--transparent:#efeff400;--color-background-border:#eeebee;--color-background-item:#ccc;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#0a4bff;--color-brand-content:#2757dd;--color-brand-visited:#872ee0;--color-api-background:var(--color-background-hover--transparent);--color-api-background-hover:var(--color-background-hover);--color-api-overall:var(--color-foreground-secondary);--color-api-name:var(--color-problematic);--color-api-pre-name:var(--color-problematic);--color-api-paren:var(--color-foreground-secondary);--color-api-keyword:var(--color-foreground-primary);--color-api-added:#21632c;--color-api-added-border:#38a84d;--color-api-changed:#046172;--color-api-changed-border:#06a1bc;--color-api-deprecated:#605706;--color-api-deprecated-border:#f0d90f;--color-api-removed:#b30000;--color-api-removed-border:#ff5c5c;--color-highlight-on-target:#ffc;--color-inline-code-background:var(--color-background-secondary);--color-highlighted-background:#def;--color-highlighted-text:var(--color-foreground-primary);--color-guilabel-background:#ddeeff80;--color-guilabel-border:#bedaf580;--color-guilabel-text:var(--color-foreground-primary);--color-admonition-background:transparent;--color-table-header-background:var(--color-background-secondary);--color-table-border:var(--color-background-border);--color-card-border:var(--color-background-secondary);--color-card-background:transparent;--color-card-marginals-background:var(--color-background-secondary);--color-header-background:var(--color-background-primary);--color-header-border:var(--color-background-border);--color-header-text:var(--color-foreground-primary);--color-sidebar-background:var(--color-background-secondary);--color-sidebar-background-border:var(--color-background-border);--color-sidebar-brand-text:var(--color-foreground-primary);--color-sidebar-caption-text:var(--color-foreground-muted);--color-sidebar-link-text:var(--color-foreground-secondary);--color-sidebar-link-text--top-level:var(--color-brand-primary);--color-sidebar-item-background:var(--color-sidebar-background);--color-sidebar-item-background--current:var( --color-sidebar-item-background );--color-sidebar-item-background--hover:linear-gradient(90deg,var(--color-background-hover--transparent) 0%,var(--color-background-hover) var(--sidebar-item-spacing-horizontal),var(--color-background-hover) 100%);--color-sidebar-item-expander-background:transparent;--color-sidebar-item-expander-background--hover:var( --color-background-hover );--color-sidebar-search-text:var(--color-foreground-primary);--color-sidebar-search-background:var(--color-background-secondary);--color-sidebar-search-background--focus:var(--color-background-primary);--color-sidebar-search-border:var(--color-background-border);--color-sidebar-search-icon:var(--color-foreground-muted);--color-toc-background:var(--color-background-primary);--color-toc-title-text:var(--color-foreground-muted);--color-toc-item-text:var(--color-foreground-secondary);--color-toc-item-text--hover:var(--color-foreground-primary);--color-toc-item-text--active:var(--color-brand-primary);--color-content-foreground:var(--color-foreground-primary);--color-content-background:transparent;--color-link:var(--color-brand-content);--color-link-underline:var(--color-background-border);--color-link--hover:var(--color-brand-content);--color-link-underline--hover:var(--color-foreground-border);--color-link--visited:var(--color-brand-visited);--color-link-underline--visited:var(--color-background-border);--color-link--visited--hover:var(--color-brand-visited);--color-link-underline--visited--hover:var(--color-foreground-border)}.only-light{display:block!important}html body .only-dark{display:none!important}@media not print{body[data-theme=dark]{--color-problematic:#ee5151;--color-foreground-primary:#cfd0d0;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-background-item:#444;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#3d94ff;--color-brand-content:#5ca5ff;--color-brand-visited:#b27aeb;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-api-added:#3db854;--color-api-added-border:#267334;--color-api-changed:#09b0ce;--color-api-changed-border:#056d80;--color-api-deprecated:#b1a10b;--color-api-deprecated-border:#6e6407;--color-api-removed:#ff7575;--color-api-removed-border:#b03b3b;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}html body[data-theme=dark] .only-light{display:none!important}body[data-theme=dark] .only-dark{display:block!important}@media(prefers-color-scheme:dark){body:not([data-theme=light]){--color-problematic:#ee5151;--color-foreground-primary:#cfd0d0;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-background-item:#444;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#3d94ff;--color-brand-content:#5ca5ff;--color-brand-visited:#b27aeb;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-api-added:#3db854;--color-api-added-border:#267334;--color-api-changed:#09b0ce;--color-api-changed-border:#056d80;--color-api-deprecated:#b1a10b;--color-api-deprecated-border:#6e6407;--color-api-removed:#ff7575;--color-api-removed-border:#b03b3b;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}html body:not([data-theme=light]) .only-light{display:none!important}body:not([data-theme=light]) .only-dark{display:block!important}}}body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto-light{display:block}@media(prefers-color-scheme:dark){body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto-dark{display:block}body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto-light{display:none}}body[data-theme=dark] .theme-toggle svg.theme-icon-when-dark,body[data-theme=light] .theme-toggle svg.theme-icon-when-light{display:block}body{font-family:var(--font-stack)}code,kbd,pre,samp{font-family:var(--font-stack--monospace)}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}article{line-height:1.5}h1,h2,h3,h4,h5,h6{border-radius:.5rem;font-family:var(--font-stack--headings);font-weight:700;line-height:1.25;margin:.5rem -.5rem;padding-left:.5rem;padding-right:.5rem}h1+p,h2+p,h3+p,h4+p,h5+p,h6+p{margin-top:0}h1{font-size:2.5em;margin-bottom:1rem}h1,h2{margin-top:1.75rem}h2{font-size:2em}h3{font-size:1.5em}h4{font-size:1.25em}h5{font-size:1.125em}h6{font-size:1em}small{font-size:80%;opacity:75%}p{margin-bottom:.75rem;margin-top:.5rem}hr.docutils{background-color:var(--color-background-border);border:0;height:1px;margin:2rem 0;padding:0}.centered{text-align:center}a{color:var(--color-link);text-decoration:underline;text-decoration-color:var(--color-link-underline)}a:visited{color:var(--color-link--visited);text-decoration-color:var(--color-link-underline--visited)}a:visited:hover{color:var(--color-link--visited--hover);text-decoration-color:var(--color-link-underline--visited--hover)}a:hover{color:var(--color-link--hover);text-decoration-color:var(--color-link-underline--hover)}a.muted-link{color:inherit}a.muted-link:hover{color:var(--color-link--hover);text-decoration-color:var(--color-link-underline--hover)}a.muted-link:hover:visited{color:var(--color-link--visited--hover);text-decoration-color:var(--color-link-underline--visited--hover)}html{overflow-x:hidden;overflow-y:scroll;scroll-behavior:smooth}.sidebar-scroll,.toc-scroll,article[role=main] *{scrollbar-color:var(--color-foreground-border) transparent;scrollbar-width:thin}.sidebar-scroll::-webkit-scrollbar,.toc-scroll::-webkit-scrollbar,article[role=main] ::-webkit-scrollbar{height:.25rem;width:.25rem}.sidebar-scroll::-webkit-scrollbar-thumb,.toc-scroll::-webkit-scrollbar-thumb,article[role=main] ::-webkit-scrollbar-thumb{background-color:var(--color-foreground-border);border-radius:.125rem}body,html{height:100%}.skip-to-content,body,html{background:var(--color-background-primary);color:var(--color-foreground-primary)}.skip-to-content{border-radius:1rem;left:.25rem;padding:1rem;position:fixed;top:.25rem;transform:translateY(-200%);transition:transform .3s ease-in-out;z-index:40}.skip-to-content:focus-within{transform:translateY(0)}article{background:var(--color-content-background);color:var(--color-content-foreground);overflow-wrap:break-word}.page{display:flex;min-height:100%}.mobile-header{background-color:var(--color-header-background);border-bottom:1px solid var(--color-header-border);color:var(--color-header-text);display:none;height:var(--header-height);width:100%;z-index:10}.mobile-header.scrolled{border-bottom:none;box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2)}.mobile-header .header-center a{color:var(--color-header-text);text-decoration:none}.main{display:flex;flex:1}.sidebar-drawer{background:var(--color-sidebar-background);border-right:1px solid var(--color-sidebar-background-border);box-sizing:border-box;display:flex;justify-content:flex-end;min-width:15em;width:calc(50% - 26em)}.sidebar-container,.toc-drawer{box-sizing:border-box;width:15em}.toc-drawer{background:var(--color-toc-background);padding-right:1rem}.sidebar-sticky,.toc-sticky{display:flex;flex-direction:column;height:min(100%,100vh);height:100vh;position:sticky;top:0}.sidebar-scroll,.toc-scroll{flex-grow:1;flex-shrink:1;overflow:auto;scroll-behavior:smooth}.content{display:flex;flex-direction:column;justify-content:space-between;padding:0 3em;width:46em}.icon{display:inline-block;height:1rem;width:1rem}.icon svg{height:100%;width:100%}.announcement{align-items:center;background-color:var(--color-announcement-background);color:var(--color-announcement-text);display:flex;height:var(--header-height);overflow-x:auto}.announcement+.page{min-height:calc(100% - var(--header-height))}.announcement-content{box-sizing:border-box;min-width:100%;padding:.5rem;text-align:center;white-space:nowrap}.announcement-content a{color:var(--color-announcement-text);text-decoration-color:var(--color-announcement-text)}.announcement-content a:hover{color:var(--color-announcement-text);text-decoration-color:var(--color-link--hover)}.no-js .theme-toggle-container{display:none}.theme-toggle-container{vertical-align:middle}.theme-toggle{background:transparent;border:none;cursor:pointer;padding:0}.theme-toggle svg{color:var(--color-foreground-primary);display:none;height:1.25rem;vertical-align:middle;width:1.25rem}.theme-toggle-header{float:left;padding:1rem .5rem}.nav-overlay-icon,.toc-overlay-icon{cursor:pointer;display:none}.nav-overlay-icon .icon,.toc-overlay-icon .icon{color:var(--color-foreground-secondary);height:1.25rem;width:1.25rem}.nav-overlay-icon,.toc-header-icon{align-items:center;justify-content:center}.toc-content-icon{height:1.5rem;width:1.5rem}.content-icon-container{display:flex;float:right;gap:.5rem;margin-bottom:1rem;margin-left:1rem;margin-top:1.5rem}.content-icon-container .edit-this-page svg,.content-icon-container .view-this-page svg{color:inherit;height:1.25rem;width:1.25rem}.sidebar-toggle{display:none;position:absolute}.sidebar-toggle[name=__toc]{left:20px}.sidebar-toggle:checked{left:40px}.overlay{background-color:rgba(0,0,0,.54);height:0;opacity:0;position:fixed;top:0;transition:width 0ms,height 0ms,opacity .25s ease-out;width:0}.sidebar-overlay{z-index:20}.toc-overlay{z-index:40}.sidebar-drawer{transition:left .25s ease-in-out;z-index:30}.toc-drawer{transition:right .25s ease-in-out;z-index:50}#__navigation:checked~.sidebar-overlay{height:100%;opacity:1;width:100%}#__navigation:checked~.page .sidebar-drawer{left:0;top:0}#__toc:checked~.toc-overlay{height:100%;opacity:1;width:100%}#__toc:checked~.page .toc-drawer{right:0;top:0}.back-to-top{background:var(--color-background-primary);border-radius:1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 1px 0 hsla(220,9%,46%,.502);display:none;font-size:.8125rem;left:0;margin-left:50%;padding:.5rem .75rem .5rem .5rem;position:fixed;text-decoration:none;top:1rem;transform:translateX(-50%);z-index:10}.back-to-top svg{height:1rem;width:1rem;fill:currentColor;display:inline-block}.back-to-top span{margin-left:.25rem}.show-back-to-top .back-to-top{align-items:center;display:flex}@media(min-width:97em){html{font-size:110%}}@media(max-width:82em){.toc-content-icon{display:flex}.toc-drawer{border-left:1px solid var(--color-background-muted);height:100vh;position:fixed;right:-15em;top:0}.toc-tree{border-left:none;font-size:var(--toc-font-size--mobile)}.sidebar-drawer{width:calc(50% - 18.5em)}}@media(max-width:67em){.nav-overlay-icon{display:flex}.sidebar-drawer{height:100vh;left:-15em;position:fixed;top:0;width:15em}.toc-header-icon{display:flex}.theme-toggle-content,.toc-content-icon{display:none}.theme-toggle-header{display:block}.mobile-header{align-items:center;display:flex;justify-content:space-between;position:sticky;top:0}.mobile-header .header-left,.mobile-header .header-right{display:flex;height:var(--header-height);padding:0 var(--header-padding)}.mobile-header .header-left label,.mobile-header .header-right label{height:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.nav-overlay-icon .icon,.theme-toggle svg{height:1.25rem;width:1.25rem}:target{scroll-margin-top:calc(var(--header-height) + 2.5rem)}.back-to-top{top:calc(var(--header-height) + .5rem)}.page{flex-direction:column;justify-content:center}.content{margin-left:auto;margin-right:auto}}@media(max-width:52em){.content{overflow-x:auto;width:100%}}@media(max-width:46em){.content{padding:0 1em}article aside.sidebar{float:none;margin:1rem 0;width:100%}}.admonition,.topic{background:var(--color-admonition-background);border-radius:.2rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1);font-size:var(--admonition-font-size);margin:1rem auto;overflow:hidden;padding:0 .5rem .5rem;page-break-inside:avoid}.admonition>:nth-child(2),.topic>:nth-child(2){margin-top:0}.admonition>:last-child,.topic>:last-child{margin-bottom:0}.admonition p.admonition-title,p.topic-title{font-size:var(--admonition-title-font-size);font-weight:500;line-height:1.3;margin:0 -.5rem .5rem;padding:.4rem .5rem .4rem 2rem;position:relative}.admonition p.admonition-title:before,p.topic-title:before{content:"";height:1rem;left:.5rem;position:absolute;width:1rem}p.admonition-title{background-color:var(--color-admonition-title-background)}p.admonition-title:before{background-color:var(--color-admonition-title);-webkit-mask-image:var(--icon-admonition-default);mask-image:var(--icon-admonition-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}p.topic-title{background-color:var(--color-topic-title-background)}p.topic-title:before{background-color:var(--color-topic-title);-webkit-mask-image:var(--icon-topic-default);mask-image:var(--icon-topic-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.admonition{border-left:.2rem solid var(--color-admonition-title)}.admonition.caution{border-left-color:var(--color-admonition-title--caution)}.admonition.caution>.admonition-title{background-color:var(--color-admonition-title-background--caution)}.admonition.caution>.admonition-title:before{background-color:var(--color-admonition-title--caution);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.warning{border-left-color:var(--color-admonition-title--warning)}.admonition.warning>.admonition-title{background-color:var(--color-admonition-title-background--warning)}.admonition.warning>.admonition-title:before{background-color:var(--color-admonition-title--warning);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.danger{border-left-color:var(--color-admonition-title--danger)}.admonition.danger>.admonition-title{background-color:var(--color-admonition-title-background--danger)}.admonition.danger>.admonition-title:before{background-color:var(--color-admonition-title--danger);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.attention{border-left-color:var(--color-admonition-title--attention)}.admonition.attention>.admonition-title{background-color:var(--color-admonition-title-background--attention)}.admonition.attention>.admonition-title:before{background-color:var(--color-admonition-title--attention);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.error{border-left-color:var(--color-admonition-title--error)}.admonition.error>.admonition-title{background-color:var(--color-admonition-title-background--error)}.admonition.error>.admonition-title:before{background-color:var(--color-admonition-title--error);-webkit-mask-image:var(--icon-failure);mask-image:var(--icon-failure)}.admonition.hint{border-left-color:var(--color-admonition-title--hint)}.admonition.hint>.admonition-title{background-color:var(--color-admonition-title-background--hint)}.admonition.hint>.admonition-title:before{background-color:var(--color-admonition-title--hint);-webkit-mask-image:var(--icon-question);mask-image:var(--icon-question)}.admonition.tip{border-left-color:var(--color-admonition-title--tip)}.admonition.tip>.admonition-title{background-color:var(--color-admonition-title-background--tip)}.admonition.tip>.admonition-title:before{background-color:var(--color-admonition-title--tip);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.important{border-left-color:var(--color-admonition-title--important)}.admonition.important>.admonition-title{background-color:var(--color-admonition-title-background--important)}.admonition.important>.admonition-title:before{background-color:var(--color-admonition-title--important);-webkit-mask-image:var(--icon-flame);mask-image:var(--icon-flame)}.admonition.note{border-left-color:var(--color-admonition-title--note)}.admonition.note>.admonition-title{background-color:var(--color-admonition-title-background--note)}.admonition.note>.admonition-title:before{background-color:var(--color-admonition-title--note);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition.seealso{border-left-color:var(--color-admonition-title--seealso)}.admonition.seealso>.admonition-title{background-color:var(--color-admonition-title-background--seealso)}.admonition.seealso>.admonition-title:before{background-color:var(--color-admonition-title--seealso);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.admonition-todo{border-left-color:var(--color-admonition-title--admonition-todo)}.admonition.admonition-todo>.admonition-title{background-color:var(--color-admonition-title-background--admonition-todo)}.admonition.admonition-todo>.admonition-title:before{background-color:var(--color-admonition-title--admonition-todo);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition-todo>.admonition-title{text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd{margin-left:2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:first-child{margin-top:.125rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list,dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:last-child{margin-bottom:.75rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list>dt{font-size:var(--font-size--small);text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd:empty{margin-bottom:.5rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul{margin-left:-1.2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p:nth-child(2){margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p+p:last-child:empty{margin-bottom:0;margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{color:var(--color-api-overall)}.sig:not(.sig-inline){background:var(--color-api-background);border-radius:.25rem;font-family:var(--font-stack--monospace);font-size:var(--api-font-size);font-weight:700;margin-left:-.25rem;margin-right:-.25rem;padding:.25rem .5rem .25rem 3em;text-indent:-2.5em;transition:background .1s ease-out}.sig:not(.sig-inline):hover{background:var(--color-api-background-hover)}.sig:not(.sig-inline) a.reference .viewcode-link{font-weight:400;width:4.25rem}em.property{font-style:normal}em.property:first-child{color:var(--color-api-keyword)}.sig-name{color:var(--color-api-name)}.sig-prename{color:var(--color-api-pre-name);font-weight:400}.sig-paren{color:var(--color-api-paren)}.sig-param{font-style:normal}div.deprecated,div.versionadded,div.versionchanged,div.versionremoved{border-left:.1875rem solid;border-radius:.125rem;padding-left:.75rem}div.deprecated p,div.versionadded p,div.versionchanged p,div.versionremoved p{margin-bottom:.125rem;margin-top:.125rem}div.versionadded{border-color:var(--color-api-added-border)}div.versionadded .versionmodified{color:var(--color-api-added)}div.versionchanged{border-color:var(--color-api-changed-border)}div.versionchanged .versionmodified{color:var(--color-api-changed)}div.deprecated{border-color:var(--color-api-deprecated-border)}div.deprecated .versionmodified{color:var(--color-api-deprecated)}div.versionremoved{border-color:var(--color-api-removed-border)}div.versionremoved .versionmodified{color:var(--color-api-removed)}.viewcode-back,.viewcode-link{float:right;text-align:right}.line-block{margin-bottom:.75rem;margin-top:.5rem}.line-block .line-block{margin-bottom:0;margin-top:0;padding-left:1rem}.code-block-caption,article p.caption,table>caption{font-size:var(--font-size--small);text-align:center}.toctree-wrapper.compound .caption,.toctree-wrapper.compound :not(.caption)>.caption-text{font-size:var(--font-size--small);margin-bottom:0;text-align:initial;text-transform:uppercase}.toctree-wrapper.compound>ul{margin-bottom:0;margin-top:0}.sig-inline,code.literal{background:var(--color-inline-code-background);border-radius:.2em;font-size:var(--font-size--small--2);padding:.1em .2em}pre.literal-block .sig-inline,pre.literal-block code.literal{font-size:inherit;padding:0}p .sig-inline,p code.literal{border:1px solid var(--color-background-border)}.sig-inline{font-family:var(--font-stack--monospace)}div[class*=" highlight-"],div[class^=highlight-]{display:flex;margin:1em 0}div[class*=" highlight-"] .table-wrapper,div[class^=highlight-] .table-wrapper,pre{margin:0;padding:0}pre{overflow:auto}article[role=main] .highlight pre{line-height:1.5}.highlight pre,pre.literal-block{font-size:var(--code-font-size);padding:.625rem .875rem}pre.literal-block{background-color:var(--color-code-background);border-radius:.2rem;color:var(--color-code-foreground);margin-bottom:1rem;margin-top:1rem}.highlight{border-radius:.2rem;width:100%}.highlight .gp,.highlight span.linenos{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.highlight .hll{display:block;margin-left:-.875rem;margin-right:-.875rem;padding-left:.875rem;padding-right:.875rem}.code-block-caption{background-color:var(--color-code-background);border-bottom:1px solid;border-radius:.25rem;border-bottom-left-radius:0;border-bottom-right-radius:0;border-color:var(--color-background-border);color:var(--color-code-foreground);display:flex;font-weight:300;padding:.625rem .875rem}.code-block-caption+div[class]{margin-top:0}.code-block-caption+div[class] pre{border-top-left-radius:0;border-top-right-radius:0}.highlighttable{display:block;width:100%}.highlighttable tbody{display:block}.highlighttable tr{display:flex}.highlighttable td.linenos{background-color:var(--color-code-background);border-bottom-left-radius:.2rem;border-top-left-radius:.2rem;color:var(--color-code-foreground);padding:.625rem 0 .625rem .875rem}.highlighttable .linenodiv{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;font-size:var(--code-font-size);padding-right:.875rem}.highlighttable td.code{display:block;flex:1;overflow:hidden;padding:0}.highlighttable td.code .highlight{border-bottom-left-radius:0;border-top-left-radius:0}.highlight span.linenos{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;display:inline-block;margin-right:.875rem;padding-left:0;padding-right:.875rem}.footnote-reference{font-size:var(--font-size--small--4);vertical-align:super}dl.footnote.brackets{color:var(--color-foreground-secondary);display:grid;font-size:var(--font-size--small);grid-template-columns:max-content auto}dl.footnote.brackets dt{margin:0}dl.footnote.brackets dt>.fn-backref{margin-left:.25rem}dl.footnote.brackets dt:after{content:":"}dl.footnote.brackets dt .brackets:before{content:"["}dl.footnote.brackets dt .brackets:after{content:"]"}dl.footnote.brackets dd{margin:0;padding:0 1rem}aside.footnote{color:var(--color-foreground-secondary);font-size:var(--font-size--small)}aside.footnote>span,div.citation>span{float:left;font-weight:500;padding-right:.25rem}aside.footnote>:not(span),div.citation>p{margin-left:2rem}img{box-sizing:border-box;height:auto;max-width:100%}article .figure,article figure{border-radius:.2rem;margin:0}article .figure :last-child,article figure :last-child{margin-bottom:0}article .align-left{clear:left;float:left;margin:0 1rem 1rem}article .align-right{clear:right;float:right;margin:0 1rem 1rem}article .align-center,article .align-default{display:block;margin-left:auto;margin-right:auto;text-align:center}article table.align-default{display:table;text-align:initial}.domainindex-jumpbox,.genindex-jumpbox{border-bottom:1px solid var(--color-background-border);border-top:1px solid var(--color-background-border);padding:.25rem}.domainindex-section h2,.genindex-section h2{margin-bottom:.5rem;margin-top:.75rem}.domainindex-section ul,.genindex-section ul{margin-bottom:0;margin-top:0}ol,ul{margin-bottom:1rem;margin-top:1rem;padding-left:1.2rem}ol li>p:first-child,ul li>p:first-child{margin-bottom:.25rem;margin-top:.25rem}ol li>p:last-child,ul li>p:last-child{margin-top:.25rem}ol li>ol,ol li>ul,ul li>ol,ul li>ul{margin-bottom:.5rem;margin-top:.5rem}ol.arabic{list-style:decimal}ol.loweralpha{list-style:lower-alpha}ol.upperalpha{list-style:upper-alpha}ol.lowerroman{list-style:lower-roman}ol.upperroman{list-style:upper-roman}.simple li>ol,.simple li>ul,.toctree-wrapper li>ol,.toctree-wrapper li>ul{margin-bottom:0;margin-top:0}.field-list dt,.option-list dt,dl.footnote dt,dl.glossary dt,dl.simple dt,dl:not([class]) dt{font-weight:500;margin-top:.25rem}.field-list dt+dt,.option-list dt+dt,dl.footnote dt+dt,dl.glossary dt+dt,dl.simple dt+dt,dl:not([class]) dt+dt{margin-top:0}.field-list dt .classifier:before,.option-list dt .classifier:before,dl.footnote dt .classifier:before,dl.glossary dt .classifier:before,dl.simple dt .classifier:before,dl:not([class]) dt .classifier:before{content:":";margin-left:.2rem;margin-right:.2rem}.field-list dd ul,.field-list dd>p:first-child,.option-list dd ul,.option-list dd>p:first-child,dl.footnote dd ul,dl.footnote dd>p:first-child,dl.glossary dd ul,dl.glossary dd>p:first-child,dl.simple dd ul,dl.simple dd>p:first-child,dl:not([class]) dd ul,dl:not([class]) dd>p:first-child{margin-top:.125rem}.field-list dd ul,.option-list dd ul,dl.footnote dd ul,dl.glossary dd ul,dl.simple dd ul,dl:not([class]) dd ul{margin-bottom:.125rem}.math-wrapper{overflow-x:auto;width:100%}div.math{position:relative;text-align:center}div.math .headerlink,div.math:focus .headerlink{display:none}div.math:hover .headerlink{display:inline-block}div.math span.eqno{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}abbr[title]{cursor:help}.problematic{color:var(--color-problematic)}kbd:not(.compound){background-color:var(--color-background-secondary);border:1px solid var(--color-foreground-border);border-radius:.2rem;box-shadow:0 .0625rem 0 rgba(0,0,0,.2),inset 0 0 0 .125rem var(--color-background-primary);color:var(--color-foreground-primary);display:inline-block;font-size:var(--font-size--small--3);margin:0 .2rem;padding:0 .2rem;vertical-align:text-bottom}blockquote{background:var(--color-background-secondary);border-left:4px solid var(--color-background-border);margin-left:0;margin-right:0;padding:.5rem 1rem}blockquote .attribution{font-weight:600;text-align:right}blockquote.highlights,blockquote.pull-quote{font-size:1.25em}blockquote.epigraph,blockquote.pull-quote{border-left-width:0;border-radius:.5rem}blockquote.highlights{background:transparent;border-left-width:0}p .reference img{vertical-align:middle}p.rubric{font-size:1.125em;font-weight:700;line-height:1.25}dd p.rubric{font-size:var(--font-size--small);font-weight:inherit;line-height:inherit;text-transform:uppercase}article .sidebar{background-color:var(--color-background-secondary);border:1px solid var(--color-background-border);border-radius:.2rem;clear:right;float:right;margin-left:1rem;margin-right:0;width:30%}article .sidebar>*{padding-left:1rem;padding-right:1rem}article .sidebar>ol,article .sidebar>ul{padding-left:2.2rem}article .sidebar .sidebar-title{border-bottom:1px solid var(--color-background-border);font-weight:500;margin:0;padding:.5rem 1rem}.table-wrapper{margin-bottom:.5rem;margin-top:1rem;overflow-x:auto;padding:.2rem .2rem .75rem;width:100%}table.docutils{border-collapse:collapse;border-radius:.2rem;border-spacing:0;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)}table.docutils th{background:var(--color-table-header-background)}table.docutils td,table.docutils th{border-bottom:1px solid var(--color-table-border);border-left:1px solid var(--color-table-border);border-right:1px solid var(--color-table-border);padding:0 .25rem}table.docutils td p,table.docutils th p{margin:.25rem}table.docutils td:first-child,table.docutils th:first-child{border-left:none}table.docutils td:last-child,table.docutils th:last-child{border-right:none}table.docutils td.text-left,table.docutils th.text-left{text-align:left}table.docutils td.text-right,table.docutils th.text-right{text-align:right}table.docutils td.text-center,table.docutils th.text-center{text-align:center}:target{scroll-margin-top:2.5rem}@media(max-width:67em){:target{scroll-margin-top:calc(2.5rem + var(--header-height))}section>span:target{scroll-margin-top:calc(2.8rem + var(--header-height))}}.headerlink{font-weight:100;-webkit-user-select:none;-moz-user-select:none;user-select:none}.code-block-caption>.headerlink,dl dt>.headerlink,figcaption p>.headerlink,h1>.headerlink,h2>.headerlink,h3>.headerlink,h4>.headerlink,h5>.headerlink,h6>.headerlink,p.caption>.headerlink,table>caption>.headerlink{margin-left:.5rem;visibility:hidden}.code-block-caption:hover>.headerlink,dl dt:hover>.headerlink,figcaption p:hover>.headerlink,h1:hover>.headerlink,h2:hover>.headerlink,h3:hover>.headerlink,h4:hover>.headerlink,h5:hover>.headerlink,h6:hover>.headerlink,p.caption:hover>.headerlink,table>caption:hover>.headerlink{visibility:visible}.code-block-caption>.toc-backref,dl dt>.toc-backref,figcaption p>.toc-backref,h1>.toc-backref,h2>.toc-backref,h3>.toc-backref,h4>.toc-backref,h5>.toc-backref,h6>.toc-backref,p.caption>.toc-backref,table>caption>.toc-backref{color:inherit;text-decoration-line:none}figure:hover>figcaption>p>.headerlink,table:hover>caption>.headerlink{visibility:visible}:target>h1:first-of-type,:target>h2:first-of-type,:target>h3:first-of-type,:target>h4:first-of-type,:target>h5:first-of-type,:target>h6:first-of-type,span:target~h1:first-of-type,span:target~h2:first-of-type,span:target~h3:first-of-type,span:target~h4:first-of-type,span:target~h5:first-of-type,span:target~h6:first-of-type{background-color:var(--color-highlight-on-target)}:target>h1:first-of-type code.literal,:target>h2:first-of-type code.literal,:target>h3:first-of-type code.literal,:target>h4:first-of-type code.literal,:target>h5:first-of-type code.literal,:target>h6:first-of-type code.literal,span:target~h1:first-of-type code.literal,span:target~h2:first-of-type code.literal,span:target~h3:first-of-type code.literal,span:target~h4:first-of-type code.literal,span:target~h5:first-of-type code.literal,span:target~h6:first-of-type code.literal{background-color:transparent}.literal-block-wrapper:target .code-block-caption,.this-will-duplicate-information-and-it-is-still-useful-here li :target,figure:target,table:target>caption{background-color:var(--color-highlight-on-target)}dt:target{background-color:var(--color-highlight-on-target)!important}.footnote-reference:target,.footnote>dt:target+dd{background-color:var(--color-highlight-on-target)}.guilabel{background-color:var(--color-guilabel-background);border:1px solid var(--color-guilabel-border);border-radius:.5em;color:var(--color-guilabel-text);font-size:.9em;padding:0 .3em}footer{display:flex;flex-direction:column;font-size:var(--font-size--small);margin-top:2rem}.bottom-of-page{align-items:center;border-top:1px solid var(--color-background-border);color:var(--color-foreground-secondary);display:flex;justify-content:space-between;line-height:1.5;margin-top:1rem;padding-bottom:1rem;padding-top:1rem}@media(max-width:46em){.bottom-of-page{flex-direction:column-reverse;gap:.25rem;text-align:center}}.bottom-of-page .left-details{font-size:var(--font-size--small)}.bottom-of-page .right-details{display:flex;flex-direction:column;gap:.25rem;text-align:right}.bottom-of-page .icons{display:flex;font-size:1rem;gap:.25rem;justify-content:flex-end}.bottom-of-page .icons a{text-decoration:none}.bottom-of-page .icons img,.bottom-of-page .icons svg{font-size:1.125rem;height:1em;width:1em}.related-pages a{align-items:center;display:flex;text-decoration:none}.related-pages a:hover .page-info .title{color:var(--color-link);text-decoration:underline;text-decoration-color:var(--color-link-underline)}.related-pages a svg.furo-related-icon,.related-pages a svg.furo-related-icon>use{color:var(--color-foreground-border);flex-shrink:0;height:.75rem;margin:0 .5rem;width:.75rem}.related-pages a.next-page{clear:right;float:right;max-width:50%;text-align:right}.related-pages a.prev-page{clear:left;float:left;max-width:50%}.related-pages a.prev-page svg{transform:rotate(180deg)}.page-info{display:flex;flex-direction:column;overflow-wrap:anywhere}.next-page .page-info{align-items:flex-end}.page-info .context{align-items:center;color:var(--color-foreground-muted);display:flex;font-size:var(--font-size--small);padding-bottom:.1rem;text-decoration:none}ul.search{list-style:none;padding-left:0}ul.search li{border-bottom:1px solid var(--color-background-border);padding:1rem 0}[role=main] .highlighted{background-color:var(--color-highlighted-background);color:var(--color-highlighted-text)}.sidebar-brand{display:flex;flex-direction:column;flex-shrink:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none}.sidebar-brand-text{color:var(--color-sidebar-brand-text);font-size:1.5rem;overflow-wrap:break-word}.sidebar-brand-text,.sidebar-logo-container{margin:var(--sidebar-item-spacing-vertical) 0}.sidebar-logo{display:block;margin:0 auto;max-width:100%}.sidebar-search-container{align-items:center;background:var(--color-sidebar-search-background);display:flex;margin-top:var(--sidebar-search-space-above);position:relative}.sidebar-search-container:focus-within,.sidebar-search-container:hover{background:var(--color-sidebar-search-background--focus)}.sidebar-search-container:before{background-color:var(--color-sidebar-search-icon);content:"";height:var(--sidebar-search-icon-size);left:var(--sidebar-item-spacing-horizontal);-webkit-mask-image:var(--icon-search);mask-image:var(--icon-search);position:absolute;width:var(--sidebar-search-icon-size)}.sidebar-search{background:transparent;border:none;border-bottom:1px solid var(--color-sidebar-search-border);border-top:1px solid var(--color-sidebar-search-border);box-sizing:border-box;color:var(--color-sidebar-search-foreground);padding:var(--sidebar-search-input-spacing-vertical) var(--sidebar-search-input-spacing-horizontal) var(--sidebar-search-input-spacing-vertical) calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size));width:100%;z-index:10}.sidebar-search:focus{outline:none}.sidebar-search::-moz-placeholder{font-size:var(--sidebar-search-input-font-size)}.sidebar-search::placeholder{font-size:var(--sidebar-search-input-font-size)}#searchbox .highlight-link{margin:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0;text-align:center}#searchbox .highlight-link a{color:var(--color-sidebar-search-icon);font-size:var(--font-size--small--2)}.sidebar-tree{font-size:var(--sidebar-item-font-size);margin-bottom:var(--sidebar-item-spacing-vertical);margin-top:var(--sidebar-tree-space-above)}.sidebar-tree ul{display:flex;flex-direction:column;list-style:none;margin-bottom:0;margin-top:0;padding:0}.sidebar-tree li{margin:0;position:relative}.sidebar-tree li>ul{margin-left:var(--sidebar-item-spacing-horizontal)}.sidebar-tree .icon,.sidebar-tree .reference{color:var(--color-sidebar-link-text)}.sidebar-tree .reference{box-sizing:border-box;display:inline-block;height:100%;line-height:var(--sidebar-item-line-height);overflow-wrap:anywhere;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none;width:100%}.sidebar-tree .reference:hover{background:var(--color-sidebar-item-background--hover);color:var(--color-sidebar-link-text)}.sidebar-tree .reference.external:after{color:var(--color-sidebar-link-text);content:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23607D8B' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' viewBox='0 0 24 24'%3E%3Cpath stroke='none' d='M0 0h24v24H0z'/%3E%3Cpath d='M11 7H6a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-5M10 14 20 4M15 4h5v5'/%3E%3C/svg%3E");margin:0 .25rem;vertical-align:middle}.sidebar-tree .current-page>.reference{font-weight:700}.sidebar-tree label{align-items:center;cursor:pointer;display:flex;height:var(--sidebar-item-height);justify-content:center;position:absolute;right:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--sidebar-expander-width)}.sidebar-tree .caption,.sidebar-tree :not(.caption)>.caption-text{color:var(--color-sidebar-caption-text);font-size:var(--sidebar-caption-font-size);font-weight:700;margin:var(--sidebar-caption-space-above) 0 0 0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-transform:uppercase}.sidebar-tree li.has-children>.reference{padding-right:var(--sidebar-expander-width)}.sidebar-tree .toctree-l1>.reference,.sidebar-tree .toctree-l1>label .icon{color:var(--color-sidebar-link-text--top-level)}.sidebar-tree label{background:var(--color-sidebar-item-expander-background)}.sidebar-tree label:hover{background:var(--color-sidebar-item-expander-background--hover)}.sidebar-tree .current>.reference{background:var(--color-sidebar-item-background--current)}.sidebar-tree .current>.reference:hover{background:var(--color-sidebar-item-background--hover)}.toctree-checkbox{display:none;position:absolute}.toctree-checkbox~ul{display:none}.toctree-checkbox~label .icon svg{transform:rotate(90deg)}.toctree-checkbox:checked~ul{display:block}.toctree-checkbox:checked~label .icon svg{transform:rotate(-90deg)}.toc-title-container{padding:var(--toc-title-padding);padding-top:var(--toc-spacing-vertical)}.toc-title{color:var(--color-toc-title-text);font-size:var(--toc-title-font-size);padding-left:var(--toc-spacing-horizontal);text-transform:uppercase}.no-toc{display:none}.toc-tree-container{padding-bottom:var(--toc-spacing-vertical)}.toc-tree{border-left:1px solid var(--color-background-border);font-size:var(--toc-font-size);line-height:1.3;padding-left:calc(var(--toc-spacing-horizontal) - var(--toc-item-spacing-horizontal))}.toc-tree>ul>li:first-child{padding-top:0}.toc-tree>ul>li:first-child>ul{padding-left:0}.toc-tree>ul>li:first-child>a{display:none}.toc-tree ul{list-style-type:none;margin-bottom:0;margin-top:0;padding-left:var(--toc-item-spacing-horizontal)}.toc-tree li{padding-top:var(--toc-item-spacing-vertical)}.toc-tree li.scroll-current>.reference{color:var(--color-toc-item-text--active);font-weight:700}.toc-tree a.reference{color:var(--color-toc-item-text);overflow-wrap:anywhere;text-decoration:none}.toc-scroll{max-height:100vh;overflow-y:scroll}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here){background:rgba(255,0,0,.25);color:var(--color-problematic)}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here):before{content:"ERROR: Adding a table of contents in Furo-based documentation is unnecessary, and does not work well with existing styling. Add a 'this-will-duplicate-information-and-it-is-still-useful-here' class, if you want an escape hatch."}.text-align\:left>p{text-align:left}.text-align\:center>p{text-align:center}.text-align\:right>p{text-align:right} +/*# sourceMappingURL=furo.css.map*/ \ No newline at end of file diff --git a/latest/_static/styles/furo.css.map b/latest/_static/styles/furo.css.map new file mode 100644 index 000000000..6e02d0b1a --- /dev/null +++ b/latest/_static/styles/furo.css.map @@ -0,0 +1 @@ +{"version":3,"file":"styles/furo.css","mappings":"AAAA,2EAA2E,CAU3E,KACE,gBAAiB,CACjB,6BACF,CASA,KACE,QACF,CAMA,KACE,aACF,CAOA,GACE,aAAc,CACd,cACF,CAUA,GACE,sBAAuB,CACvB,QAAS,CACT,gBACF,CAOA,IACE,+BAAiC,CACjC,aACF,CASA,EACE,4BACF,CAOA,YACE,kBAAmB,CACnB,yBAA0B,CAC1B,gCACF,CAMA,SAEE,kBACF,CAOA,cAGE,+BAAiC,CACjC,aACF,CAeA,QAEE,aAAc,CACd,aAAc,CACd,iBAAkB,CAClB,uBACF,CAEA,IACE,aACF,CAEA,IACE,SACF,CASA,IACE,iBACF,CAUA,sCAKE,mBAAoB,CACpB,cAAe,CACf,gBAAiB,CACjB,QACF,CAOA,aAEE,gBACF,CAOA,cAEE,mBACF,CAMA,gDAIE,yBACF,CAMA,wHAIE,iBAAkB,CAClB,SACF,CAMA,4GAIE,6BACF,CAMA,SACE,0BACF,CASA,OACE,qBAAsB,CACtB,aAAc,CACd,aAAc,CACd,cAAe,CACf,SAAU,CACV,kBACF,CAMA,SACE,uBACF,CAMA,SACE,aACF,CAOA,6BAEE,qBAAsB,CACtB,SACF,CAMA,kFAEE,WACF,CAOA,cACE,4BAA6B,CAC7B,mBACF,CAMA,yCACE,uBACF,CAOA,6BACE,yBAA0B,CAC1B,YACF,CASA,QACE,aACF,CAMA,QACE,iBACF,CAiBA,kBACE,YACF,CCvVA,aAcE,kEACE,uBAOF,WACE,iDAMF,gCACE,wBAEF,qCAEE,uBADA,uBACA,CAEF,SACE,wBAtBA,CCpBJ,iBAGE,qBAEA,sBACA,0BAFA,oBAHA,4BACA,oBAKA,6BAIA,2CAFA,mBACA,sCAFA,4BAGA,CAEF,gBACE,aCTF,KCGE,mHAEA,wGAEA,wCAAyC,CAEzC,wBAAyB,CACzB,wBAAyB,CACzB,4BAA6B,CAC7B,yBAA0B,CAC1B,2BAA4B,CAG5B,sDAAuD,CACvD,gDAAiD,CACjD,wDAAyD,CAGzD,0CAA2C,CAC3C,gDAAiD,CACjD,gDAAiD,CAKjD,gCAAiC,CACjC,sCAAuC,CAGvC,2CAA4C,CAG5C,uCAAwC,CCjCxC,+FAGA,uBAAwB,CAGxB,iCAAkC,CAClC,kCAAmC,CAEnC,+BAAgC,CAChC,sCAAuC,CACvC,sCAAuC,CACvC,qGAIA,mDAAoD,CAEpD,mCAAoC,CACpC,8CAA+C,CAC/C,gDAAiD,CACjD,kCAAmC,CACnC,6DAA8D,CAG9D,6BAA8B,CAC9B,6BAA8B,CAC9B,+BAAgC,CAChC,kCAAmC,CACnC,kCAAmC,CCPjC,+jBCYA,iqCAZF,iaCVA,8KAOA,4SAWA,4SAUA,0CACA,gEAGA,0CAGA,gEAGA,yCACA,+DAIA,4CACA,kEAGA,wCAUA,8DACA,uCAGA,4DACA,sCACA,2DAGA,4CACA,kEACA,uCAGA,6DACA,2GAGA,sHAEA,yFAEA,+CACA,+EAGA,4MAOA,gCACA,sHAIA,kCACA,uEACA,gEACA,4DACA,kEAGA,2DACA,sDACA,0CACA,8CACA,wGAGA,0BACA,iCAGA,+DACA,+BACA,sCACA,+DAEA,kGACA,oCACA,yDACA,sCL7HF,kCAEA,sDAIA,0CK2HE,kEAIA,oDACA,sDAGA,oCACA,oEAEA,0DACA,qDAIA,oDACA,6DAIA,iEAIA,2DAIA,2DAGA,4DACA,gEAIA,gEAEA,gFAEA,oNASA,qDLxKE,gFAGE,4DAIF,oEKkHF,yEAEA,6DAGA,0DAEA,uDACA,qDACA,wDAIA,6DAIA,yDACA,2DAIA,uCAGA,wCACA,sDAGA,+CAGA,6DAEA,iDACA,+DAEA,wDAEA,sEAMA,0DACA,sBACA,mEL9JI,wEAEA,iCACE,+BAMN,wEAGA,iCACE,kFAEA,uEAIF,gEACE,8BAGF,qEMvDA,sCAKA,wFAKA,iCAIA,0BAWA,iCACA,4BACA,mCAGA,+BAEA,sCACA,4BAEA,mCAEA,sCAKA,sDAIA,gCAEA,gEAQF,wCAME,sBACA,kCAKA,uBAEA,gEAIA,2BAIA,mCAEA,qCACA,iCAGE,+BACA,wEAEE,iCACA,kFAGF,6BACA,0CACF,kCAEE,8BACE,8BACA,qEAEE,sCACA,wFCjFN,iCAGF,2DAEE,4BACA,oCAGA,mIAGA,4HACE,gEAMJ,+CAGE,sBACA,yCAEF,uBAEE,sEAKA,gDACA,kEAGA,iFAGE,YAGF,EACA,4HAQF,mBACE,6BACA,mBACA,wCACA,wCACA,2CAIA,eAGA,mBAKE,mBAGA,CAJA,uCACA,iBAFF,gBACE,CAKE,mBACA,mBAGJ,oBAIF,+BAGE,kDACA,OADA,kBAGA,CAFA,gBAEA,mBACA,oBAEA,sCACA,OAGF,cAHE,WAGF,GAEE,oBACA,CAHF,gBAGE,CChHc,YDmHd,+CAIF,SAEE,CAPF,UACE,wBAMA,4BAEA,GAGA,uBACA,CAJA,yBAGA,CACA,iDAKA,2CAGA,2DAQA,iBACA,uCAGA,kEAKE,SAKJ,8BACE,yDACA,2BAEA,oBACA,8BAEA,yDAEE,4BAEJ,uCACE,CACA,iEAGA,CAEA,wCACE,uBACA,kDAEA,0DAEE,CAJF,oBAIE,0GASJ,aAEF,CAFE,YAEF,4HASE,+CACA,sBAGF,sBASE,4BAFF,0CAEE,CARA,qCAwBF,CAhBE,iBAEA,kBACE,aADF,4BACE,WAOF,2BAEF,qCAIA,CAbI,UAaJ,+BACE,uBAEA,SAGA,0CAGE,CANF,qCAGA,CAGE,2DACE,gBAKJ,+CAGF,CAEA,kDAME,CARF,8BAEA,CAQE,YAEA,CAlBI,2BAGJ,CAJI,UACA,CAcJ,UAIA,4GAIF,iCAGE,8BAIA,qBACA,mBACF,QACE,gBAOE,0CAGA,CATF,6DAME,CANF,sBASE,qCAKF,CAEE,cACA,CAHF,sBAGE,gCAEA,qBAOJ,wBACE,sCAIA,mBAEA,6BAKA,kCACA,CAHA,sBAEA,cAJA,eACA,MAIA,2FAIA,UACA,YACA,sBACE,8BAEA,CALF,aACA,WAIE,CACA,0BAEF,aACE,qBAEF,qCAgBA,kBACE,CAhBA,qDASA,qCAEJ,CAGI,YACF,CAJF,2BAGI,CAGA,eACE,CAAF,oBAEA,mEAEA,qBACA,eAGF,CAHE,cAIA,kBADF,kBACE,yBAEJ,oCAGI,qDAIA,+BAMF,oCAEA,+CAEA,gCAIA,YACE,yBAEA,qBACA,eAGA,uBAFA,WAEA,CAHA,cACA,CAEA,4BAIE,qCACA,cAFA,eADA,qBACA,cAEA,mDACE,CACA,oCACA,4EAEN,uCAMA,eACE,kDAIA,mBADF,sBACE,mBAIA,aACA,sCAGA,aADA,WACA,CAMA,UAFF,kBAEE,CAJJ,gBAEE,CAJE,iBAMA,yFAQA,aACA,eEpbJ,cACE,iBACA,YAEA,CAFA,iBAEA,+DAGA,mBAKA,gCAGA,CARA,SAIA,SACA,CALA,0EAIA,CAJA,OAQA,0CACE,UAGF,iDAGF,CAHE,UAGF,8CAEE,CAFF,UAEE,CACA,uCAEA,WACA,WAFA,UAEA,6CAIA,yCACA,WAGA,WAJA,UAIA,gDACE,aASF,0CACE,CAFF,mBAEE,wEACA,CATA,YACA,CAKF,kBACA,CALE,MAGJ,CAII,eACA,CAJF,iCALE,cACA,CAHA,oBACA,CAKJ,SAKI,2BADA,UACA,6BAEJ,WACE,0DACA,kBACE,gCACA,mBADA,YACA,oEACA,2CAMF,mDAII,CAJJ,aADF,cACE,kBAII,kEACA,iBACE,mEACA,6BACE,wBADF,cACE,mCACA,qDANN,kCACE,6BAEE,mBADF,0CACE,CAFF,eACA,MACE,0DACA,wCACE,sGACA,WANN,yBACE,uCACA,CAFF,UAEE,2CACE,0FACA,cACE,kEACA,mEANN,yBACE,4DACA,sBACE,+EAEE,iEACA,qEANN,sCACE,CAGE,iBAHF,gBAGE,qBACE,CAJJ,uBACA,gDACE,wDACA,6DAHF,2CACA,CADA,gBACA,eACE,CAGE,sBANN,8BACE,CAII,iBAFF,4DACA,WACE,YADF,uCACE,6EACA,2BANN,8CACE,kDACA,0CACE,8BACA,yFACE,sBACA,sFALJ,mEACA,sBACE,kEACA,6EACE,uCACA,kEALJ,qGAEE,kEACA,6EACE,uCACA,kEALJ,8CACA,uDACE,sEACA,2EACE,sCACA,iEALJ,mGACA,qCACE,oDACA,0DACE,6GACA,gDAGR,yDCrEA,sEACE,CACA,6GACE,gEACF,iGAIF,wFACE,qDAGA,mGAEE,2CAEF,4FACE,gCACF,wGACE,8DAEE,6FAIA,iJAKN,6GACE,gDAKF,yDACA,qCAGA,6BACA,kBACA,qDAKA,oCAEA,+DAGA,2CAGE,oDAIA,oEAEE,qBAGJ,wDAEE,uCAEF,kEAGA,8CAEA,uDAIF,gEAIE,6BACA,gEAIA,+CACE,0EAIF,sDAEE,+DAGF,sCACA,8BACE,oCAEJ,wBACE,4FAEE,gBAEJ,yGAGI,kBAGJ,CCnHE,2MCFF,oBAGE,wGAKA,iCACE,CADF,wBACE,8GAQA,mBCjBJ,2GAIE,mBACA,6HAMA,YACE,mIAYF,eACA,CAHF,YAGE,4FAGE,8BAKF,uBAkBE,sCACA,CADA,qBAbA,wCAIA,CALF,8BACE,CADF,gBAKE,wCACA,CAOA,kDACA,CACA,kCAKF,6BAGA,4CACE,kDACA,eAGF,cACE,aACA,iBACA,yBACA,8BACA,WAGJ,2BACE,cAGA,+BACA,CAHA,eAGA,wCACA,YACA,iBACA,uEAGA,0BACA,2CAEA,8EAGI,qBACA,CAFF,kBAEE,kBAGN,0CAGE,mCAGA,4BAIA,gEACE,qCACA,8BAEA,gBACA,+CACA,iCAEF,iCAEE,gEACA,qCAGF,8BAEE,+BAIA,yCAEE,qBADA,gBACA,yBAKF,eACA,CAFF,YACE,CACA,iBACA,qDAEA,mDCvIJ,2FAOE,iCACA,CAEA,eACA,CAHA,kBAEA,CAFA,wBAGA,8BACA,eACE,CAFF,YAEE,0BACA,8CAGA,oBACE,oCAGA,kBACE,8DAEA,iBAEN,UACE,8BAIJ,+CAEE,qDAEF,kDAIE,YAEF,CAFE,YAEF,CCpCE,mFADA,kBAKE,CAJF,IAGA,aACE,mCAGA,iDACE,+BAEJ,wBAEE,mBAMA,6CAEF,CAJE,mBAEA,CAEF,kCAGE,CARF,kBACE,CAHA,eAUA,YACA,mBACA,CADA,UACA,wCC9BF,oBDkCE,wBCnCJ,uCACE,+BACA,+DACA,sBAGA,qBCDA,6CAIE,CAPF,uBAGA,CDGE,oBACF,yDAEE,CCDE,2CAGF,CAJA,kCACE,CDJJ,YACE,CAIA,eCTF,CDKE,uBCMA,gCACE,YAEF,oCAEE,wBACA,0BAIF,iBAEA,cADF,UACE,uBAEA,iCAEA,wCAEA,6CAMA,CAYF,gCATI,4BASJ,CAZE,mCAEE,iCAUJ,4BAGE,4DADA,+BACA,CAHF,qBAGE,sCACE,OAEF,iBAHA,SAGA,iHACE,2DAKF,CANA,8EAMA,uSAEE,kBAEF,+FACE,yCCjEJ,WACA,yBAGA,uBACA,gBAEA,uCAIA,CAJA,iCAIA,uCAGA,UACE,gBACA,qBAEA,0CClBJ,gBACE,KAGF,qBACE,YAGF,CAHE,cAGF,gCAEE,mBACA,iEAEA,oCACA,wCAEA,sBACA,WAEA,CAFA,YAEA,8EAEA,mCAFA,iBAEA,6BAIA,wEAKA,sDAIE,CARF,mDAIA,CAIE,cAEF,8CAIA,oBAFE,iBAEF,8CAGE,eAEF,CAFE,YAEF,OAEE,kBAGJ,CAJI,eACA,CAFF,mBAKF,yCCjDE,oBACA,CAFA,iBAEA,uCAKE,iBACA,qCAGA,mBCZJ,CDWI,gBCXJ,6BAEE,eACA,sBAGA,eAEA,sBACA,oDACA,iGAMA,gBAFE,YAEF,8FAME,iJClBF,YACA,gNAUE,6BAEF,oTAcI,kBACF,gHAIA,qBACE,eACF,qDACE,kBACF,6DACE,4BCxCJ,oBAEF,qCAEI,+CAGF,uBACE,uDAGJ,oBAiBI,kDACF,CAhBA,+CAaA,CAbA,oBAaA,0FAEE,CAFF,gGAdA,cACA,iBAaA,0BAGA,mQAIA,oNAEE,iBAGJ,CAHI,gBAFF,gBAKF,8CAYI,CAZJ,wCAYI,sVACE,iCAGA,uEAHA,QAGA,qXAKJ,iDAGF,CARM,+CACE,iDAIN,CALI,gBAQN,mHACE,gBAGF,2DACE,0EAOA,0EAGF,gBAEE,6DC/EA,kDACA,gCACA,qDAGA,qBACA,qDCFA,cACA,eAEA,yBAGF,sBAEE,iBACA,sNAWA,iBACE,kBACA,wRAgBA,kBAEA,iOAgBA,uCACE,uEAEA,kBAEF,qUAuBE,iDAIJ,CACA,geCxFF,4BAEE,CAQA,6JACA,iDAIA,sEAGA,mDAOF,iDAGE,4DAIA,8CACA,qDAEE,eAFF,cAEE,oBAEF,uBAFE,kCAGA,eACA,iBACA,mBAIA,mDACA,CAHA,uCAEA,CAJA,0CACA,CAIA,gBAJA,gBACA,oBADA,gBAIA,wBAEJ,gBAGE,6BACA,YAHA,iBAGA,gCACA,iEAEA,6CACA,sDACA,0BADA,wBACA,0BACA,oIAIA,mBAFA,YAEA,qBACA,0CAIE,uBAEF,CAHA,yBACE,CAEF,iDACE,mFAKJ,oCACE,CANE,aAKJ,CACE,qEAIA,YAFA,WAEA,CAHA,aACA,CAEA,gBACE,4BACA,sBADA,aACA,gCAMF,oCACA,yDACA,2CAEA,qBAGE,kBAEA,CACA,mCAIF,CARE,YACA,CAOF,iCAEE,CAPA,oBACA,CAQA,oBACE,uDAEJ,sDAGA,CAHA,cAGA,0BACE,oDAIA,oCACA,4BACA,sBAGA,cAEA,oFAGA,sBAEA,yDACE,CAIF,iBAJE,wBAIF,6CAHE,6CAKA,eACA,aACA,CADA,cACA,yCAGJ,kBACE,CAKA,iDAEA,CARF,aACE,4CAGA,kBAIA,wEAGA,wDAGA,kCAOA,iDAGA,CAPF,WAEE,sCAEA,CAJF,2CACE,CAMA,qCACA,+BARF,kBACE,qCAOA,iBAsBA,sBACE,CAvBF,WAKA,CACE,0DAIF,CALA,uDACE,CANF,sBAqBA,4CACA,CALA,gRAIA,YAEE,6CAEN,mCAEE,+CASA,6EAIA,4BChNA,SDmNA,qFCnNA,gDACA,sCAGA,qCACA,sDACA,CAKA,kDAGA,CARA,0CAQA,kBAGA,YACA,sBACA,iBAFA,gBADF,YACE,CAHA,SAKA,kBAEA,SAFA,iBAEA,uEAGA,CAEE,6CAFF,oCAgBI,CAdF,yBACE,qBACF,CAGF,oBACE,CAIF,WACE,CALA,2CAGA,uBACF,CACE,mFAGE,CALF,qBAEA,UAGE,gCAIF,sDAEA,CALE,oCAKF,yCC7CJ,oCACE,CD+CA,yXAQE,sCCrDJ,wCAGA,oCACE","sources":["webpack:///./node_modules/normalize.css/normalize.css","webpack:///./src/furo/assets/styles/base/_print.sass","webpack:///./src/furo/assets/styles/base/_screen-readers.sass","webpack:///./src/furo/assets/styles/base/_theme.sass","webpack:///./src/furo/assets/styles/variables/_fonts.scss","webpack:///./src/furo/assets/styles/variables/_spacing.scss","webpack:///./src/furo/assets/styles/variables/_icons.scss","webpack:///./src/furo/assets/styles/variables/_admonitions.scss","webpack:///./src/furo/assets/styles/variables/_colors.scss","webpack:///./src/furo/assets/styles/base/_typography.sass","webpack:///./src/furo/assets/styles/_scaffold.sass","webpack:///./src/furo/assets/styles/variables/_layout.scss","webpack:///./src/furo/assets/styles/content/_admonitions.sass","webpack:///./src/furo/assets/styles/content/_api.sass","webpack:///./src/furo/assets/styles/content/_blocks.sass","webpack:///./src/furo/assets/styles/content/_captions.sass","webpack:///./src/furo/assets/styles/content/_code.sass","webpack:///./src/furo/assets/styles/content/_footnotes.sass","webpack:///./src/furo/assets/styles/content/_images.sass","webpack:///./src/furo/assets/styles/content/_indexes.sass","webpack:///./src/furo/assets/styles/content/_lists.sass","webpack:///./src/furo/assets/styles/content/_math.sass","webpack:///./src/furo/assets/styles/content/_misc.sass","webpack:///./src/furo/assets/styles/content/_rubrics.sass","webpack:///./src/furo/assets/styles/content/_sidebar.sass","webpack:///./src/furo/assets/styles/content/_tables.sass","webpack:///./src/furo/assets/styles/content/_target.sass","webpack:///./src/furo/assets/styles/content/_gui-labels.sass","webpack:///./src/furo/assets/styles/components/_footer.sass","webpack:///./src/furo/assets/styles/components/_sidebar.sass","webpack:///./src/furo/assets/styles/components/_table_of_contents.sass","webpack:///./src/furo/assets/styles/_shame.sass"],"sourcesContent":["/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// This file contains styles for managing print media.\n\n////////////////////////////////////////////////////////////////////////////////\n// Hide elements not relevant to print media.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n // Hide icon container.\n .content-icon-container\n display: none !important\n\n // Hide showing header links if hovering over when printing.\n .headerlink\n display: none !important\n\n // Hide mobile header.\n .mobile-header\n display: none !important\n\n // Hide navigation links.\n .related-pages\n display: none !important\n\n////////////////////////////////////////////////////////////////////////////////\n// Tweaks related to decolorization.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n // Apply a border around code which no longer have a color background.\n .highlight\n border: 0.1pt solid var(--color-foreground-border)\n\n////////////////////////////////////////////////////////////////////////////////\n// Avoid page break in some relevant cases.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n ul, ol, dl, a, table, pre, blockquote\n page-break-inside: avoid\n\n h1, h2, h3, h4, h5, h6, img, figure, caption\n page-break-inside: avoid\n page-break-after: avoid\n\n ul, ol, dl\n page-break-before: avoid\n",".visually-hidden\n position: absolute !important\n width: 1px !important\n height: 1px !important\n padding: 0 !important\n margin: -1px !important\n overflow: hidden !important\n clip: rect(0,0,0,0) !important\n white-space: nowrap !important\n border: 0 !important\n color: var(--color-foreground-primary)\n background: var(--color-background-primary)\n\n:-moz-focusring\n outline: auto\n","// This file serves as the \"skeleton\" of the theming logic.\n//\n// This contains the bulk of the logic for handling dark mode, color scheme\n// toggling and the handling of color-scheme-specific hiding of elements.\n\nbody\n @include fonts\n @include spacing\n @include icons\n @include admonitions\n @include default-admonition(#651fff, \"abstract\")\n @include default-topic(#14B8A6, \"pencil\")\n\n @include colors\n\n.only-light\n display: block !important\nhtml body .only-dark\n display: none !important\n\n// Ignore dark-mode hints if print media.\n@media not print\n // Enable dark-mode, if requested.\n body[data-theme=\"dark\"]\n @include colors-dark\n\n html & .only-light\n display: none !important\n .only-dark\n display: block !important\n\n // Enable dark mode, unless explicitly told to avoid.\n @media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n @include colors-dark\n\n html & .only-light\n display: none !important\n .only-dark\n display: block !important\n\n//\n// Theme toggle presentation\n//\nbody[data-theme=\"auto\"]\n .theme-toggle svg.theme-icon-when-auto-light\n display: block\n\n @media (prefers-color-scheme: dark)\n .theme-toggle svg.theme-icon-when-auto-dark\n display: block\n .theme-toggle svg.theme-icon-when-auto-light\n display: none\n\nbody[data-theme=\"dark\"]\n .theme-toggle svg.theme-icon-when-dark\n display: block\n\nbody[data-theme=\"light\"]\n .theme-toggle svg.theme-icon-when-light\n display: block\n","// Fonts used by this theme.\n//\n// There are basically two things here -- using the system font stack and\n// defining sizes for various elements in %ages. We could have also used `em`\n// but %age is easier to reason about for me.\n\n@mixin fonts {\n // These are adapted from https://systemfontstack.com/\n --font-stack: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial,\n sans-serif, Apple Color Emoji, Segoe UI Emoji;\n --font-stack--monospace: \"SFMono-Regular\", Menlo, Consolas, Monaco,\n Liberation Mono, Lucida Console, monospace;\n --font-stack--headings: var(--font-stack);\n\n --font-size--normal: 100%;\n --font-size--small: 87.5%;\n --font-size--small--2: 81.25%;\n --font-size--small--3: 75%;\n --font-size--small--4: 62.5%;\n\n // Sidebar\n --sidebar-caption-font-size: var(--font-size--small--2);\n --sidebar-item-font-size: var(--font-size--small);\n --sidebar-search-input-font-size: var(--font-size--small);\n\n // Table of Contents\n --toc-font-size: var(--font-size--small--3);\n --toc-font-size--mobile: var(--font-size--normal);\n --toc-title-font-size: var(--font-size--small--4);\n\n // Admonitions\n //\n // These aren't defined in terms of %ages, since nesting these is permitted.\n --admonition-font-size: 0.8125rem;\n --admonition-title-font-size: 0.8125rem;\n\n // Code\n --code-font-size: var(--font-size--small--2);\n\n // API\n --api-font-size: var(--font-size--small);\n}\n","// Spacing for various elements on the page\n//\n// If the user wants to tweak things in a certain way, they are permitted to.\n// They also have to deal with the consequences though!\n\n@mixin spacing {\n // Header!\n --header-height: calc(\n var(--sidebar-item-line-height) + 4 * #{var(--sidebar-item-spacing-vertical)}\n );\n --header-padding: 0.5rem;\n\n // Sidebar\n --sidebar-tree-space-above: 1.5rem;\n --sidebar-caption-space-above: 1rem;\n\n --sidebar-item-line-height: 1rem;\n --sidebar-item-spacing-vertical: 0.5rem;\n --sidebar-item-spacing-horizontal: 1rem;\n --sidebar-item-height: calc(\n var(--sidebar-item-line-height) + 2 *#{var(--sidebar-item-spacing-vertical)}\n );\n\n --sidebar-expander-width: var(--sidebar-item-height); // be square\n\n --sidebar-search-space-above: 0.5rem;\n --sidebar-search-input-spacing-vertical: 0.5rem;\n --sidebar-search-input-spacing-horizontal: 0.5rem;\n --sidebar-search-input-height: 1rem;\n --sidebar-search-icon-size: var(--sidebar-search-input-height);\n\n // Table of Contents\n --toc-title-padding: 0.25rem 0;\n --toc-spacing-vertical: 1.5rem;\n --toc-spacing-horizontal: 1.5rem;\n --toc-item-spacing-vertical: 0.4rem;\n --toc-item-spacing-horizontal: 1rem;\n}\n","// Expose theme icons as CSS variables.\n\n$icons: (\n // Adapted from tabler-icons\n // url: https://tablericons.com/\n \"search\":\n url('data:image/svg+xml;charset=utf-8,'),\n // Factored out from mkdocs-material on 24-Aug-2020.\n // url: https://squidfunk.github.io/mkdocs-material/reference/admonitions/\n \"pencil\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"abstract\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"info\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"flame\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"question\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"warning\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"failure\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"spark\":\n url('data:image/svg+xml;charset=utf-8,')\n);\n\n@mixin icons {\n @each $name, $glyph in $icons {\n --icon-#{$name}: #{$glyph};\n }\n}\n","// Admonitions\n\n// Structure of these is:\n// admonition-class: color \"icon-name\";\n//\n// The colors are translated into CSS variables below. The icons are\n// used directly in the main declarations to set the `mask-image` in\n// the title.\n\n// prettier-ignore\n$admonitions: (\n // Each of these has an reST directives for it.\n \"caution\": #ff9100 \"spark\",\n \"warning\": #ff9100 \"warning\",\n \"danger\": #ff5252 \"spark\",\n \"attention\": #ff5252 \"warning\",\n \"error\": #ff5252 \"failure\",\n \"hint\": #00c852 \"question\",\n \"tip\": #00c852 \"info\",\n \"important\": #00bfa5 \"flame\",\n \"note\": #00b0ff \"pencil\",\n \"seealso\": #448aff \"info\",\n \"admonition-todo\": #808080 \"pencil\"\n);\n\n@mixin default-admonition($color, $icon-name) {\n --color-admonition-title: #{$color};\n --color-admonition-title-background: #{rgba($color, 0.2)};\n\n --icon-admonition-default: var(--icon-#{$icon-name});\n}\n\n@mixin default-topic($color, $icon-name) {\n --color-topic-title: #{$color};\n --color-topic-title-background: #{rgba($color, 0.2)};\n\n --icon-topic-default: var(--icon-#{$icon-name});\n}\n\n@mixin admonitions {\n @each $name, $values in $admonitions {\n --color-admonition-title--#{$name}: #{nth($values, 1)};\n --color-admonition-title-background--#{$name}: #{rgba(\n nth($values, 1),\n 0.2\n )};\n }\n}\n","// Colors used throughout this theme.\n//\n// The aim is to give the user more control. Thus, instead of hard-coding colors\n// in various parts of the stylesheet, the approach taken is to define all\n// colors as CSS variables and reusing them in all the places.\n//\n// `colors-dark` depends on `colors` being included at a lower specificity.\n\n@mixin colors {\n --color-problematic: #b30000;\n\n // Base Colors\n --color-foreground-primary: black; // for main text and headings\n --color-foreground-secondary: #5a5c63; // for secondary text\n --color-foreground-muted: #6b6f76; // for muted text\n --color-foreground-border: #878787; // for content borders\n\n --color-background-primary: white; // for content\n --color-background-secondary: #f8f9fb; // for navigation + ToC\n --color-background-hover: #efeff4ff; // for navigation-item hover\n --color-background-hover--transparent: #efeff400;\n --color-background-border: #eeebee; // for UI borders\n --color-background-item: #ccc; // for \"background\" items (eg: copybutton)\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #0a4bff;\n --color-brand-content: #2757dd;\n --color-brand-visited: #872ee0;\n\n // API documentation\n --color-api-background: var(--color-background-hover--transparent);\n --color-api-background-hover: var(--color-background-hover);\n --color-api-overall: var(--color-foreground-secondary);\n --color-api-name: var(--color-problematic);\n --color-api-pre-name: var(--color-problematic);\n --color-api-paren: var(--color-foreground-secondary);\n --color-api-keyword: var(--color-foreground-primary);\n\n --color-api-added: #21632c;\n --color-api-added-border: #38a84d;\n --color-api-changed: #046172;\n --color-api-changed-border: #06a1bc;\n --color-api-deprecated: #605706;\n --color-api-deprecated-border: #f0d90f;\n --color-api-removed: #b30000;\n --color-api-removed-border: #ff5c5c;\n\n --color-highlight-on-target: #ffffcc;\n\n // Inline code background\n --color-inline-code-background: var(--color-background-secondary);\n\n // Highlighted text (search)\n --color-highlighted-background: #ddeeff;\n --color-highlighted-text: var(--color-foreground-primary);\n\n // GUI Labels\n --color-guilabel-background: #ddeeff80;\n --color-guilabel-border: #bedaf580;\n --color-guilabel-text: var(--color-foreground-primary);\n\n // Admonitions!\n --color-admonition-background: transparent;\n\n //////////////////////////////////////////////////////////////////////////////\n // Everything below this should be one of:\n // - var(...)\n // - *-gradient(...)\n // - special literal values (eg: transparent, none)\n //////////////////////////////////////////////////////////////////////////////\n\n // Tables\n --color-table-header-background: var(--color-background-secondary);\n --color-table-border: var(--color-background-border);\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: transparent;\n --color-card-marginals-background: var(--color-background-secondary);\n\n // Header\n --color-header-background: var(--color-background-primary);\n --color-header-border: var(--color-background-border);\n --color-header-text: var(--color-foreground-primary);\n\n // Sidebar (left)\n --color-sidebar-background: var(--color-background-secondary);\n --color-sidebar-background-border: var(--color-background-border);\n\n --color-sidebar-brand-text: var(--color-foreground-primary);\n --color-sidebar-caption-text: var(--color-foreground-muted);\n --color-sidebar-link-text: var(--color-foreground-secondary);\n --color-sidebar-link-text--top-level: var(--color-brand-primary);\n\n --color-sidebar-item-background: var(--color-sidebar-background);\n --color-sidebar-item-background--current: var(\n --color-sidebar-item-background\n );\n --color-sidebar-item-background--hover: linear-gradient(\n 90deg,\n var(--color-background-hover--transparent) 0%,\n var(--color-background-hover) var(--sidebar-item-spacing-horizontal),\n var(--color-background-hover) 100%\n );\n\n --color-sidebar-item-expander-background: transparent;\n --color-sidebar-item-expander-background--hover: var(\n --color-background-hover\n );\n\n --color-sidebar-search-text: var(--color-foreground-primary);\n --color-sidebar-search-background: var(--color-background-secondary);\n --color-sidebar-search-background--focus: var(--color-background-primary);\n --color-sidebar-search-border: var(--color-background-border);\n --color-sidebar-search-icon: var(--color-foreground-muted);\n\n // Table of Contents (right)\n --color-toc-background: var(--color-background-primary);\n --color-toc-title-text: var(--color-foreground-muted);\n --color-toc-item-text: var(--color-foreground-secondary);\n --color-toc-item-text--hover: var(--color-foreground-primary);\n --color-toc-item-text--active: var(--color-brand-primary);\n\n // Actual page contents\n --color-content-foreground: var(--color-foreground-primary);\n --color-content-background: transparent;\n\n // Links\n --color-link: var(--color-brand-content);\n --color-link-underline: var(--color-background-border);\n --color-link--hover: var(--color-brand-content);\n --color-link-underline--hover: var(--color-foreground-border);\n\n --color-link--visited: var(--color-brand-visited);\n --color-link-underline--visited: var(--color-background-border);\n --color-link--visited--hover: var(--color-brand-visited);\n --color-link-underline--visited--hover: var(--color-foreground-border);\n}\n\n@mixin colors-dark {\n --color-problematic: #ee5151;\n\n // Base Colors\n --color-foreground-primary: #cfd0d0; // for main text and headings\n --color-foreground-secondary: #9ca0a5; // for secondary text\n --color-foreground-muted: #81868d; // for muted text\n --color-foreground-border: #666666; // for content borders\n\n --color-background-primary: #131416; // for content\n --color-background-secondary: #1a1c1e; // for navigation + ToC\n --color-background-hover: #1e2124ff; // for navigation-item hover\n --color-background-hover--transparent: #1e212400;\n --color-background-border: #303335; // for UI borders\n --color-background-item: #444; // for \"background\" items (eg: copybutton)\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #3d94ff;\n --color-brand-content: #5ca5ff;\n --color-brand-visited: #b27aeb;\n\n // Highlighted text (search)\n --color-highlighted-background: #083563;\n\n // GUI Labels\n --color-guilabel-background: #08356380;\n --color-guilabel-border: #13395f80;\n\n // API documentation\n --color-api-keyword: var(--color-foreground-secondary);\n --color-highlight-on-target: #333300;\n\n --color-api-added: #3db854;\n --color-api-added-border: #267334;\n --color-api-changed: #09b0ce;\n --color-api-changed-border: #056d80;\n --color-api-deprecated: #b1a10b;\n --color-api-deprecated-border: #6e6407;\n --color-api-removed: #ff7575;\n --color-api-removed-border: #b03b3b;\n\n // Admonitions\n --color-admonition-background: #18181a;\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: #18181a;\n --color-card-marginals-background: var(--color-background-hover);\n}\n","// This file contains the styling for making the content throughout the page,\n// including fonts, paragraphs, headings and spacing among these elements.\n\nbody\n font-family: var(--font-stack)\npre,\ncode,\nkbd,\nsamp\n font-family: var(--font-stack--monospace)\n\n// Make fonts look slightly nicer.\nbody\n -webkit-font-smoothing: antialiased\n -moz-osx-font-smoothing: grayscale\n\n// Line height from Bootstrap 4.1\narticle\n line-height: 1.5\n\n//\n// Headings\n//\nh1,\nh2,\nh3,\nh4,\nh5,\nh6\n line-height: 1.25\n font-family: var(--font-stack--headings)\n font-weight: bold\n\n border-radius: 0.5rem\n margin-top: 0.5rem\n margin-bottom: 0.5rem\n margin-left: -0.5rem\n margin-right: -0.5rem\n padding-left: 0.5rem\n padding-right: 0.5rem\n\n + p\n margin-top: 0\n\nh1\n font-size: 2.5em\n margin-top: 1.75rem\n margin-bottom: 1rem\nh2\n font-size: 2em\n margin-top: 1.75rem\nh3\n font-size: 1.5em\nh4\n font-size: 1.25em\nh5\n font-size: 1.125em\nh6\n font-size: 1em\n\nsmall\n opacity: 75%\n font-size: 80%\n\n// Paragraph\np\n margin-top: 0.5rem\n margin-bottom: 0.75rem\n\n// Horizontal rules\nhr.docutils\n height: 1px\n padding: 0\n margin: 2rem 0\n background-color: var(--color-background-border)\n border: 0\n\n.centered\n text-align: center\n\n// Links\na\n text-decoration: underline\n\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n &:visited\n color: var(--color-link--visited)\n text-decoration-color: var(--color-link-underline--visited)\n &:hover\n color: var(--color-link--visited--hover)\n text-decoration-color: var(--color-link-underline--visited--hover)\n\n &:hover\n color: var(--color-link--hover)\n text-decoration-color: var(--color-link-underline--hover)\n &.muted-link\n color: inherit\n &:hover\n color: var(--color-link--hover)\n text-decoration-color: var(--color-link-underline--hover)\n &:visited\n color: var(--color-link--visited--hover)\n text-decoration-color: var(--color-link-underline--visited--hover)\n","// This file contains the styles for the overall layouting of the documentation\n// skeleton, including the responsive changes as well as sidebar toggles.\n//\n// This is implemented as a mobile-last design, which isn't ideal, but it is\n// reasonably good-enough and I got pretty tired by the time I'd finished this\n// to move the rules around to fix this. Shouldn't take more than 3-4 hours,\n// if you know what you're doing tho.\n\n// HACK: Not all browsers account for the scrollbar width in media queries.\n// This results in horizontal scrollbars in the breakpoint where we go\n// from displaying everything to hiding the ToC. We accomodate for this by\n// adding a bit of padding to the TOC drawer, disabling the horizontal\n// scrollbar and allowing the scrollbars to cover the padding.\n// https://www.456bereastreet.com/archive/201301/media_query_width_and_vertical_scrollbars/\n\n// HACK: Always having the scrollbar visible, prevents certain browsers from\n// causing the content to stutter horizontally between taller-than-viewport and\n// not-taller-than-viewport pages.\n\n$icon-size: 1.25rem\n\nhtml\n overflow-x: hidden\n overflow-y: scroll\n scroll-behavior: smooth\n\n.sidebar-scroll, .toc-scroll, article[role=main] *\n // Override Firefox scrollbar style\n scrollbar-width: thin\n scrollbar-color: var(--color-foreground-border) transparent\n\n // Override Chrome scrollbar styles\n &::-webkit-scrollbar\n width: 0.25rem\n height: 0.25rem\n &::-webkit-scrollbar-thumb\n background-color: var(--color-foreground-border)\n border-radius: 0.125rem\n\n//\n// Overalls\n//\nhtml,\nbody\n height: 100%\n color: var(--color-foreground-primary)\n background: var(--color-background-primary)\n\n.skip-to-content\n position: fixed\n padding: 1rem\n border-radius: 1rem\n left: 0.25rem\n top: 0.25rem\n z-index: 40\n background: var(--color-background-primary)\n color: var(--color-foreground-primary)\n\n transform: translateY(-200%)\n transition: transform 300ms ease-in-out\n\n &:focus-within\n transform: translateY(0%)\n\narticle\n color: var(--color-content-foreground)\n background: var(--color-content-background)\n overflow-wrap: break-word\n\n.page\n display: flex\n // fill the viewport for pages with little content.\n min-height: 100%\n\n.mobile-header\n width: 100%\n height: var(--header-height)\n background-color: var(--color-header-background)\n color: var(--color-header-text)\n border-bottom: 1px solid var(--color-header-border)\n\n // Looks like sub-script/super-script have this, and we need this to\n // be \"on top\" of those.\n z-index: 10\n\n // We don't show the header on large screens.\n display: none\n\n // Add shadow when scrolled\n &.scrolled\n border-bottom: none\n box-shadow: 0 0 0.2rem rgba(0, 0, 0, 0.1), 0 0.2rem 0.4rem rgba(0, 0, 0, 0.2)\n\n .header-center\n a\n color: var(--color-header-text)\n text-decoration: none\n\n.main\n display: flex\n flex: 1\n\n// Sidebar (left) also covers the entire left portion of screen.\n.sidebar-drawer\n box-sizing: border-box\n\n border-right: 1px solid var(--color-sidebar-background-border)\n background: var(--color-sidebar-background)\n\n display: flex\n justify-content: flex-end\n // These next two lines took me two days to figure out.\n width: calc((100% - #{$full-width}) / 2 + #{$sidebar-width})\n min-width: $sidebar-width\n\n// Scroll-along sidebars\n.sidebar-container,\n.toc-drawer\n box-sizing: border-box\n width: $sidebar-width\n\n.toc-drawer\n background: var(--color-toc-background)\n // See HACK described on top of this document\n padding-right: 1rem\n\n.sidebar-sticky,\n.toc-sticky\n position: sticky\n top: 0\n height: min(100%, 100vh)\n height: 100vh\n\n display: flex\n flex-direction: column\n\n.sidebar-scroll,\n.toc-scroll\n flex-grow: 1\n flex-shrink: 1\n\n overflow: auto\n scroll-behavior: smooth\n\n// Central items.\n.content\n padding: 0 $content-padding\n width: $content-width\n\n display: flex\n flex-direction: column\n justify-content: space-between\n\n.icon\n display: inline-block\n height: 1rem\n width: 1rem\n svg\n width: 100%\n height: 100%\n\n//\n// Accommodate announcement banner\n//\n.announcement\n background-color: var(--color-announcement-background)\n color: var(--color-announcement-text)\n\n height: var(--header-height)\n display: flex\n align-items: center\n overflow-x: auto\n & + .page\n min-height: calc(100% - var(--header-height))\n\n.announcement-content\n box-sizing: border-box\n padding: 0.5rem\n min-width: 100%\n white-space: nowrap\n text-align: center\n\n a\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-announcement-text)\n\n &:hover\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-link--hover)\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for theme\n////////////////////////////////////////////////////////////////////////////////\n.no-js .theme-toggle-container // don't show theme toggle if there's no JS\n display: none\n\n.theme-toggle-container\n vertical-align: middle\n\n.theme-toggle\n cursor: pointer\n border: none\n padding: 0\n background: transparent\n\n.theme-toggle svg\n vertical-align: middle\n height: $icon-size\n width: $icon-size\n color: var(--color-foreground-primary)\n display: none\n\n.theme-toggle-header\n float: left\n padding: 1rem 0.5rem\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for elements\n////////////////////////////////////////////////////////////////////////////////\n.toc-overlay-icon, .nav-overlay-icon\n display: none\n cursor: pointer\n\n .icon\n color: var(--color-foreground-secondary)\n height: $icon-size\n width: $icon-size\n\n.toc-header-icon, .nav-overlay-icon\n // for when we set display: flex\n justify-content: center\n align-items: center\n\n.toc-content-icon\n height: 1.5rem\n width: 1.5rem\n\n.content-icon-container\n float: right\n display: flex\n margin-top: 1.5rem\n margin-left: 1rem\n margin-bottom: 1rem\n gap: 0.5rem\n\n .edit-this-page, .view-this-page\n svg\n color: inherit\n height: $icon-size\n width: $icon-size\n\n.sidebar-toggle\n position: absolute\n display: none\n// \n.sidebar-toggle[name=\"__toc\"]\n left: 20px\n.sidebar-toggle:checked\n left: 40px\n// \n\n.overlay\n position: fixed\n top: 0\n width: 0\n height: 0\n\n transition: width 0ms, height 0ms, opacity 250ms ease-out\n\n opacity: 0\n background-color: rgba(0, 0, 0, 0.54)\n.sidebar-overlay\n z-index: 20\n.toc-overlay\n z-index: 40\n\n// Keep things on top and smooth.\n.sidebar-drawer\n z-index: 30\n transition: left 250ms ease-in-out\n.toc-drawer\n z-index: 50\n transition: right 250ms ease-in-out\n\n// Show the Sidebar\n#__navigation:checked\n & ~ .sidebar-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .sidebar-drawer\n top: 0\n left: 0\n // Show the toc sidebar\n#__toc:checked\n & ~ .toc-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .toc-drawer\n top: 0\n right: 0\n\n////////////////////////////////////////////////////////////////////////////////\n// Back to top\n////////////////////////////////////////////////////////////////////////////////\n.back-to-top\n text-decoration: none\n\n display: none\n position: fixed\n left: 0\n top: 1rem\n padding: 0.5rem\n padding-right: 0.75rem\n border-radius: 1rem\n font-size: 0.8125rem\n\n background: var(--color-background-primary)\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), #6b728080 0px 0px 1px 0px\n\n z-index: 10\n\n margin-left: 50%\n transform: translateX(-50%)\n svg\n height: 1rem\n width: 1rem\n fill: currentColor\n display: inline-block\n\n span\n margin-left: 0.25rem\n\n .show-back-to-top &\n display: flex\n align-items: center\n\n////////////////////////////////////////////////////////////////////////////////\n// Responsive layouting\n////////////////////////////////////////////////////////////////////////////////\n// Make things a bit bigger on bigger screens.\n@media (min-width: $full-width + $sidebar-width)\n html\n font-size: 110%\n\n@media (max-width: $full-width)\n // Collapse \"toc\" into the icon.\n .toc-content-icon\n display: flex\n .toc-drawer\n position: fixed\n height: 100vh\n top: 0\n right: -$sidebar-width\n border-left: 1px solid var(--color-background-muted)\n .toc-tree\n border-left: none\n font-size: var(--toc-font-size--mobile)\n\n // Accomodate for a changed content width.\n .sidebar-drawer\n width: calc((100% - #{$full-width - $sidebar-width}) / 2 + #{$sidebar-width})\n\n@media (max-width: $full-width - $sidebar-width)\n // Collapse \"navigation\".\n .nav-overlay-icon\n display: flex\n .sidebar-drawer\n position: fixed\n height: 100vh\n width: $sidebar-width\n\n top: 0\n left: -$sidebar-width\n\n // Swap which icon is visible.\n .toc-header-icon\n display: flex\n .toc-content-icon, .theme-toggle-content\n display: none\n .theme-toggle-header\n display: block\n\n // Show the header.\n .mobile-header\n position: sticky\n top: 0\n display: flex\n justify-content: space-between\n align-items: center\n\n .header-left,\n .header-right\n display: flex\n height: var(--header-height)\n padding: 0 var(--header-padding)\n label\n height: 100%\n width: 100%\n user-select: none\n\n .nav-overlay-icon .icon,\n .theme-toggle svg\n height: $icon-size\n width: $icon-size\n\n // Add a scroll margin for the content\n :target\n scroll-margin-top: calc(var(--header-height) + 2.5rem)\n\n // Show back-to-top below the header\n .back-to-top\n top: calc(var(--header-height) + 0.5rem)\n\n // Center the page, and accommodate for the header.\n .page\n flex-direction: column\n justify-content: center\n .content\n margin-left: auto\n margin-right: auto\n\n@media (max-width: $content-width + 2* $content-padding)\n // Content should respect window limits.\n .content\n width: 100%\n overflow-x: auto\n\n@media (max-width: $content-width)\n .content\n padding: 0 $content-padding--small\n // Don't float sidebars to the right.\n article aside.sidebar\n float: none\n width: 100%\n margin: 1rem 0\n","// Overall Layout Variables\n//\n// Because CSS variables can't be used in media queries. The fact that this\n// makes the layout non-user-configurable is a good thing.\n$content-padding: 3em;\n$content-padding--small: 1em;\n$content-width: 46em;\n$sidebar-width: 15em;\n$full-width: $content-width + 2 * ($content-padding + $sidebar-width);\n","//\n// The design here is strongly inspired by mkdocs-material.\n.admonition, .topic\n margin: 1rem auto\n padding: 0 0.5rem 0.5rem 0.5rem\n\n background: var(--color-admonition-background)\n\n border-radius: 0.2rem\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n font-size: var(--admonition-font-size)\n\n overflow: hidden\n page-break-inside: avoid\n\n // First element should have no margin, since the title has it.\n > :nth-child(2)\n margin-top: 0\n\n // Last item should have no margin, since we'll control that w/ padding\n > :last-child\n margin-bottom: 0\n\n.admonition p.admonition-title,\np.topic-title\n position: relative\n margin: 0 -0.5rem 0.5rem\n padding-left: 2rem\n padding-right: .5rem\n padding-top: .4rem\n padding-bottom: .4rem\n\n font-weight: 500\n font-size: var(--admonition-title-font-size)\n line-height: 1.3\n\n // Our fancy icon\n &::before\n content: \"\"\n position: absolute\n left: 0.5rem\n width: 1rem\n height: 1rem\n\n// Default styles\np.admonition-title\n background-color: var(--color-admonition-title-background)\n &::before\n background-color: var(--color-admonition-title)\n mask-image: var(--icon-admonition-default)\n mask-repeat: no-repeat\n\np.topic-title\n background-color: var(--color-topic-title-background)\n &::before\n background-color: var(--color-topic-title)\n mask-image: var(--icon-topic-default)\n mask-repeat: no-repeat\n\n//\n// Variants\n//\n.admonition\n border-left: 0.2rem solid var(--color-admonition-title)\n\n @each $type, $value in $admonitions\n &.#{$type}\n border-left-color: var(--color-admonition-title--#{$type})\n > .admonition-title\n background-color: var(--color-admonition-title-background--#{$type})\n &::before\n background-color: var(--color-admonition-title--#{$type})\n mask-image: var(--icon-#{nth($value, 2)})\n\n.admonition-todo > .admonition-title\n text-transform: uppercase\n","// This file stylizes the API documentation (stuff generated by autodoc). It's\n// deeply nested due to how autodoc structures the HTML without enough classes\n// to select the relevant items.\n\n// API docs!\ndl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)\n // Tweak the spacing of all the things!\n dd\n margin-left: 2rem\n > :first-child\n margin-top: 0.125rem\n > :last-child\n margin-bottom: 0.75rem\n\n // This is used for the arguments\n .field-list\n margin-bottom: 0.75rem\n\n // \"Headings\" (like \"Parameters\" and \"Return\")\n > dt\n text-transform: uppercase\n font-size: var(--font-size--small)\n\n dd:empty\n margin-bottom: 0.5rem\n dd > ul\n margin-left: -1.2rem\n > li\n > p:nth-child(2)\n margin-top: 0\n // When the last-empty-paragraph follows a paragraph, it doesn't need\n // to augument the existing spacing.\n > p + p:last-child:empty\n margin-top: 0\n margin-bottom: 0\n\n // Colorize the elements\n > dt\n color: var(--color-api-overall)\n\n.sig:not(.sig-inline)\n font-weight: bold\n\n font-size: var(--api-font-size)\n font-family: var(--font-stack--monospace)\n\n margin-left: -0.25rem\n margin-right: -0.25rem\n padding-top: 0.25rem\n padding-bottom: 0.25rem\n padding-right: 0.5rem\n\n // These are intentionally em, to properly match the font size.\n padding-left: 3em\n text-indent: -2.5em\n\n border-radius: 0.25rem\n\n background: var(--color-api-background)\n transition: background 100ms ease-out\n\n &:hover\n background: var(--color-api-background-hover)\n\n // adjust the size of the [source] link on the right.\n a.reference\n .viewcode-link\n font-weight: normal\n width: 4.25rem\n\nem.property\n font-style: normal\n &:first-child\n color: var(--color-api-keyword)\n.sig-name\n color: var(--color-api-name)\n.sig-prename\n font-weight: normal\n color: var(--color-api-pre-name)\n.sig-paren\n color: var(--color-api-paren)\n.sig-param\n font-style: normal\n\ndiv.versionadded,\ndiv.versionchanged,\ndiv.deprecated,\ndiv.versionremoved\n border-left: 0.1875rem solid\n border-radius: 0.125rem\n\n padding-left: 0.75rem\n\n p\n margin-top: 0.125rem\n margin-bottom: 0.125rem\n\ndiv.versionadded\n border-color: var(--color-api-added-border)\n .versionmodified\n color: var(--color-api-added)\n\ndiv.versionchanged\n border-color: var(--color-api-changed-border)\n .versionmodified\n color: var(--color-api-changed)\n\ndiv.deprecated\n border-color: var(--color-api-deprecated-border)\n .versionmodified\n color: var(--color-api-deprecated)\n\ndiv.versionremoved\n border-color: var(--color-api-removed-border)\n .versionmodified\n color: var(--color-api-removed)\n\n// Align the [docs] and [source] to the right.\n.viewcode-link, .viewcode-back\n float: right\n text-align: right\n",".line-block\n margin-top: 0.5rem\n margin-bottom: 0.75rem\n .line-block\n margin-top: 0rem\n margin-bottom: 0rem\n padding-left: 1rem\n","// Captions\narticle p.caption,\ntable > caption,\n.code-block-caption\n font-size: var(--font-size--small)\n text-align: center\n\n// Caption above a TOCTree\n.toctree-wrapper.compound\n .caption, :not(.caption) > .caption-text\n font-size: var(--font-size--small)\n text-transform: uppercase\n\n text-align: initial\n margin-bottom: 0\n\n > ul\n margin-top: 0\n margin-bottom: 0\n","// Inline code\ncode.literal, .sig-inline\n background: var(--color-inline-code-background)\n border-radius: 0.2em\n // Make the font smaller, and use padding to recover.\n font-size: var(--font-size--small--2)\n padding: 0.1em 0.2em\n\n pre.literal-block &\n font-size: inherit\n padding: 0\n\n p &\n border: 1px solid var(--color-background-border)\n\n.sig-inline\n font-family: var(--font-stack--monospace)\n\n// Code and Literal Blocks\n$code-spacing-vertical: 0.625rem\n$code-spacing-horizontal: 0.875rem\n\n// Wraps every literal block + line numbers.\ndiv[class*=\" highlight-\"],\ndiv[class^=\"highlight-\"]\n margin: 1em 0\n display: flex\n\n .table-wrapper\n margin: 0\n padding: 0\n\npre\n margin: 0\n padding: 0\n overflow: auto\n\n // Needed to have more specificity than pygments' \"pre\" selector. :(\n article[role=\"main\"] .highlight &\n line-height: 1.5\n\n &.literal-block,\n .highlight &\n font-size: var(--code-font-size)\n padding: $code-spacing-vertical $code-spacing-horizontal\n\n // Make it look like all the other blocks.\n &.literal-block\n margin-top: 1rem\n margin-bottom: 1rem\n\n border-radius: 0.2rem\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n\n// All code is always contained in this.\n.highlight\n width: 100%\n border-radius: 0.2rem\n\n // Make line numbers and prompts un-selectable.\n .gp, span.linenos\n user-select: none\n pointer-events: none\n\n // Expand the line-highlighting.\n .hll\n display: block\n margin-left: -$code-spacing-horizontal\n margin-right: -$code-spacing-horizontal\n padding-left: $code-spacing-horizontal\n padding-right: $code-spacing-horizontal\n\n/* Make code block captions be nicely integrated */\n.code-block-caption\n display: flex\n padding: $code-spacing-vertical $code-spacing-horizontal\n\n border-radius: 0.25rem\n border-bottom-left-radius: 0\n border-bottom-right-radius: 0\n font-weight: 300\n border-bottom: 1px solid\n\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n border-color: var(--color-background-border)\n\n + div[class]\n margin-top: 0\n pre\n border-top-left-radius: 0\n border-top-right-radius: 0\n\n// When `html_codeblock_linenos_style` is table.\n.highlighttable\n width: 100%\n display: block\n tbody\n display: block\n\n tr\n display: flex\n\n // Line numbers\n td.linenos\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n padding: $code-spacing-vertical $code-spacing-horizontal\n padding-right: 0\n border-top-left-radius: 0.2rem\n border-bottom-left-radius: 0.2rem\n\n .linenodiv\n padding-right: $code-spacing-horizontal\n font-size: var(--code-font-size)\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n\n // Actual code\n td.code\n padding: 0\n display: block\n flex: 1\n overflow: hidden\n\n .highlight\n border-top-left-radius: 0\n border-bottom-left-radius: 0\n\n// When `html_codeblock_linenos_style` is inline.\n.highlight\n span.linenos\n display: inline-block\n padding-left: 0\n padding-right: $code-spacing-horizontal\n margin-right: $code-spacing-horizontal\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n","// Inline Footnote Reference\n.footnote-reference\n font-size: var(--font-size--small--4)\n vertical-align: super\n\n// Definition list, listing the content of each note.\n// docutils <= 0.17\ndl.footnote.brackets\n font-size: var(--font-size--small)\n color: var(--color-foreground-secondary)\n\n display: grid\n grid-template-columns: max-content auto\n dt\n margin: 0\n > .fn-backref\n margin-left: 0.25rem\n\n &:after\n content: \":\"\n\n .brackets\n &:before\n content: \"[\"\n &:after\n content: \"]\"\n\n dd\n margin: 0\n padding: 0 1rem\n\n// docutils >= 0.18\naside.footnote\n font-size: var(--font-size--small)\n color: var(--color-foreground-secondary)\n\naside.footnote > span,\ndiv.citation > span\n float: left\n font-weight: 500\n padding-right: 0.25rem\n\naside.footnote > *:not(span),\ndiv.citation > p\n margin-left: 2rem\n","//\n// Figures\n//\nimg\n box-sizing: border-box\n max-width: 100%\n height: auto\n\narticle\n figure, .figure\n border-radius: 0.2rem\n\n margin: 0\n :last-child\n margin-bottom: 0\n\n .align-left\n float: left\n clear: left\n margin: 0 1rem 1rem\n\n .align-right\n float: right\n clear: right\n margin: 0 1rem 1rem\n\n .align-default,\n .align-center\n display: block\n text-align: center\n margin-left: auto\n margin-right: auto\n\n // WELL, table needs to be stylised like a table.\n table.align-default\n display: table\n text-align: initial\n",".genindex-jumpbox, .domainindex-jumpbox\n border-top: 1px solid var(--color-background-border)\n border-bottom: 1px solid var(--color-background-border)\n padding: 0.25rem\n\n.genindex-section, .domainindex-section\n h2\n margin-top: 0.75rem\n margin-bottom: 0.5rem\n ul\n margin-top: 0\n margin-bottom: 0\n","ul,\nol\n padding-left: 1.2rem\n\n // Space lists out like paragraphs\n margin-top: 1rem\n margin-bottom: 1rem\n // reduce margins within li.\n li\n > p:first-child\n margin-top: 0.25rem\n margin-bottom: 0.25rem\n\n > p:last-child\n margin-top: 0.25rem\n\n > ul,\n > ol\n margin-top: 0.5rem\n margin-bottom: 0.5rem\n\nol\n &.arabic\n list-style: decimal\n &.loweralpha\n list-style: lower-alpha\n &.upperalpha\n list-style: upper-alpha\n &.lowerroman\n list-style: lower-roman\n &.upperroman\n list-style: upper-roman\n\n// Don't space lists out when they're \"simple\" or in a `.. toctree::`\n.simple,\n.toctree-wrapper\n li\n > ul,\n > ol\n margin-top: 0\n margin-bottom: 0\n\n// Definition Lists\n.field-list,\n.option-list,\ndl:not([class]),\ndl.simple,\ndl.footnote,\ndl.glossary\n dt\n font-weight: 500\n margin-top: 0.25rem\n + dt\n margin-top: 0\n\n .classifier::before\n content: \":\"\n margin-left: 0.2rem\n margin-right: 0.2rem\n\n dd\n > p:first-child,\n ul\n margin-top: 0.125rem\n\n ul\n margin-bottom: 0.125rem\n",".math-wrapper\n width: 100%\n overflow-x: auto\n\ndiv.math\n position: relative\n text-align: center\n\n .headerlink,\n &:focus .headerlink\n display: none\n\n &:hover .headerlink\n display: inline-block\n\n span.eqno\n position: absolute\n right: 0.5rem\n top: 50%\n transform: translate(0, -50%)\n z-index: 1\n","// Abbreviations\nabbr[title]\n cursor: help\n\n// \"Problematic\" content, as identified by Sphinx\n.problematic\n color: var(--color-problematic)\n\n// Keyboard / Mouse \"instructions\"\nkbd:not(.compound)\n margin: 0 0.2rem\n padding: 0 0.2rem\n border-radius: 0.2rem\n border: 1px solid var(--color-foreground-border)\n color: var(--color-foreground-primary)\n vertical-align: text-bottom\n\n font-size: var(--font-size--small--3)\n display: inline-block\n\n box-shadow: 0 0.0625rem 0 rgba(0, 0, 0, 0.2), inset 0 0 0 0.125rem var(--color-background-primary)\n\n background-color: var(--color-background-secondary)\n\n// Blockquote\nblockquote\n border-left: 4px solid var(--color-background-border)\n background: var(--color-background-secondary)\n\n margin-left: 0\n margin-right: 0\n padding: 0.5rem 1rem\n\n .attribution\n font-weight: 600\n text-align: right\n\n &.pull-quote,\n &.highlights\n font-size: 1.25em\n\n &.epigraph,\n &.pull-quote\n border-left-width: 0\n border-radius: 0.5rem\n\n &.highlights\n border-left-width: 0\n background: transparent\n\n// Center align embedded-in-text images\np .reference img\n vertical-align: middle\n","p.rubric\n line-height: 1.25\n font-weight: bold\n font-size: 1.125em\n\n // For Numpy-style documentation that's got rubrics within it.\n // https://github.com/pradyunsg/furo/discussions/505\n dd &\n line-height: inherit\n font-weight: inherit\n\n font-size: var(--font-size--small)\n text-transform: uppercase\n","article .sidebar\n float: right\n clear: right\n width: 30%\n\n margin-left: 1rem\n margin-right: 0\n\n border-radius: 0.2rem\n background-color: var(--color-background-secondary)\n border: var(--color-background-border) 1px solid\n\n > *\n padding-left: 1rem\n padding-right: 1rem\n\n > ul, > ol // lists need additional padding, because bullets.\n padding-left: 2.2rem\n\n .sidebar-title\n margin: 0\n padding: 0.5rem 1rem\n border-bottom: var(--color-background-border) 1px solid\n\n font-weight: 500\n\n// TODO: subtitle\n// TODO: dedicated variables?\n",".table-wrapper\n width: 100%\n overflow-x: auto\n margin-top: 1rem\n margin-bottom: 0.5rem\n padding: 0.2rem 0.2rem 0.75rem\n\ntable.docutils\n border-radius: 0.2rem\n border-spacing: 0\n border-collapse: collapse\n\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n th\n background: var(--color-table-header-background)\n\n td,\n th\n // Space things out properly\n padding: 0 0.25rem\n\n // Get the borders looking just-right.\n border-left: 1px solid var(--color-table-border)\n border-right: 1px solid var(--color-table-border)\n border-bottom: 1px solid var(--color-table-border)\n\n p\n margin: 0.25rem\n\n &:first-child\n border-left: none\n &:last-child\n border-right: none\n\n // MyST-parser tables set these classes for control of column alignment\n &.text-left\n text-align: left\n &.text-right\n text-align: right\n &.text-center\n text-align: center\n",":target\n scroll-margin-top: 2.5rem\n\n@media (max-width: $full-width - $sidebar-width)\n :target\n scroll-margin-top: calc(2.5rem + var(--header-height))\n\n // When a heading is selected\n section > span:target\n scroll-margin-top: calc(2.8rem + var(--header-height))\n\n// Permalinks\n.headerlink\n font-weight: 100\n user-select: none\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\ndl dt,\np.caption,\nfigcaption p,\ntable > caption,\n.code-block-caption\n > .headerlink\n margin-left: 0.5rem\n visibility: hidden\n &:hover > .headerlink\n visibility: visible\n\n // Don't change to link-like, if someone adds the contents directive.\n > .toc-backref\n color: inherit\n text-decoration-line: none\n\n// Figure and table captions are special.\nfigure:hover > figcaption > p > .headerlink,\ntable:hover > caption > .headerlink\n visibility: visible\n\n:target >, // Regular section[id] style anchors\nspan:target ~ // Non-regular span[id] style \"extra\" anchors\n h1,\n h2,\n h3,\n h4,\n h5,\n h6\n &:nth-of-type(1)\n background-color: var(--color-highlight-on-target)\n // .headerlink\n // visibility: visible\n code.literal\n background-color: transparent\n\ntable:target > caption,\nfigure:target\n background-color: var(--color-highlight-on-target)\n\n// Inline page contents\n.this-will-duplicate-information-and-it-is-still-useful-here li :target\n background-color: var(--color-highlight-on-target)\n\n// Code block permalinks\n.literal-block-wrapper:target .code-block-caption\n background-color: var(--color-highlight-on-target)\n\n// When a definition list item is selected\n//\n// There isn't really an alternative to !important here, due to the\n// high-specificity of API documentation's selector.\ndt:target\n background-color: var(--color-highlight-on-target) !important\n\n// When a footnote reference is selected\n.footnote > dt:target + dd,\n.footnote-reference:target\n background-color: var(--color-highlight-on-target)\n",".guilabel\n background-color: var(--color-guilabel-background)\n border: 1px solid var(--color-guilabel-border)\n color: var(--color-guilabel-text)\n\n padding: 0 0.3em\n border-radius: 0.5em\n font-size: 0.9em\n","// This file contains the styles used for stylizing the footer that's shown\n// below the content.\n\nfooter\n font-size: var(--font-size--small)\n display: flex\n flex-direction: column\n\n margin-top: 2rem\n\n// Bottom of page information\n.bottom-of-page\n display: flex\n align-items: center\n justify-content: space-between\n\n margin-top: 1rem\n padding-top: 1rem\n padding-bottom: 1rem\n\n color: var(--color-foreground-secondary)\n border-top: 1px solid var(--color-background-border)\n\n line-height: 1.5\n\n @media (max-width: $content-width)\n text-align: center\n flex-direction: column-reverse\n gap: 0.25rem\n\n .left-details\n font-size: var(--font-size--small)\n\n .right-details\n display: flex\n flex-direction: column\n gap: 0.25rem\n text-align: right\n\n .icons\n display: flex\n justify-content: flex-end\n gap: 0.25rem\n font-size: 1rem\n\n a\n text-decoration: none\n\n svg,\n img\n font-size: 1.125rem\n height: 1em\n width: 1em\n\n// Next/Prev page information\n.related-pages\n a\n display: flex\n align-items: center\n\n text-decoration: none\n &:hover .page-info .title\n text-decoration: underline\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n svg.furo-related-icon,\n svg.furo-related-icon > use\n flex-shrink: 0\n\n color: var(--color-foreground-border)\n\n width: 0.75rem\n height: 0.75rem\n margin: 0 0.5rem\n\n &.next-page\n max-width: 50%\n\n float: right\n clear: right\n text-align: right\n\n &.prev-page\n max-width: 50%\n\n float: left\n clear: left\n\n svg\n transform: rotate(180deg)\n\n.page-info\n display: flex\n flex-direction: column\n overflow-wrap: anywhere\n\n .next-page &\n align-items: flex-end\n\n .context\n display: flex\n align-items: center\n\n padding-bottom: 0.1rem\n\n color: var(--color-foreground-muted)\n font-size: var(--font-size--small)\n text-decoration: none\n","// This file contains the styles for the contents of the left sidebar, which\n// contains the navigation tree, logo, search etc.\n\n////////////////////////////////////////////////////////////////////////////////\n// Brand on top of the scrollable tree.\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-brand\n display: flex\n flex-direction: column\n flex-shrink: 0\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n text-decoration: none\n\n.sidebar-brand-text\n color: var(--color-sidebar-brand-text)\n overflow-wrap: break-word\n margin: var(--sidebar-item-spacing-vertical) 0\n font-size: 1.5rem\n\n.sidebar-logo-container\n margin: var(--sidebar-item-spacing-vertical) 0\n\n.sidebar-logo\n margin: 0 auto\n display: block\n max-width: 100%\n\n////////////////////////////////////////////////////////////////////////////////\n// Search\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-search-container\n display: flex\n align-items: center\n margin-top: var(--sidebar-search-space-above)\n\n position: relative\n\n background: var(--color-sidebar-search-background)\n &:hover,\n &:focus-within\n background: var(--color-sidebar-search-background--focus)\n\n &::before\n content: \"\"\n position: absolute\n left: var(--sidebar-item-spacing-horizontal)\n width: var(--sidebar-search-icon-size)\n height: var(--sidebar-search-icon-size)\n\n background-color: var(--color-sidebar-search-icon)\n mask-image: var(--icon-search)\n\n.sidebar-search\n box-sizing: border-box\n\n border: none\n border-top: 1px solid var(--color-sidebar-search-border)\n border-bottom: 1px solid var(--color-sidebar-search-border)\n\n padding-top: var(--sidebar-search-input-spacing-vertical)\n padding-bottom: var(--sidebar-search-input-spacing-vertical)\n padding-right: var(--sidebar-search-input-spacing-horizontal)\n padding-left: calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size))\n\n width: 100%\n\n color: var(--color-sidebar-search-foreground)\n background: transparent\n z-index: 10\n\n &:focus\n outline: none\n\n &::placeholder\n font-size: var(--sidebar-search-input-font-size)\n\n//\n// Hide Search Matches link\n//\n#searchbox .highlight-link\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0\n margin: 0\n text-align: center\n\n a\n color: var(--color-sidebar-search-icon)\n font-size: var(--font-size--small--2)\n\n////////////////////////////////////////////////////////////////////////////////\n// Structure/Skeleton of the navigation tree (left)\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-tree\n font-size: var(--sidebar-item-font-size)\n margin-top: var(--sidebar-tree-space-above)\n margin-bottom: var(--sidebar-item-spacing-vertical)\n\n ul\n padding: 0\n margin-top: 0\n margin-bottom: 0\n\n display: flex\n flex-direction: column\n\n list-style: none\n\n li\n position: relative\n margin: 0\n\n > ul\n margin-left: var(--sidebar-item-spacing-horizontal)\n\n .icon\n color: var(--color-sidebar-link-text)\n\n .reference\n box-sizing: border-box\n color: var(--color-sidebar-link-text)\n\n // Fill the parent.\n display: inline-block\n line-height: var(--sidebar-item-line-height)\n text-decoration: none\n\n // Don't allow long words to cause wrapping.\n overflow-wrap: anywhere\n\n height: 100%\n width: 100%\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n &:hover\n color: var(--color-sidebar-link-text)\n background: var(--color-sidebar-item-background--hover)\n\n // Add a nice little \"external-link\" arrow here.\n &.external::after\n content: url('data:image/svg+xml,')\n margin: 0 0.25rem\n vertical-align: middle\n color: var(--color-sidebar-link-text)\n\n // Make the current page reference bold.\n .current-page > .reference\n font-weight: bold\n\n label\n position: absolute\n top: 0\n right: 0\n height: var(--sidebar-item-height)\n width: var(--sidebar-expander-width)\n\n cursor: pointer\n user-select: none\n\n display: flex\n justify-content: center\n align-items: center\n\n .caption, :not(.caption) > .caption-text\n font-size: var(--sidebar-caption-font-size)\n color: var(--color-sidebar-caption-text)\n\n font-weight: bold\n text-transform: uppercase\n\n margin: var(--sidebar-caption-space-above) 0 0 0\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n // If it has children, add a bit more padding to wrap the content to avoid\n // overlapping with the